这是我在这个美丽网站的第一个问题。我google了很多,但我没有找到任何解决方案。
我是JSF的新手,我正在通过Kent Ka lok Tong的“JSF 2 API和JBoss Seam”学习它。
现在我遇到了一个简单的登录实现问题。我有一个登录页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Login</title>
</h:head>
<h:body>
<h1>Login</h1>
<h:messages for="loginForm" />
<h:form id="loginForm">
<h:inputText id="username" value="#{loginRequest.username}" required="true" />
<h:inputSecret id="password" value="#{loginRequest.password}" required="true" />
<h:commandButton value="Login" action="#{loginRequest.doLogin}"></h:commandButton>
</h:form>
</h:body>
</html>
和一个支持bean:
package app.controller;
import app.model.beans.User;
import javax.faces.bean.RequestScoped;
import javax.inject.Named;
@Named("loginRequest")
@RequestScoped
public class LoginRequest {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public LoginRequest(){
System.out.println("created " + this.toString());
}
public String doLogin(){
if(this.username != null && this.password != null){
if(this.username.equals("user") && this.password.equals("password")){
//this.userHolder.setCurrentUser(username);
return "success";
}
return "failure";
}
return "failure";
}
}
当我运行应用程序时,我的用户名和密码属性结果为null。我调试了我的应用程序,我看到正确调用了setter方法。问题是,当调用setUsername时,会有LoginRequest的实例,当它被称为setPassword函数时,实例是不同的!似乎应用程序执行此操作:
obj1 = new LoginRequest() //username and password = null;
obj1.username = username;
obj1 = new LoginRequest() //username and password = null;
obj1.password = password;
obj1 = new LoginRequest() //username and password = null;
obj1.doLogin();
我遇到麻烦了?错误在哪里?
非常感谢!
祝你好运
马
答案 0 :(得分:16)
来自你的bean:
import javax.faces.bean.RequestScoped;
import javax.inject.Named;
@Named("loginRequest")
@RequestScoped
public class LoginRequest {
您正在混合使用CDI和JSF注释。你可以而且不那样做。使用其中一个。我不知道这本书告诉你什么,但很可能你在导入@RequestScoped
注释时选择了错误的自动完成建议。请注意,如果IDE建议你匹配书中告诉你的任何内容。
因此,您应该只使用 CDI注释
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("loginRequest")
@RequestScoped
public class LoginRequest {
或仅限JSF注释
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name="loginRequest")
@RequestScoped
public class LoginRequest {
否则范围默认为"none"
,并且引用该bean的每个EL表达式都将创建一个全新且独立的bean实例。如果有三个EL表达式引用#{loginRequest}
,那么最终会有3个实例。设置名称的地方,设置密码的地方和调用行动的地方。
无关,托管bean名称已默认为classname,其中第一个字符符合小写,符合Javabean规范。您可以完全省略("loginRequest")
部分。