2011-01-13 49 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中的同步。我错了吗?