gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:11:25 25 4
gpt4 key购买 nike

这是我在这个美丽的网站上的第一个问题。我用谷歌搜索了很多,但没有找到任何解决方案。

我是 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";

}


}

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

我哪里有问题?错误在哪里?

非常感谢!

此致

马可

最佳答案

从你的 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 个实例。一种是设置名称,一种是设置密码,一种是调用 Action 。

无关 对于具体问题,托管 bean 名称已经默认为第一个字符小写的类名,符合 Javabean 规范。你可以省略 ("loginRequest")部分。

关于JSF 不会使用提交的输入值填充 @Named @RequestScoped bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928365/

25 4 0