web-dev-qa-db-ja.com

JSFのmanagedBeanから同じページをリロードするにはどうすればよいですか?

JSFアプリケーションにログインを実装していて、リダイレクトに問題があります。

アプリのすべてのxhtmlでログインフォームを利用できるようにしたいのですが、ログインが成功または失敗した後、ユーザーがログインをクリックしたときと同じページにとどまりたいと思います。

ManagedBean methongで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;
}

「login.xhtml」のような固定されたxhtmlではなく、ユーザーがログインしたxhtmlに戻る方法がありますか?

6
Gustach

redirect to request URI だけです。

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

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());
}
24
BalusC

私に関する限り、この目的には2つの方法があります。

  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>

update属性は、コンポーネントを更新します。

2番目の解決策

実際の更新のために、アクションメソッドの戻り値に?faces-redirect=trueを追加します

public String login(){

    currentUser = gu.login(usuario, password);

    return "login?faces-redirect=true";
}
6
erencan