2011-01-13 9 views
0

JSF 2.0アプリケーションに2つの画面があります。画面1は生徒を検索し、生徒を表で表示します。結果テーブルの生徒名は、学生の詳細ページ(画面2)へのリンクです。セッションを取得したマネージドBeanを同期させる

私の管理Bean:

    @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> 
    

    は、私は次の問題に直面しスニペットスニペット

  1. 検索を実行した後、ユーザーは、彼
  2. が 画面2の応答のレンダリングフェーズは、( testController.studentOnUIに ELの参照を持っている)進行中であり、(スクリーン 2に移動する) に生徒の名前をクリックします クリアボタンをクリックします(最初のリクエストが完了するのを待たずに)。それ は#を評価する際に今testController.studentOnUIがで 応答フェーズをレンダリングされた最初のスレッドをゼロとする 設定解除要求を処理 スレッドはNullPointerExceptionがスロー{testController.studentOnUI。*}。

管理対象Beanは、次の(画面2に移動するための要求を処理する)

  1. スレッド1が起こる可能性があり、ので、それはここでの同時実行の問題を解決していない(正しく?)同期を処理しますが - #を評価{testController.studentOnUI.name}を呼び出し、値をうまく描画します。そして、testController.getStudentOnUI()メソッドを終了します。したがって、スレッド1はコントローラインスタンス(セッションスコープ内)にロックされなくなりました。コンテキストスイッチが発生します。
  2. スレッド2(処理結果を消去する処理要求 ) - testController.studentOnUI = null in clearSearchAction()。コンテキストスイッチ が発生します。
  3. スレッド1 - ページ(#{testController.studentOnUI.subjects})の次のELを評価し、NullPointerExceptionをスローします(testController.studentOnUIはnullになります)。

私がこのアプローチで間違っていることを指摘したり、ここで別のアプローチを採用する必要がある場合は、何か参考にしてください。

TIA、 バブーは

+0

画面は何ですか?ブラウザで2つのタブを使用していますか?それとももっと魔法使いのようですか? –

+0

画面では、私はページを意味しました。タブやウィザードはありません。ユーザーは1ページ目のリンク1(学生の詳細ページに移動するために生徒の表内)をクリックし、応答が完了する前に、1ページのリンク2をクリックします。 – Babu

答えて

0

これは本当に奇妙な動作であるが、その後私はむしろそれが「unclickable」にするためにJavaScriptを使用して最初のページのリンクを無効にします。 jQueryで試してみてください。

1 button:$( '#button')。attr( "disabled"、true);

2リンク:$( 'a.something')。クリック(機能(e){ e。preventDefault(); });

JSFコントローラは、クリアメソッドではなく、Studentオブジェクトにロックを設定する必要があるため、バッキングBeanの同期についてはわかりません。私が間違っている?

関連する問題