1

SP/JSF Web ページ DelegateBean.jsp 関連 Bean DelegateBean.java

DelegateBean.java:

String msg;

public DelegateBean() {}
  clearMsg();
  ...
}

public void clearMsg() {
   msg = "":
}
.. other methods

ページが最初に開くと、コンストラクター DelegateBean() が呼び出されます。

オペレーターがページ上のコマンド ボタンを押してページを更新した場合、コンストラクターは呼び出されません (呼び出されるべきでもありません)。

オペレーターが [戻る] ボタンを押してから [進む] ボタンを押した場合、コンストラクターは呼び出されません (おそらく呼び出されるべきではありません)。

問題は、進むボタン (別の Web ページ) から再入力したときに clearMsg() を強制的に実行し、それ自体から再入力した (コマンド ボタンを押した) ときに実行しないようにする方法です。

良い(単純な)例はありますか?

ありがとう、ジョン

4

2 に答える 2

1

マネージド Bean のように見え@SessionScoped、コンストラクターは、Bean が使用されたときにユーザーがページに初めてアクセスしたときにのみ呼び出されます。

JSF 2 では、Managed Bean を に変更することでこれを実現できます@ViewScoped

@ManagedBean
@ViewScoped
public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        clearMsg();
    }
}

BalusC は、この回答で JSF Managed Bean スコープについて適切な説明を提供しています: How to choose the right bean scope? . また、回答の下部にあるリンクを読んで、これらの概念をよりよく理解することをお勧めします。


JSF 1.x では、マネージド Bean を構成して、faces-config.xmlファイルでスコープを要求clearMsgし、@PostConstruct public void initメソッドで を呼び出す必要があります。clearMsgこれは、マネージド Bean クラスの作成を含むすべてのリクエスト (ajax リクエストも含む) でメソッドが呼び出されることを意味することに注意してください。この問題を解決するには、JSF コードでこの Bean を呼び出す方法とタイミングに関する詳細情報を提供する必要があります。デフォルトでは、セッションにフラグを設定し、clearMsgメソッド (または一度だけ呼び出す必要があるメソッド) を呼び出す前にこのフラグをチェックすることで、これを解決できます。

public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        HttpSession session = ((HttpRequest)FacesContext.getCurrentInstance().
            getExternalContext().getRequest()).getSession();
        if (session.getAttribute("flag") == null) {
            clearMsg();
            //other methods...
        }
    }
}

顔の構成

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>your.package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>

からのアノテーション@ViewScopedを使用して、リクエスト スコープの Managed Bean を にシミュレートする方法があります。明示的なリダイレクトを行ってビューを変更するまで、Bean は有効であることを考慮してください。これに基づいて、コードは次のようになります。@KeepAliveRichFaces 3

@KeepAlive
public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        //no need to use session flags
        clearMsg();
        //other methods...
    }
}
于 2012-11-01T00:04:21.690 に答える
0

faces-config.xml の Bean のスコープは何ですか?

あなたが問題を説明しているように、そのように見えます。これはsession、リクエストではなくセッションごとに Bean が構築されているためです。

スコープをに変更するrequestと、おそらくうまくいくはずです。

@BalusCとの議論に従って更新

上記のrequest範囲は要件と矛盾しますnot to be called from the same page

jsf 2.x を使用している場合は、スコープを に変更しviewscopeます。

アップデート #2

あなたの要件を見て、jsf 1.2Beanのスコープを変更できないと思います。

clearmessage()最も簡単な方法は、進むボタンのアクション内に明示的な呼び出しを追加することです

于 2012-10-31T23:36:29.853 に答える