重定向到另一个 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。