2011-01-13 5 views
0

JSF 2.0 애플리케이션에 2 개의 화면이 있습니다. 화면 1은 학생을 검색하고 학생을 테이블에 나열합니다. 결과 테이블의 학생 이름은 학생 세부 정보 페이지 (화면 2)에 대한 링크입니다.세션 캡처 된 관리 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가에서 응답 단계를 렌더링하는 첫 번째 스레드를 null에 을 설정 맑은 요청을 처리하는 스레드가 NullPointerException이 발생 {testController.studentOnUI. *}.

관리 Bean이 다음은

  1. 스레드 1 (화면 2로 이동하는 처리 요청)이 일어날 수 있기 때문에 여기에 동시성 문제가 해결되지 않습니다 (제대로?) 동기화를 처리하지만이 - #을 평가 {testController.studentOnUI.name}하고 값을 행복하게 렌더링합니다. 그런 다음, testController.getStudentOnUI() 메소드를 종료합니다. 따라서 스레드 1은 더 이상 컨트롤러 범위 (세션 범위)에서 잠금을 갖지 않습니다. 컨텍스트 전환이 발생합니다.
  2. 스레드 2 (검색 결과를 지우는 처리 요청 ) - 수행 의 clearController.studentOnUI = null입니다. clearSearchAction(). 컨텍스트 스위치 이 발생합니다.
  3. 스레드 1 - 페이지 (# {testController.studentOnUI.subjects})의 다음 EL을 평가하고 NullPointerException을 throw합니다 (testController.studentOnUI가 이제 null이므로).

내가이 접근 방식을 잘못하고 있거나 다른 접근 방식을 채택해야하는 경우에 대한 조언을 감사하십시오.

TIA, 바부는

+0

화면이란 무엇입니까? 브라우저에서 2 개의 탭을 사용합니까? 아니면 마법사와 더 비슷합니까? –

+0

화면에서 나는 한 페이지를 의미했습니다. 탭이나 마법사가 없습니다. 사용자는 1 페이지의 1 번 링크 (학생 표에서 학생 세부 정보 페이지로 이동)를 클릭하고 응답이 완료되기 전에 1 페이지의 링크 2를 클릭합니다. – Babu

답변

0

이 정말 이상한 행동입니다하지만 난 오히려 "unclickable"하기 위해 자바 스크립트와 첫 페이지에있는 링크를 사용하지 않도록한다. jQuery로 시도 :

1 버튼 : $ ('# button'). attr ("disabled", true);

2 링크 : $ ('a.something') 클릭 (function (e) { e.preventDefault(); }});

JSF 컨트롤러가 Clear 메소드가 아닌 Student 객체에 잠금을 설정해야하기 때문에 백업 빈에서 동기화가 확실하지 않습니다. 내가 잘못?