2011-01-13 34 views
0

我在我的JSF 2.0應用程序中有2個屏幕。屏幕1搜索學生並將學生列入表中。結果表中的學生姓名是指向學生詳細信息頁面的鏈接(屏幕2)。同步會話scopped託管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. 當 屏幕2的渲染響應階段正在進行中(其中有 EL引用 testController.studentOnUI),他 點擊清除按鈕(無需等待第一個請求完成)。現在 線程處理 設置testController.studentOnUI爲null, 是在渲染 響應階段第一線的明確要求將引發NullPointerException異常 時 評估 #{testController.studentOnUI。*}。

雖然託管bean處理同步(正確?),它並沒有解決併發問題在這裏,因爲,下面會發生

  1. 線程1(處理請求導航到屏幕2) - 評估# {testController.studentOnUI.name},並愉快地呈現該值。然後退出testController.getStudentOnUI()同步方法。因此,線程1不再擁有控制器實例上的鎖定(在會話範圍內)。上下文切換髮生。
  2. 線程2(處理請求清除 搜索結果) - 確定 testController.studentOnUI = null clearSearchAction()。發生上下文切換 。
  3. 線程1 - 評估頁面中的下一個EL(#{testController.studentOnUI.subjects})並拋出NullPointerException(因爲testController.studentOnUI現在爲空)。

欣賞任何關於我在做什麼錯誤的指針,或者如果在這裏需要採用不同的方法。

TIA, 巴布

+0

什麼是屏幕?你在瀏覽器中使用2個選項卡?還是更像是一個巫師? – 2011-01-13 16:13:24

回答

0

這真是奇怪的行爲,但我寧願禁用了JavaScript的第一頁上的鏈接,使其「無法點擊」。 嘗試使用jQuery:

1按鈕:$('#button')。attr(「disabled」,true);

2鏈接:$('a.something')。click(function(e){ e。的preventDefault(); });

由於JSF控制器必須將鎖放在您的Student對象上,而不是清除方法,所以我不確定backing bean中的同步。我錯了嗎?