当我的login.xhtml
页面打开时,我正在使用jsf 2.0,我输入了用户名和密码,页面将重定向到我的firstpage.xhtml
,我的页面无法打开并让我获得404错误。
public void checkLogin() throws NoSuchAlgorithmException, InvalidKeySpecException, IOException {
if (new LoginBAO().checkLoginFaild(user)) {
new LoginBAO().updattUserFaild(user);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "خطا در ورود", "بیشتر از سه دفعه اشتباه اطلاعات خود را وارد کرده اید"));
} else {
if (!new LoginBAO().validUsername(user)) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "خطا در ورود", "نام کاربری یا رمز عبور را اشتباه وارد کرده اید"));
} else {
if (new LoginBAO().validPassword(user)) {
new LoginBAO().updattUserFaild(user);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "خطا در ورود", "نام کاربری یا رمز عبور را اشتباه وارد کرده اید"));
} else {
new LoginBAO().updateLoginCorrect(user);
String uri = "firstpage.jsf";
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
context.redirect(uri);
}
}
}
}
那么我能为这个问题做些什么呢? 我是否从这个问题中更改了我的web.xml代码?
答案 0 :(得分:1)
我认为最好为此使用动作而不是actionListener,因为动作意味着精确导航。所以试试
<p:commandButton value="Login" update="growl" action="#{login.checkLogin()}" />
然后将方法签名更改为
public String checkLogin()
此外,我不认为这个方法需要抛出所有这些异常,如果LoginBAO方法抛出那些更好的捕获它们。
最后返回null或要显示的新xhtml页面的名称,例如
if (new LoginBAO().checkLoginFaild(user)) {
new LoginBAO().updattUserFaild(user);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "خطا در ورود", "بیشتر از سه دفعه اشتباه اطلاعات خود را وارد کرده اید"));
return null;
}
,重定向就是
return "/firstpage.xhtml?faces-redirect=true";
需要?faces-redirect = true,因为commandButton提交了一个ajax调用,无法进行正常导航。
确保Faces Servlet映射到web.xml中的* .xhtml。