64

ページが読み込まれたときにJSFマネージドBeanアクションを実行する方法はありますか?

それが関係しているなら、私は現在JSF1.2を使用しています。

4

4 に答える 4

99

JSF 1.0 / 1.1

JSFページに関連付けられたリクエストスコープのBeanのコンストラクターに目的のロジックを配置するだけです。

public Bean() {
    // Do your stuff here.
}

JSF 1.2 / 2.x

リクエストで注釈付きメソッドを使用する@PostConstructか、スコープ付きBeanを表示します。すべての管理プロパティと挿入された依存関係の構築と初期化/設定の後に実行されます。

@PostConstruct
public void init() {
    // Do your stuff here.
}

CDIなどのプロキシを使用するBean管理フレームワークを使用している場合は、コンストラクターよりもこれを強くお勧めします。これは、コンストラクターが予期したときに呼び出されない可能性があるためです。

JSF 2.0 / 2.1

<f:event type="preRenderView">または、に基づいて初期化する場合<f:viewParam>や、Beanがビュースコープよりも広いスコープに配置されている場合に使用します(これは設計上の問題を示していますが、それは別として)。それ以外の場合は、a@PostConstructも完全に問題ありません。

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

JSF 2.2+

<f:viewAction>または、に基づいて初期化する場合<f:viewParam>や、Beanがビュースコープよりも広いスコープに配置されている場合に使用します(これは設計上の問題を示していますが、それは別として)。それ以外の場合は、a@PostConstructも完全に問題ありません。

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload() { 
    // Do your stuff here.
}

Stringこれにより、必要に応じてナビゲーションケースが返される可能性があることに注意してください。リダイレクトとして解釈されます(したがって、ここは必要ありません?faces-redirect=true)。

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}

参照:

于 2010-03-15T23:59:28.960 に答える
14

もう1つの簡単な方法は、ビューがレンダリングされる前にメソッドをfireを使用することです。sessionScopeの場合、postConstructはセッションごとに1回だけ起動するため、これはpostConstructよりも優れています。これは、ページが読み込まれるたびに発生します。もちろん、これはJSF 2.0のみであり、JSF1.2ではありません。

これがその方法です-

<html xmlns:f="http://java.sun.com/jsf/core">
      <f:metadata>
          <f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
      </f:metadata>
</html>

そしてmyController.javaで

 public void onPageLoad(){
    // Do something
 }

編集-これはこのページの質問に対する解決策ではありませんが、JSFのより高いバージョンを使用している人々のためだけにこれを追加します。

JSF 2.2には、を使用してこのタスクを実行する新機能がありますviewAction

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
于 2014-12-03T11:59:17.963 に答える
11

@PostConstructは、Beanが作成されたときに最初に1回実行されます。解決策は、未使用のプロパティを作成し、このプロパティのGetterメソッドでアクションを実行し、次のようにこのプロパティを.xhtmlファイルに追加することです。

<h:inputHidden  value="#{loginBean.loginStatus}"/>

そしてあなたの豆コードで:

public void setLoginStatus(String loginStatus) {
    this.loginStatus = loginStatus;
}

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
于 2010-11-23T12:14:42.653 に答える
2

からBeanアクションを呼び出す<p:remoteCommand>ことをお勧めします。属性autoRun="true"を保持します。 以下の例

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
于 2018-05-08T05:22:22.977 に答える