2013-10-27 66 views
0

我正在使用JSF創建一個Timesheet應用程序,目前正在處理登錄部分。這是一個直接登錄,需要登錄ID和密碼,並檢查它是否是有效的組合(儘管此時我只是在管理員登錄)。JSF在調用操作方法之前沒有更新值

我的問題似乎是JSF沒有更新我的loginID和密碼字段之前調用驗證操作方法,因爲當我點擊登錄時,它會引發NullPointerException。這是我的驗證方法。

/** 
* Verifies that the loginID and password is the super user combination. 
* @return true if it is, false if it is not. 
*/ 
public String verifyUser() { 
    ResourceBundle login = getSuperUserLogin(); 
    String user = getLoginID(); 
    String checkPassword = getPassword(); 
    if(!login.containsKey(user) || !checkPassword.equals(login.getString(user))) { 
     return "regular"; 
    } 
    return "super"; 
} 

和我的登錄頁面現在

<body> 
    <div class = "content" align = "center"> 
     <h:form> 
      <h3>#{msgs.loginTitle}</h3> 
      <h:panelGrid columns="2" cellpadding = "4"> 
        <h:outputText value = "#{msgs.userID}" styleClass="title" /> 
        <h:inputText value="#{user.loginID}" styleClass="rounded" /> 
        <h:outputText value = "#{msgs.password}" styleClass="title" /> 
        <h:inputSecret value="#{user.password}" styleClass="rounded" /> 
      </h:panelGrid> 
      <p><h:commandButton value="#{msgs.login}" styleClass="button" action="#{superUser.verifyUser}"/></p> 
      </h:form> 
     </div> 

,如果我硬編碼的登錄ID和密碼進入用戶和checkPassword字段,然後它的工作原理沒有問題。所以我認爲問題是loginID和密碼字段爲空(因爲getLoginID()和getPassword()只是返回這些字段的常規舊getter)。我知道答案會很愚蠢,我會因爲錯過而感到尷尬,但在這一點上,我正在將我的頭靠在牆上。

只要信息完整,loginID和password字段就位於User類(提供了合適的setter)中,而verifyUser方法位於SuperUser子類中。我不知道爲什麼如果這一切都很重要,但這將是我的第一個使用超類和子類的JSF應用程序,所以你永遠不會知道。

編輯: 根據要求,這裏是我的用戶類代碼

package ca.bcit.infosys.timesheet.model; 
import java.util.ResourceBundle; 

import javax.enterprise.context.ApplicationScoped; 
import javax.inject.Named; 

@Named 
@ApplicationScoped 
public class User implements java.io.Serializable { 
/** The user's name */ 
private String name; 
/** The user's employee number */ 
private int empNumber; 
/** The user's login ID */ 
private String loginID; 
/** The user's password */ 
private String password; 
/** Is the user currently in an editable state (i.e. the user's information can be edited on the webpage) */ 
private boolean editable; 
private ResourceBundle superUserLogin = ResourceBundle.getBundle("ca.bcit.infosys.timesheet.model.messages"); 

/** 
* @return the name 
*/ 
public String getName() { 
    return name; 
} 

/** 
* @param name the name to set 
*/ 
public void setName(String name) { 
    this.name = name; 
} 

/** 
* @return the empNumber 
*/ 
public int getEmpNumber() { 
    return empNumber; 
} 

/** 
* @param empNumber the empNumber to set 
*/ 
public void setEmpNumber(int empNumber) { 
    this.empNumber = empNumber; 
} 

/** 
* @return the loginID 
*/ 
public String getLoginID() { 
    return loginID; 
} 

/** 
* @param loginID the loginID to set 
*/ 
public void setLoginID(String loginID) { 
    this.loginID = loginID; 
} 

/** 
* @return the password 
*/ 
public String getPassword() { 
    return password; 
} 

/** 
* @param password the password to set 
*/ 
public void setPassword(String password) { 
    this.password = password; 
} 

/** 
* @return the isEditable 
*/ 
public boolean isEditable() { 
    return editable; 
} 

/** 
* @param isEditable the isEditable to set 
*/ 
public void setEditable(boolean editable) { 
    this.editable = editable; 
} 

/** 
* @return the Property containing the super user login information. 
*/ 
public ResourceBundle getSuperUserLogin() { 
    return superUserLogin; 
} 

}

