У меня есть приложение JSF, которое состоит из двух JSP: login.jsp & main.jsp.
У меня есть следующие face-config.xml:
<lifecycle>
<phase-listener>package.programs.scorecard.beans.EventBean</phase-listener>
</lifecycle>
<managed-bean>
<managed-bean-name>FormBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.FormBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>DataBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.DataBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>EventBean</managed-bean-name>
<managed-bean-class>package.programs.scorecard.beans.EventBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
И следующий web.xml:
<welcome-file-list>
<welcome-file>faces/login.jsp</welcome-file>
<welcome-file>faces/index.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
У меня есть несколько компонентов в login.jsp, которые обновляют свойства в DataBean по щелчку команды Link. После успешного завершения пользователь переходит на /main.jsp.
Я замечаю, что когда я нажимаю на commandLink, метод выполняется ДО обновления бина. Это приводит к тому, что все свойства моего компонента становятся нулевыми, когда метод выполняется, потому что значения из моей формы не применяются к компоненту.
Из того, что я понял о жизненном цикле JSF, «Обновление значений модели» всегда следует выполнять перед «Вызовом приложения», если не указано «немедленное = истина», что не относится к моей commandLink.
Этим утром я пытался отладить это пару часов, и я приветствую любые предложения или идеи.
UPDATE :
Я тщательно исследовал эту проблему и пришел к выводу, что в раскрывающемся компоненте, который я использовал, есть ошибка, которая должна быть исправлена в следующем выпуске. Мое решение состояло в том, чтобы использовать обычный h: selectOneMenu вместо стороннего компонента, и он работает как шарм:
<h:selectOneMenu id="ddlManager" value="#{DataBean.managerId}">
<f:selectItems value="#{DataBean.managerList}" />
</h:selectOneMenu>
Где managerList - список объектов SelectItem.