我正在使用 JSF 创建一个 Timesheet 应用程序,目前正在处理登录部分。这是一个直接的登录,它需要一个登录 ID 和一个密码,并检查它是否是一个有效的组合(尽管此时我只是在进行管理员登录)。
我的问题似乎是 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 和 password 字段为空(因为 getLoginID() 和 getPassword() 只是返回这些字段的常规旧 getter)。我知道答案会很愚蠢,我会因为错过它而感到尴尬,但此时我的头撞到了墙上。
只要信息完整,loginID 和密码字段位于 User 类中(提供了适当的设置器),而 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;
}
}