2011-08-03 29 views
3

这是我在这个美丽的网站中的第一个问题。我搜索了很多,但我没有找到任何解决方案。JSF不会使用提交的输入值填充@Named @RequestScoped bean

我是JSF的新手,我正在用Kent Ka lok Tong的“JSF 2 APIs和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"; 

    } 


} 

当我运行该应用程序我的用户名和密码属性导致空。我调试了我的应用程序,并看到setters方法被正确调用。问题是,当调用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

“运行应用程序”是什么意思?你打开登录页面,在文本框中输入你的名字和密码,然后点击登录按钮? – egbokul

+0

是的,我通过在glassfish上部署应用程序来运行应用程序,并在浏览器中打开登录页面,输入用户名和密码并按下按钮。 – EmarJ

回答

15

从你的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"和每一个EL表达式指豆会创建一个全新的,单独的bean实例。如果有三个EL表达式参考#{loginRequest},则最终会有3个实例。一个名称已设置的位置,一个设置了密码的位置以及一个调用了操作的位置。


无关的具体问题,托管bean的名字已经默认为与第1个字符的类名小写符合JavaBean规范。您可以完全省略​​部分。

+0

我相信命名空间是一样的。“当前”和“ManagedProperty”注释之间也有相同的区别!这是正确的?然后做**不**混合CDI和JSF注释。万分感谢! – EmarJ

相关问题