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

如何在JSF中从managedBean重新加载相同的页面?,jsf,redirect,login,Jsf,Redirect,Login,我在JSF应用程序中实现了登录,但重定向有问题 我想在应用程序中的每个xhtml中提供登录表单,但在登录成功或失败后,我想让用户保持在单击登录时的相同页面 我曾尝试在managedBean方法中返回null,但这不起作用,因为它不会刷新网页,我需要刷新页面以使视图逻辑正常工作 这是登录表单: <h:form id="loginForm" rendered="#{!loginBean.estaLogueado()}"> <p:panel h

我在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>

有一种方法可以返回到用户登录的xhtml,而不是像“login.xhtml”这样的固定xhtml?

就我而言,有两种方法可以实现此目的

  • 您应该在caller commandButton的update属性中定义需要更新的组件
  • 您应该通过添加
    ?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>
    
    就在最后


    在操作字段中返回要重定向到的页面不是最佳做法吗?(在本例中,您可以将操作更改为actionListener)@Steven:1)OP无法硬编码结果值(此操作可以从多个页面调用),因此必须以编程方式解析当前页面。2) 操作侦听器不适用于业务逻辑。如何保留最初从页面调用的
    getQueryString()
    返回
    null
    ..@BalusC如何在从其后台bean重定向到页面时重新加载浏览器缓存?
    <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>
    
    public String login(){
    
        currentUser = gu.login(usuario, password);
    
        return "login?faces-redirect=true";
    }
    
    public void login() throws IOException {
        // ...
    
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
    }