web-dev-qa-db-ja.com

ページの読み込み時にJSF管理Beanアクションを呼び出す

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

それが関連する場合、現在JSF 1.2を使用しています。

56
DD.

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">に基づいて初期化する場合、またはBeanがビュースコープよりも広いスコープに配置される場合(デザインの問題を示しますが、それは別として)、<f:viewParam>を使用します。そうでなければ、@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>に基づいて初期化する場合、またはBeanがビュースコープよりも広いスコープに配置される場合(デザインの問題を示しますが、それは別として)、<f:viewParam>を使用します。そうでなければ、@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";
}

こちらもご覧ください:

83
BalusC

別の簡単な方法は、ビューをレンダリングする前にメソッドを起動することです。 sessionScopeの場合、postConstructはセッションごとに1回だけ起動するため、これはpostConstructよりも優れています。これは、ページがロードされるたびに起動します。これはもちろんJSF 2.0のみであり、JSF 1.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>
13
stolen_leaves

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

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

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

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

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
10
Amin Bahiraei

からbeanアクションを呼び出すことは良い考えです、属性を保持autoRun = "true"以下の例

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
0
sijo jose