登录后从数据库设置ManagedBean的实例变量

时间:2018-04-17 07:41:26

标签: jsf managed-bean

我开始学习JSF并且我不确定这是否是正确的方法,但我想要做的是允许用户从数据库登录和验证,然后向用户提供欢迎消息'的名字,例如欢迎鲍勃。数据库将包含所有用户信息,登录将仅包含电子邮件和密码。

目前我有一个带有所有getter和setter的ManagedBean以及一个验证方法,该方法调用DAO中的方法。

@Named(value = "custBean")
@SessionScoped
public class CustomerManagedBean implements Serializable {

/**
 * Creates a new instance of CustomerManagedBean
 */
public CustomerManagedBean() {
}

private int custId;
private String firstname;
private String lastname;
private String email;
private String password;
private String address;
private String city;
private String state;
private int zip;

public int getCustId() {
    return custId;
}

public void setCustid(int custId) {
    this.custId = custId;
}
// More getters/setters here, not shown

public String validateEmailPassword() {
    boolean valid = LoginDAO.validate(email, password);
    if (valid) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
        session.setAttribute("email", email);
        session.setAttribute("firstname", firstname); // I can't set this because user did not input this on login so how do I set it from database?
        session.setAttribute("lastname", lastname); // and this
        session.setAttribute("address", address); // and this
        session.setAttribute("state", state); // and this
        session.setAttribute("zip", zip); // and this
        return "index";
    } else {
        FacesContext.getCurrentInstance().addMessage(
                null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Incorrect Email and Password",
                        "Please enter correct Email and Password"));
        return "login";
    }
}

Login.xhtml非常简单

<h:form>
    <h3>Login</h3>
    <h:outputText value="Username" />
    <h:inputText id="username" value="#{custBean.email}"></h:inputText>
    <h:message for="username"></h:message>
    <br></br>

    <h:outputText value="Password" />
            <h:inputSecret id="password" value="#{custBean.password}"></h:inputSecret>
    <h:message for="password"></h:message>
    <br></br>

    <h:commandButton action="#{custBean.validateEmailPassword}" value="Login"></h:commandButton>
</h:form>

我是否正确通过#{custBean.email}和#{custBean.password}上的用户输入在login.xhtml中初始化bean?那么在数据库调用之后我可以设置bean的其他变量吗?我希望我有意义,但我能做的就是登录后,我能够显示#{custBean.email}。它只是名字和我无法展示的其他名字。

这是我在DAO中的验证方法。

public static boolean validate(String email, String password) {
    Connection con = null;
    PreparedStatement ps = null;

    try {
        con = DataConnect.getConnection();
        ps = con.prepareStatement("SELECT * FROM customer WHERE email = ? AND password = ?");
        ps.setString(1, email);
        ps.setString(2, password);

        ResultSet rs = ps.executeQuery();

        if (rs.next()) {
            return true;
        }
    } catch (SQLException ex) {
        System.out.println("Login error -->" + ex.getMessage());
        return false;
    } finally {
        DataConnect.close(con);
    }
    return false;
}

更新 我从数据库和CustomerController添加了一个Customer实体以及Netbeans生成的通用AbstractFacade和CustomerFacade。我的CustomerController在下面。这是与DB交互的更好方法吗?

@Named(value = "customerController")
@SessionScoped
public class CustomerController implements Serializable {

@EJB
CustomerFacade custFacade;

@Inject
CustomerManagedBean custBean;


public CustomerController() {
}

public String validateCustomer() {
        Customer c = new Customer();
        c = custFacade.getValidUser(custBean);
        if (c != null) {
            custBean.setEmail(c.getEmail());
            custBean.setFirstname(c.getFirstname());
            custBean.setLastname(c.getLastname());
            custBean.setAddress(c.getAddress());
            custBean.setCity(c.getCity());
            custBean.setState(c.getState());
            custBean.setZip(c.getZip());
        }
}

1 个答案:

答案 0 :(得分:0)

基本思想是,在java类中保存模型,并通过EL表达式将模型的值链接到XHTML页面。

因此,您可以在提交后从页面的输入元素中填充模型中的变量,或者在后端代码中设置它们并显示它们,通过使用值attribure引用模型成员(将通过getter / setter) )。

您的模型会根据您选择的上下文进行初始化。当您使用SessionScope时,它将在首次使用时初始化,并且只要您的HTTP会话将持续,就会持续。在此期间,您可以在提交登录数据后查看输入,查询数据库,相应地填充其他成员并在此页面或其他页面上显示更多数据,换句话说,您的浏览器和后端bean之间有几次往返

在您的支持bean中,您不必填写任何会话属性,只需填写您自己的模型成员,例如数据库调用和索引视图(我假设它保存数据的输出元素)将在EL表达式引用时显示新设置的模型数据(就像您对输入元素值所做的那样)。