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

Gus*_*ach 6 jsf redirect login

我在JSF应用程序中实现登录并且重定向有问题.

我希望在应用程序的每个xhtml中提供登录表单,但在登录成功或失败后,我希望将用户保持在登录时单击的同一页面.

我试图在managedBean方法中返回null,但这不起作用,因为它不刷新webPage,我需要刷新页面以使视图逻辑工作.

这是登录表单:

<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>
Run Code Online (Sandbox Code Playgroud)

这是action属性中的方法:

public String login(){

    currentUser = gu.login(usuario, password);

    return null;
}
Run Code Online (Sandbox Code Playgroud)

有一种方法可以返回用户所在的xhtml,而不是像"login.xhtml"这样固定的xhtml吗?

Bal*_*usC 24

只需重定向请求URI即可.

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

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
}
Run Code Online (Sandbox Code Playgroud)


ere*_*can 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>
Run Code Online (Sandbox Code Playgroud)

update属性将更新组件.

二解决方案

添加?faces-redirect=true到操作方法的返回值以进行实际刷新

public String login(){

    currentUser = gu.login(usuario, password);

    return "login?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)