+0

你能分享你的用戶類代碼嗎?由於用戶字段沒有填充可能是缺少的東西。 – sanjay

+0

新增用戶類別代碼。 – user1265215

回答

3

有很多誤解與你目前的做法。我會建議先學習和掌握JSF的基本概念來完成這個任務。

爲了使這項工作,你需要一個單一的bean,只需要對服務器的每個請求都活着。這個bean將有責任從JSF表單獲取數據並執行驗證操作。然後,您只需將字段和登錄方法綁定到JSF表單。

Java代碼

//Looks like you use CDI (or probably you just think this is what you need) 
@Named 
//The bean just needs to be alive on each request 
//Since you're using CDI, make sure this annotation comes from 
//javax.enterprise.context package 
@RequestScoped 
//Usually, the managed beans used in JSF are named with "Bean" suffix 
//Since it is for learning purposes, I'll name this bean UserBean 
public class UserBean { 
    //fields to hold username and password 
    //they both are Strings 
    private String username; 
    private String password; 
    //getters and setters methods 
    //I won't add them since it is boilerplate code for this sample 
    //... 

    //Method to handle your login action 
    //If successful login, then returns the name of the next view 
    //If unsuccessful, returns null to stay in the current view 
    public String login() { 
     //Sample implementation, remember to change it for A REAL ONE 
     if ("admin".equals(username) && 
      "adminPass".equals(password)) { 
      //Successful login 
      //Make sure to have a file index.xhtml in the same folder 
      //where the login JSF page resides (for sample purposes) 
      return "index"; 
     } 
     //Unsuccessful login 
     //Also, it is a good idea to show a message for end user 
     FacesMessage message = new FacesMessage("Invalid login."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     return null; 
    } 
} 

JSF代碼

<h:form> 
    <h3>Login Title</h3> 
    <h:panelGrid columns="2"> 
     <h:outputText value="User Id" /> 
     <h:inputText value="#{userBean.username}" /> 
     <h:outputText value="Password" /> 
     <h:inputSecret value="#{userBean.password}" /> 
    </h:panelGrid> 
    <h:commandButton value="Login" action="#{userBean.login}" /> 
    <br /> 
    <h:messages /> 
</h:form> 

有的東西你需要之前回事知道:

  • JSF豆是不一樣的爲CDI豆。這裏解釋更好:Backing beans (@ManagedBean) or CDI Beans (@Named)?。我建議閱讀Bozho和BalusC的答案。
  • 定義託管bean的範圍。 JSF初學者面臨的主要問題之一是爲bean選擇正確的範圍。例如,您開始將該bean標記爲@ApplicationScoped,這意味着有一個用戶bean用於整個應用程序,這意味着兩個不同的最終用戶將具有相同的用戶對象(現在您開始擔心)。你可以在這裏瞭解更多:How to choose the right bean scope?
  • 正如你從上面的鏈接可以看到的,有一個視圖範圍。如果你正在使用Java EE 7,那麼你會發現這個範圍也適用於你的CDI bean。如果您正在使用Java EE 6,那麼您會發現沒有註釋。但是,不用擔心,OmniFaces自1.6版以來,通過org.omnifaces.cdi包的自定義@ViewScoped註釋解決了此問題。
  • 由於您從JSF/CDI開始,我建議每個視圖使用一個bean。當你有更多的經驗時,你可以在同一視圖中使用兩個或更多的豆子。這裏有個很好的例子:Can I use multiple managed bean in the same xhtml page?
+1

另一個非常好的首發球員對你的解釋,Luiggi。 – skuntsel

+0

@skuntsel謝謝。 –

相關問題