JSF 2.0アプリケーションに2つの画面があります。画面1は生徒を検索し、生徒を表で表示します。結果テーブルの生徒名は、学生の詳細ページ(画面2)へのリンクです。セッションを取得したマネージドBeanを同期させる
私の管理Bean:
-
:
- 検索を実行した後、ユーザーは、彼
- が 画面2の応答のレンダリングフェーズは、( testController.studentOnUIに ELの参照を持っている)進行中であり、(スクリーン 2に移動する) に生徒の名前をクリックします クリアボタンをクリックします(最初のリクエストが完了するのを待たずに)。それ は#を評価する際に今testController.studentOnUIがで 応答フェーズをレンダリングされた最初のスレッドをゼロとする 設定解除要求を処理 スレッドはNullPointerExceptionがスロー{testController.studentOnUI。*}。
@SessionScoped
public class TestController {
private Student studentOnUI; // Student being viewed on the UI
// synchronized public getters and setters
public String viewStudentAction(String studentId) {
this.studentOnUI = getStudentFromDB(studentId);
return "studentDetailedPage";
}
public synchronized String clearSearchAction() {
this.studentOnUI = null;
return "studentSearchPage";
}
画面1つのXHTMLは
<!-- search fields -->
<h:commandButton
value="Clear Search"
action="#{testController.clearSearchAction()}"/>
<!-- Search button -->
<!-- search results table -->
画面2つのXHTMLは
<h:outputText value="#{testController.studentOnUI.name}" />
<h:dataTable
value="#{testController.studentOnUI.subjects}"
var="subject">
<h:outputText value="#{subject.score}"/>
</h:dataTable>
は、私は次の問題に直面しスニペットスニペット
管理対象Beanは、次の(画面2に移動するための要求を処理する)
- スレッド1が起こる可能性があり、ので、それはここでの同時実行の問題を解決していない(正しく?)同期を処理しますが - #を評価{testController.studentOnUI.name}を呼び出し、値をうまく描画します。そして、testController.getStudentOnUI()メソッドを終了します。したがって、スレッド1はコントローラインスタンス(セッションスコープ内)にロックされなくなりました。コンテキストスイッチが発生します。
- スレッド2(処理結果を消去する処理要求 ) - testController.studentOnUI = null in clearSearchAction()。コンテキストスイッチ が発生します。
- スレッド1 - ページ(#{testController.studentOnUI.subjects})の次のELを評価し、NullPointerExceptionをスローします(testController.studentOnUIはnullになります)。
私がこのアプローチで間違っていることを指摘したり、ここで別のアプローチを採用する必要がある場合は、何か参考にしてください。
TIA、 バブーは
画面は何ですか?ブラウザで2つのタブを使用していますか?それとももっと魔法使いのようですか? –
画面では、私はページを意味しました。タブやウィザードはありません。ユーザーは1ページ目のリンク1(学生の詳細ページに移動するために生徒の表内)をクリックし、応答が完了する前に、1ページのリンク2をクリックします。 – Babu