我有一个由两个 JSP 组成的 JSF 应用程序:login.jsp 和 main.jsp。
我有以下 faces-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 上有几个组件,它们在单击 commandLink 时更新 DataBean 中的属性。成功完成后,用户将导航到 /main.jsp。
我注意到当我单击 commandLink 时,该方法在更新 bean 之前执行。这导致我的所有 bean 属性在方法执行时都为 null,因为我的表单中的值没有应用于 bean。
根据我对 JSF 生命周期的理解,“更新模型值”应始终在“调用应用程序”之前执行,除非指定了“立即=真”,这不适用于我的 commandLink。
今天早上我已经尝试调试了几个小时,我欢迎任何建议或见解。
更新:我已经彻底调查了这个问题并得出结论,我正在使用的下拉组件中有一个错误,应该在下一个版本中修复。我的解决方案是使用常规的 h:selectOneMenu 代替第三方组件,它就像一个魅力:
<h:selectOneMenu id="ddlManager" value="#{DataBean.managerId}">
<f:selectItems value="#{DataBean.managerList}" />
</h:selectOneMenu>
其中 managerList 是 SelectItem 对象的列表。