重定向到另一个 JSF 页面 returns 404 错误
Redirect to another JSF page returns 404 error
我在我的项目中使用 jsf 2.0,当我的 login.xhtml
页面打开时,我输入了我的用户名和密码,该页面将重定向到我的 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 代码?
我认为为此使用动作而不是 actionListener 会更好,因为动作就是为了导航。所以试试
<p:commandButton value="Login" update="growl" action="#{login.checkLogin()}" />
然后将方法签名更改为
public String checkLogin()
此外,我不认为此方法需要抛出所有这些异常,如果 LoginBAO 方法抛出那些更好地捕获它们。
最后 return 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。
我在我的项目中使用 jsf 2.0,当我的 login.xhtml
页面打开时,我输入了我的用户名和密码,该页面将重定向到我的 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 代码?
我认为为此使用动作而不是 actionListener 会更好,因为动作就是为了导航。所以试试
<p:commandButton value="Login" update="growl" action="#{login.checkLogin()}" />
然后将方法签名更改为
public String checkLogin()
此外,我不认为此方法需要抛出所有这些异常,如果 LoginBAO 方法抛出那些更好地捕获它们。
最后 return 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。