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>
我面臨以下問題:
- 運行搜索後,用戶在點擊 學生姓名(移動到屏幕 2)
- 當 屏幕2的渲染響應階段正在進行中(其中有 EL引用 testController.studentOnUI),他 點擊清除按鈕(無需等待第一個請求完成)。現在 線程處理 設置testController.studentOnUI爲null, 是在渲染 響應階段第一線的明確要求將引發NullPointerException異常 時 評估 #{testController.studentOnUI。*}。
雖然託管bean處理同步(正確?),它並沒有解決併發問題在這裏,因爲,下面會發生
- 線程1(處理請求導航到屏幕2) - 評估# {testController.studentOnUI.name},並愉快地呈現該值。然後退出testController.getStudentOnUI()同步方法。因此,線程1不再擁有控制器實例上的鎖定(在會話範圍內)。上下文切換髮生。
- 線程2(處理請求清除 搜索結果) - 確定 testController.studentOnUI = null clearSearchAction()。發生上下文切換 。
- 線程1 - 評估頁面中的下一個EL(#{testController.studentOnUI.subjects})並拋出NullPointerException(因爲testController.studentOnUI現在爲空)。
欣賞任何關於我在做什麼錯誤的指針,或者如果在這裏需要採用不同的方法。
TIA, 巴布
什麼是屏幕?你在瀏覽器中使用2個選項卡?還是更像是一個巫師? – 2011-01-13 16:13:24