JSF 2.0 애플리케이션에 2 개의 화면이 있습니다. 화면 1은 학생을 검색하고 학생을 테이블에 나열합니다. 결과 테이블의 학생 이름은 학생 세부 정보 페이지 (화면 2)에 대한 링크입니다.세션 캡처 된 관리 Bean 싱크 화
내 관리 빈 :
-
:
- 검색을 실행 한 후, 사용자는 그는
- 이 화면 2의 렌더링 응답 단계 ( testController.studentOnUI에 EL의 참조가) 진행 중입니다 (화면 2로 이동) 에 학생 이름을 클릭 지우기 버튼 클릭 (첫 번째 요청이 완료되기를 기다리지 않고). 그것은 이 #을 평가할 때 이제 testController.studentOnUI가에서 응답 단계를 렌더링하는 첫 번째 스레드를 null에 을 설정 맑은 요청을 처리하는 스레드가 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이 다음은
- 스레드 1 (화면 2로 이동하는 처리 요청)이 일어날 수 있기 때문에 여기에 동시성 문제가 해결되지 않습니다 (제대로?) 동기화를 처리하지만이 - #을 평가 {testController.studentOnUI.name}하고 값을 행복하게 렌더링합니다. 그런 다음, testController.getStudentOnUI() 메소드를 종료합니다. 따라서 스레드 1은 더 이상 컨트롤러 범위 (세션 범위)에서 잠금을 갖지 않습니다. 컨텍스트 전환이 발생합니다.
- 스레드 2 (검색 결과를 지우는 처리 요청 ) - 수행 의 clearController.studentOnUI = null입니다. clearSearchAction(). 컨텍스트 스위치 이 발생합니다.
- 스레드 1 - 페이지 (# {testController.studentOnUI.subjects})의 다음 EL을 평가하고 NullPointerException을 throw합니다 (testController.studentOnUI가 이제 null이므로).
내가이 접근 방식을 잘못하고 있거나 다른 접근 방식을 채택해야하는 경우에 대한 조언을 감사하십시오.
TIA, 바부는
화면이란 무엇입니까? 브라우저에서 2 개의 탭을 사용합니까? 아니면 마법사와 더 비슷합니까? –
화면에서 나는 한 페이지를 의미했습니다. 탭이나 마법사가 없습니다. 사용자는 1 페이지의 1 번 링크 (학생 표에서 학생 세부 정보 페이지로 이동)를 클릭하고 응답이 완료되기 전에 1 페이지의 링크 2를 클릭합니다. – Babu