2015-05-08 1 views
3

Использование Primefaces 5.0 JSF 2.2.7, развернутого на EAP 6.1.@ViewScoped @PostContruct вызывается при каждом запросе ajax

У меня этот Управляемый Бин ниже.

import hh.bean.Service; 
import hh.dao.ServiceDao; 
import hh.dao.impl.ServiceDaoImpl; 

import java.io.Serializable; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class View1 implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private ServiceDao serviceDao = new ServiceDaoImpl(); 

    @PostConstruct 
    public void init() { 
     System.out.println(View1.class.getName() + ": init() " + this); 
    } 

    public List<Service> getServices(){ 
     return serviceDao.getAllServices(); 
    } 
} 

Я называю это из xhtml ниже.

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <title>Home Web</title> 
    <f:facet name="first"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
     <meta http-equiv="Content-Type" 
      content="text/html; charset=UTF-8" /> 
     <meta name="viewport" 
      content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0" /> 
     <meta name="apple-mobile-web-app-capable" content="yes" /> 
    </f:facet> 
</h:head> 

<h:body> 
    <h:outputStylesheet library="css" name="newcss.css" /> 
    <p:dataTable var="service" value="#{view1.services}"> 
     <p:column style="width:16px"> 
      <p:rowToggler /> 
     </p:column> 
     <p:column headerText="Id"> 
      <h:outputText value="#{service.id}" /> 
     </p:column> 

     <p:column headerText="xxxx"> 
      <h:outputText value="#{service.description}" /> 
     </p:column> 

     <p:rowExpansion> 
      <p:dataTable var="sv" value="#{view1.services}"> 
       <p:column headerText="Id"> 
        <h:outputText value="#{sv.id}" /> 
       </p:column> 
      </p:dataTable> 
     </p:rowExpansion> 
    </p:dataTable> 
</h:body> 
</html> 

я заметил, каждый раз, когда я расширяю строку мой init() будет вызываться. Я думал, что @ViewScoped живет, когда запрос остается на той же странице.

Когда я переключаюсь на @SessionScoped, init() не вызывается, когда я расширяю строку.

Edit 1: Поместите все в XHTML, указать JSF версия/осущ

Edit 2: исправил проблемы, окружая p:dataTable с h:form. Не знаете, почему это исправлено ...

+0

Код выглядит нормально. Какой JSF имп/версия? И разве это XHTML действительно все, что у вас есть в h: body? – BalusC

+0

@BalusC Я обновил свой пост, чтобы включить весь XHTML, и я использую JSF 2.2.7 – HDoan

+0

Извините, что трачу все время. Я исправил его, окружая 'p: dataTable'' h: form'. Но я не знаю, почему это задумалось. – HDoan

ответ

6

Исправлены ошибки при использовании p: dataTable с h: формой. Не знаю, почему, что установил его ...

Представление состояния JSF поддерживается javax.faces.ViewState скрытом поле ввода <h:form>. Если вы не используете <h:form>, то PrimeFaces не сможет найти это скрытое поле ввода, чтобы передать его значение вместе с запросом jQuery ajax.

Если эта информация отсутствует в запросе (ajax), то JSF просто создаст совершенно новый вид и, по существу, также будет вид связанных с ним бобов.