2008-11-04 38 views
1

我有一個由兩個JSP組成的JSF應用程序:login.jsp & main.jsp。更新模型值之前JSF commandLink操作正在啓動

我有以下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該公司Databeans更新屬性一對夫婦組件在commandLink上單擊。成功完成後,用戶將導航到/main.jsp。

我注意到當我點擊commandLink時,該方法在bean更新之前執行。這會導致在執行方法時我的所有bean屬性都爲null,因爲我的表單中的值沒有被應用到bean。

根據我對JSF生命週期的理解,除非指定「immediate = true」,否則應始終在「調用應用程序」之前執行「更新模型值」,它不適用於我的commandLink。

我一直在試圖調試這個幾個小時今天上午,我歡迎任何建議或見解。

UPDATE: 我已經徹底調查這一問題,並得出結論,下拉我利用組件中有一個錯誤,應固定在下一版本中。我的解決方案是使用定期H:selectOneMenu用於代替第三方組件,它就像一個魅力:

<h:selectOneMenu id="ddlManager" value="#{DataBean.managerId}"> 
    <f:selectItems value="#{DataBean.managerList}" /> 
</h:selectOneMenu> 

哪裏managerList是的SelectItem對象的列表。

+0

您能否提供更多解釋。您是否說在調用phaselistener之前,命令鏈接的pagecode方法正在執行?你的phaselistener中是否有任何可能阻止它被調用的邏輯? – BoboTheCodeMonkey 2008-11-04 18:08:14

回答

2

這不是一個解決方案 - 這是一個例子,可以幫助您診斷問題。當然,你可能已經做到了這一點 - 我看到你已經實現了一個階段監聽器。

豆:

public class LoginBean implements Serializable { 

    private String user; 
    private String password; 

    public String getPassword() { 
     return password; 
    } 

    public String getUser() { 
     return user; 
    } 

    public void setPassword(String password) { 
     System.out.println("Update Password: " + password); 
     this.password = password; 
    } 

    public void setUser(String user) { 
     System.out.println("Update User: " + user); 
     this.user = user; 
    } 

    public String login() { 
     if ("user".equals(user) && "password".equals(password)) { 
      // ok 
      System.out.println("Login OK"); 
      return "loggedIn"; 
     } else { 
      System.out.println("Login Failed"); 
      FacesContext context = FacesContext.getCurrentInstance(); 
      FacesMessage message = new FacesMessage(
        "Invalid user name or password"); 
      context.addMessage(null, message); 
      return null; 
     } 
    } 

} 

查看:

<f:view> 
    <h:form> 
     login: 
     <h:inputText value="#{loginBean.user}" /> 
     <h:inputSecret value="#{loginBean.password}" /> 
     <h:commandButton value="login" action="#{loginBean.login}" /> 
     <h:messages /> 
    </h:form> 
</f:view> 

faces-config.xml中:

<?xml version="1.0" encoding="UTF-8"?> 

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" 
    version="1.2"> 
    <managed-bean> 
     <managed-bean-name>loginBean</managed-bean-name> 
     <managed-bean-class>login.LoginBean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <navigation-rule> 
     <display-name>login</display-name> 
     <from-view-id>/login.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>loggedIn</from-outcome> 
      <to-view-id>/label.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 
    <lifecycle> 
     <phase-listener>login.PhaseListenerImpl</phase-listener> 
    </lifecycle> 
</faces-config> 

階段監聽器:

public class PhaseListenerImpl implements PhaseListener { 

    public void afterPhase(PhaseEvent event) { 
     System.out.println("AFTER: " + event.getPhaseId()); 
    } 

    public void beforePhase(PhaseEvent event) { 
     System.out.println("BEFORE: " + event.getPhaseId()); 
    } 

    public PhaseId getPhaseId() { 
     return PhaseId.ANY_PHASE; 
    } 

} 

匹配用戶名和密碼的預期日誌輸出爲:

BEFORE: RESTORE_VIEW(1) 
AFTER: RESTORE_VIEW(1) 
BEFORE: APPLY_REQUEST_VALUES(2) 
AFTER: APPLY_REQUEST_VALUES(2) 
BEFORE: PROCESS_VALIDATIONS(3) 
AFTER: PROCESS_VALIDATIONS(3) 
BEFORE: UPDATE_MODEL_VALUES(4) 
Update User: user 
Update Password: password 
AFTER: UPDATE_MODEL_VALUES(4) 
BEFORE: INVOKE_APPLICATION(5) 
Login OK 
AFTER: INVOKE_APPLICATION(5) 
BEFORE: RENDER_RESPONSE(6) 
AFTER: RENDER_RESPONSE(6) 
+0

謝謝,@McDowell。查看更新的問題...我發現解決方案在我使用的組件中。我接受了你的建議,並且貫穿整個生命週期,但無法弄清楚。謝謝,我的朋友。 – karlgrz 2008-11-04 21:50:00

相關問題