JSF不会用提交的输入值填充@Named @RequestScoped bean



这是我在这个美丽的网站上的第一个问题。我已经谷歌了很多,但我没有找到任何解决办法。

我是JSF的新手,我正在学习Kent Ka look 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";
    }

}

当我运行应用程序时,我的用户名和密码属性结果为空。我调试了我的app,看到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();

我在哪里遇到麻烦?错在哪里?

非常感谢!

问好

马可

From your 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名称已经默认为符合Javabean规范的第一个小写字符的类名。您可以完全省略("loginRequest")部分。

相关内容

  • 没有找到相关文章

最新更新