Java Enterprise Edition (Java EE) 6 包含了很多像 JSF 2 这样功能强大的技术。Contexts and Dependency Injection(CDI)是这些技术中的一个,它在很大程度上标准化了在其他框架酝酿多年的一些概念。
在本文中,我向您展示如何综合使用 JSF 2 和 CDI 来实现一个在线小测验向导。CDI 为我带来了依赖注入、producer 方法和一个 conversation 作用域。我使用了这三者来实现一个向导,您可以轻松地将其用于任何一个多选的在线测试。
本系列并非只关注于 CDI。我将介绍如何:
使用 facelets 模板来最小化代码并最大化重用
Ajax 化向导以便获得更为顺畅的用户体验
使用 CDI 的依赖注入来简化代码
实现并使用 CDI producer 方法来在视图中无缝地使用 beans
利用 CDI 的 conversation 作用域来实现多请求用户用例
本文中的全部示例源代码均可下载得到。请参见 运行示例代码 侧栏获得下载链接以及指向部署指导的一个指针。
测验向导
图 1 显示了运行中的这个测验向导:
图 1. 测验向导
最初,这个应用程序只包含一个可开启向导的单独链接:<h:commandLink value="#{msgs.startWizard}" action="#{wizard.start}"/>。这个链接的文本(Start the wizard)来自一个属性文件并由该链接值内的 msgs.startWizard 表达式代表。国际化是 JSF 101 circa 2004,所以我在这里就不再过多涉及这些细节了。只需注意到整个应用程序都是本地化了的就足够了,并且所有字符串均从 messages.properties 文件拉出。
Start the wizard 链接会将用户带到这个测验向导页面,在这里,用户会被提问,一次一个问题,如 图 1 底部的两个图片所示。我通过一些简单的 Ajax 和一个服务器端 bean 控制此向导按钮的启用状态,我在本文的 Ajax 部分将向您详示。
图 2 显示了最后的一个问题,后跟用户答案的一个总结。当用户处于最后一个问题时,只有 Finish 按钮是启用的;单击该按钮会将用户带到总结页面。
图 2. 总结页面