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