【问题标题】:How can I reload the same page from a managedBean in JSF?如何从 JSF 中的 managedBean 重新加载同一页面?
【发布时间】:2013-05-05 04:39:59
【问题描述】:

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

这是action属性中的方法:

public String login(){

    currentUser = gu.login(usuario, password);

    return null;
}

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

【问题讨论】:

    标签: jsf redirect login


    【解决方案1】:

    只需将redirect 发送至request URI。

    public void login() throws IOException {
        // ...
    
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
    }
    

    【讨论】:

    • 在操作字段中返回要重定向到的页面不是最佳做法吗? (在这种情况下,您可以将操作更改为 actionListener)
    • @Steven: 1) OP 无法对结果值进行硬编码(可以从多个页面调用此操作),因此必须以编程方式解析当前页面。 2) 动作监听器不适合业务逻辑。
    • 如何保留最初从页面调用的&lt;f:viewParam&gt;? getQueryString() 返回null...
    • @BalusC 如何在从支持 bean 重定向到页面时重新加载浏览器缓存?
    【解决方案2】:

    就我而言,有两种方法可以达到此目的。

    1. 您应该在调用者命令按钮的更新属性中定义需要更新的组件。
    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>
    

    update 属性将更新组件。

    第二种解决方案

    将?faces-redirect=true 添加到您的操作方法的返回值中以进行真正的刷新

    public String login(){
    
        currentUser = gu.login(usuario, password);
    
        return "login?faces-redirect=true";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2011-07-15
      • 2013-08-25
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多