2013-05-10 71 views
4

Im在JSF应用程序中实现登录,并且重定向时出现问题。如何从JSF中的managedBean重新加载相同的页面?

我想在应用程序中的每个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; 
} 

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

回答

5

据我所知,有两种方法可以达到这个目的。

  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"; 
} 
+0

第二种解决方案对我无效。 – JPerk 2017-10-24 20:44:49

22

只是redirectrequest URI

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

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

返回页面重定向到操作字段不是最佳做法吗? (在这种情况下,您可以将操作更改为actionListener) – Steven 2014-01-29 10:09:05

+0

@Steven:1)OP无法对结果值进行硬编码(此操作可以从多个页面调用),因此当前页面必须以编程方式解析。 2)动作监听器不适合业务逻辑。 – BalusC 2014-01-29 11:20:36

+1

我怎样才能保留原来从页面调用的''? 'getQueryString()'返回'null' ... – lazlev 2015-10-30 10:51:08