我开始学习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());
}
}
答案 0 :(得分:0)
基本思想是,在java类中保存模型,并通过EL表达式将模型的值链接到XHTML页面。
因此,您可以在提交后从页面的输入元素中填充模型中的变量,或者在后端代码中设置它们并显示它们,通过使用值attribure引用模型成员(将通过getter / setter) )。
您的模型会根据您选择的上下文进行初始化。当您使用SessionScope时,它将在首次使用时初始化,并且只要您的HTTP会话将持续,就会持续。在此期间,您可以在提交登录数据后查看输入,查询数据库,相应地填充其他成员并在此页面或其他页面上显示更多数据,换句话说,您的浏览器和后端bean之间有几次往返
在您的支持bean中,您不必填写任何会话属性,只需填写您自己的模型成员,例如数据库调用和索引视图(我假设它保存数据的输出元素)将在EL表达式引用时显示新设置的模型数据(就像您对输入元素值所做的那样)。