2013-05-10 70 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