Жизненный цикл JSF 2.0 ViewScoped - PullRequest
       0

Жизненный цикл JSF 2.0 ViewScoped

3 голосов
/ 02 августа 2011

Моя проблема в том, что один из моих компонентов ViewScoped создается несколько раз в одном и том же виде. Конструктор ViewScopedBean создается каждый раз, когда я выбираю узел в дереве.

<h:form>
    <p:tree value="#{treeBean.root}" var="node"  
        selectionMode="single" selection="#{viewScopedBean.selectedNode}">  
        <p:ajax event="select" update="selectedNode, treeBeanUpdate, otherBeanUpdate, panel" listener="#{treeBean.onNodeSelect}" /> 
        <p:treeNode>  
            <h:outputText value="#{node}" />  
        </p:treeNode>  
    </p:tree>  
    Selected Node: <h:outputText value="#{viewScopedBean.selectedNode}" id="selectedNode"/><br/>
    Current TreeBean: <h:outputText value="#{treeBean}" id="treeBeanUpdate"/><br/>
    Current OtherBean: <h:outputText value="#{viewScopedBean}" id="otherBeanUpdate"/><br/>
    <p:outputPanel id="panel">
        <ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
    </p:outputPanel>
</h:form>

Если я удаляю эту часть (ссылка на составной компонент), конструктор ViewScopedBean не вызывается:

    <p:outputPanel id="panel">
        <ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
    </p:outputPanel>

Все используемые бобы установлены как @ViewScoped.

@ManagedBean
@ViewScoped
public class ViewScopedBean implements Serializable {

    private TreeNode selectedNode;
    private ProfileBean profileBean;

    public ViewScopedBean() {
        System.out.println("Constructor of ViewScopedBean " + this);
    }

    @PostConstruct
    public void init() {
        System.out.println("ViewScoped init" + this);
        profileBean = new ProfileBean();
    }
}

Это правильное поведение? Если нет, то чем это может быть вызвано?

Обновление: я пытался использовать пустой композит, и у меня та же проблема.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:composite="http://java.sun.com/jsf/composite">

      <composite:interface>
            <composite:attribute name="managedBean" required="true"/>
      </composite:interface>

      <composite:implementation>
      </composite:implementation>

</html>

Но если я сделал managedBean не обязательным, это нормально.

Еще одна вещь, которую я не понимаю, - когда вызывается конструктор, кажется, что созданный объект не используется.

Инициирование представления (вывод на консоль):

Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4e1d2b8e

2 клика по дереву:

Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4eb64f2e
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@66863941

Затем я открываю окно отладки <ui:debug/>, viewScopedBean устанавливается на xxx.bean.ViewScopedBean@4e1d2b8e

1 Ответ

1 голос
/ 02 августа 2011

Bean-объект вида будет создаваться заново при каждом запросе из одного и того же представления, когда вы используете JSTL-теги, такие как <c:if>, <c:forEach> и т. Д. В представлении, или когда вы связываете компонент JSF как свойствоbean-объекта вида с использованием атрибута binding.Это, очевидно, то, что происходит в вашем составном компоненте.

Вам нужно переписать ваш составной компонент так, чтобы он не использовал какие-либо теги JSTL.Привязки некоторых JSF-компонентов в качестве свойства bean-компонента также можно избежать многими способами, но если это действительно невозможно избежать, то отключение частичного сохранения состояния в web.xml должно работать в большинстве случаев:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

Если это не работает для вас, тогда вам действительно нужно поделиться с нами кодом реализации составного компонента, чтобы мы могли указать на предостережения и предложить правильные подходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...