如何在JSF的managedBean中重新加载同一页面?

6

我正在实现一个JSF应用程序的登录功能,但重定向出现了问题。

我希望在应用程序的每个xhtml中都提供登录表单,但在登录成功或失败后,我希望保持用户停留在他们点击登录时所在的页面。

我尝试在managedBean方法中返回null,但这不起作用,因为它不会刷新网页,我需要刷新页面才能使视图逻辑起作用。

这是登录表单:

<h:form id="loginForm" rendered="#{!loginBean.estaLogueado()}">
                    <p:panel header="#{msg.header_login}">
                        <h:outputLabel for="login" value="#{msg.login}"/>
                        <p:inputText id="login" value="#{loginBean.usuario}"></p:inputText><br/>
                        <h:outputLabel for="pwd" value="#{msg.password}"/>
                        <p:inputText id="pwd" type="password" value="#{loginBean.password}"></p:inputText><br/>
                        <p:commandButton action="#{loginBean.login()}" value="Login"/>
                    </p:panel>
                </h:form>
                <h:form id="logoutForm" rendered="#{loginBean.estaLogueado()}">

                    Bienvenido #{loginBean.nombreUsuario}!!<br/>

                    <p:commandButton action="#{loginBean.logout()}" value="Desconectar"/>

                </h:form>

这是在 action 属性中的方法:

public String login(){

    currentUser = gu.login(usuario, password);

    return null;
}

有一种方法可以返回用户登录的xhtml页面,而不是固定的xhtml页面,比如“login.xhtml”吗?
2个回答

27

只需重定向请求URI

public void login() throws IOException {
    // ...

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
}

在最佳实践中,将页面返回到操作字段中重定向不是最好的做法吗?(在这种情况下,您可以将操作更改为actionListener) - Steven
1
@Steven:1)OP 无法硬编码结果值(此操作可以从多个页面调用),因此必须通过编程方式解决当前页面。2)动作监听器不适用于业务逻辑。 - BalusC
1
如何保留最初调用页面的<f:viewParam>getQueryString()返回null... - jansohn
@BalusC,当我从后端bean重定向到一个页面时,如何重新加载浏览器缓存? - Vombat

6
据我所知,有两种方法可以实现此目的。
  1. 您应该在调用者commandButton的update属性中定义需要更新的组件。
  2. 您应该通过在操作的返回值中添加?faces-redirect=true来进行真正的刷新。

第一种解决方案。

<h:form id="loginForm" rendered="#{!loginBean.estaLogueado()}">
                    <p:panel header="#{msg.header_login}">
                        <h:outputLabel for="login" value="#{msg.login}"/>
                        <p:inputText id="login" value="#{loginBean.usuario}"></p:inputText><br/>
                        <h:outputLabel for="pwd" value="#{msg.password}"/>
                        <p:inputText id="pwd" type="password" value="#{loginBean.password}"></p:inputText><br/>
                        <p:commandButton action="#{loginBean.login()}" value="Login" update=":loginForm :logoutForm"/>
                    </p:panel>
                </h:form>
                <h:form id="logoutForm" rendered="#{loginBean.estaLogueado()}">

                    Bienvenido #{loginBean.nombreUsuario}!!<br/>

                    <p:commandButton action="#{loginBean.logout()}" update=":loginForm :logoutForm" value="Desconectar"/>

                </h:form>

更新属性将更新组件。

第二种解决方案

为了进行真正的刷新,请在动作方法的返回值中添加?faces-redirect=true

public String login(){

    currentUser = gu.login(usuario, password);

    return "login?faces-redirect=true";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接