Java Setter方法在JSF中不起作用

Java Setter方法在JSF中不起作用,java,jsf,javabeans,Java,Jsf,Javabeans,我是JSF新手,有一个登录页面。这是: 这里是登录jsf页面 @Named(value = "login") @Dependent @RequestScoped public class Login{ private String username = "", password = ""; public String getUsername() { return username; } public String getPassword() { return passw

我是JSF新手,有一个登录页面。这是:


这里是登录jsf页面

@Named(value = "login")
@Dependent
@RequestScoped
public class Login{

private String username = "", password = "";

public String getUsername() {
    return username;
}

public String getPassword() {
    return password;
}

public void setUsername(String Username) {
    username = Username;
}

public void setPassword(String Password) {
    password = Password;
}

public void checkDB() {
    try {
        con=DB.connect();
        PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
                "SELECT * FROM Users where username = ? AND password = ?");
        checkDB.setString(1, username);
        checkDB.setString(2, password);
        ResultSet rs = null;
        rs = (ResultSet) checkDB.executeQuery();

        if (rs.next()) {
            User.customer = new Customer(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7));
            rs.close();
            DB.disconnect(con);
            FacesContext.getCurrentInstance().getExternalContext().redirect("main.xhtml");            

        } else {
            rs.close();

            DB.disconnect(con);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
下面是用户类:

@ManagedBean(name = "user")
@SessionScoped
public class User implements Serializable {

public static Customer customer;
private Connection con=null;
public void setCustomer(Customer customer) {
    User.customer = customer;
}

public Customer getCustomer() {
    return customer;
}

public User() {
}

public void editInfo() {
    String name = customer.getName(), surname = customer.getSurname(), password = customer.getPassword();
    String phone = customer.getPhone(), address = customer.getAddress(), email = customer.getEmail();


    try {
        con=DBConnect.connect();
        int result = -1;
        PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
                "UPDATE users set password=?,name=?,surname=?,phone=?,address=?,"
                + "email=? where username=?");
        checkDB.setString(7, customer.getUsername());
        checkDB.setString(1, password);
        checkDB.setString(2, name);
        checkDB.setString(3, surname);
        checkDB.setString(4, phone);
        checkDB.setString(5, address);
        checkDB.setString(6, email);
        result = checkDB.executeUpdate();
        con.close();
        FacesContext.getCurrentInstance().getExternalContext().redirect("editsuccesfull.xhtml");

    } catch (Exception e) {
        e.printStackTrace();
    }

}

问题是,在setter函数设置用户名和密码之后,当函数从托管bean返回时,用户名和密码突然变为null。为什么会这样?如何修复它?

设置程序工作正常,否则您将在
登录#checkDB
方法中获得
NullPointerException
。问题是,您的
登录
托管bean似乎被标记为
@RequestScoped
@ViewScoped
(在您的版本之后是
@RequestScoped
),您正在重定向到main.xhtml而不是转发,这行代码注意到:

FacesContext.getCurrentInstance().getExternalContext().redirect("main.xhtml");
请注意,您正在
Login#checkDB
方法中手动创建
User
类的实例,因此它将作为POJO,并在方法末尾标记为垃圾收集(这是基本Java)。另外,请注意,在执行重定向时,所有请求属性都将丢失

为了解决您的问题,您应该将用户数据保存在会话中,并让CDI容器管理bean,而不是手动执行。为此,需要注入
@SessionScoped
托管bean来处理用户数据(密码除外,以避免安全问题)。这里对此进行了解释:(注意,这个Q/A提供了一个您正在寻找的登录示例)


重要注意事项:不要将JSF与CDIBean混合使用,您应该使用其中一种,但决不能同时使用两者。将
用户
bean从
@ManagedBean
更改为
@Named
,以使用CDI电源。

您的bean已被请求scoped@KorayTugay这不是这里唯一的问题。为什么你要发布同样的后续问题,而不是调查我在回答中提到的问题?此外,不鼓励有多个帐户。@skuntsel这些问题看起来很相似,但我不确定是不是同一个人。@Luiggmendoza我认为是这样的,因为大部分代码基本上都是复制粘贴在这里的。或者可能有一个团队正在处理相同的登录问题:)实际上我以为我是通过User.customer=new customer(rs.getString(1)、rs.getString(2)、rs.getString(3)、rs.getString(4)、rs.getString(5)、rs.getString(6)、rs.getString(7))启动会话的;在登录bean中,我编辑了问题并放置了用户类,它是会话范围的。这是一种错误的方式吗?谢谢我想我知道了如何使用FacesContext处理会话问题