日期:2014-05-19  浏览次数:20715 次

Struts 2核心技术与Java EE框架整合开发实战
17.3  Struts 2整合JSF
目前基于JSF规范较成熟的框架有两个,一个Sun的JSFUI,另一个是Apache的MyFaces框 架。因为Struts 2提供了对MyFaces更好的插件支持,因此本示例采用Apache的MyFaces。整合之前让我们先来比较一下这两种表示层的框架。
17.3.1  Struts 2整合JSF的优点
下面从不同方面比较一下Sturts 2与JSF各自的特点。
首先,在标签库方面,Struts 2的标签库相对要少一些,且不可以自定义;而JSF可以自定义标签。JSF框架拥有丰富的页面组件,如果需要的话可以自己编写相应的组件,或者 扩展组件;而在JSP的页面中JSF提供了页面验证标签,可以做简单的长度和类型的验证。Struts 2的验证可以有两种方式,form验证与validator验证,功能上要比JSF强大。JSF的组件都是绑定到Bean的,而且数据验证的方法也可以绑 定,这一点可以增强验证的功能。而对于验证的错误提示信息,它们都提供了国际化,使得验证更人性化。
其次比较一下导航,二者之间的导航功能的相同点是都通过在XML文件中配置导航规则。Struts 2的XML中配置页面跳转的类型,如转发,重 定向,由Action返回的字符串来决定导航的目标;而JSF在导航规则中设定页面导航,当某个页面请求到来时,根据导航规则调用指定的Action方法进行处理,并返回一个逻辑视图,然后跳转到与逻辑视图对应的页面。JSF同时支持在页面中绑定按钮触发Action的具体方法,导航原理也是一样的。
最后比较一下Struts 2与JSF处理请求的方式。Struts 2调用指定的方法处理请求(如果没有指定具体方法则默认调用excute方法)。JSF采用了普通的POJO类作为它的Action,将Action类绑定到页面组件,通过值变监听与事件监听进行请求处理。相比之下,JSF处理请求的方式要比Struts2复杂,不方便系统升级。
总而言之,如果将JSF做为Struts 2的视图层,用Struts 2的Action做模型,可以开发出完美的应用系统。
接下来就将讲解Struts 2与JSF 的结合使用。
17.3.2  Struts 2与JSF整合过程
每种框架都有它独到的设计之处,Struts 2的可扩展性使得它的生命力非常顽强。Struts 2提供了多种框架的插件包,它与MyFaces 整合就是利用插件来实现的。下面我们介绍如何进行二者的结合应用。
首先下载Struts 2的JSF插件,下载地址是 http://struts.apache.org/ downloads.html。目前最高的插件版本是2.0.11,我们使用这个最新的版本与myfaces进行整合。
Apache的MyFaces下载地址是http://myfaces.apache.org. /download.html,目前的最高版本是1.2.2,本示例使用的是1.1.5。下载后得到名为myfaces-core-1.1.5的压缩文 件,将该文件解压,得到lib包下的运行库文件(.jar文件)。
17.3.3  整合应用实例
2008年是奥运年,因此我们采用目前最流行的奥运啦啦队员的选拔活动为主题,设计一个Struts 2+JSF应用的示例。
奥运啦啦队员选拔队员的设计分为3种功能:增加选手、查询选手、修改选手。
按如下的顺序创建示例程序。
(1)配置环境:配置Struts 2+JSF整合过程的运行环境。
(2)配置struts.xml文件:配置JSF拦截器与请求的Action。
(3)创建页面:注册选手页面,显示所有选手列表页面,修改选手页面。
(4)创建JavaBean。选手信息类PlayerInfo与控制器类OlympicAction。
(5)配置Web应用文件:配置Struts 2请求转发控制器。
(6)发布运行:演示发布运行后的结果页面。
下面详细介绍各个环节的实现过程。
(1)配置应用程序运行环境。
添加Struts 2核心资源包、Struts 2的JSF 插件包、MyFaces资源包。
(2)配置struts.xml。
利用Struts 2+JSF开发视图层,需要的配置文 件是struts.xml。这个文件配置信息分为两个部分,一个是JSF 拦截器的配置,另一个是Struts 2的Action配置。
首先看一下JSF拦截器的配置:
在struts.xml文件中需要配置JSF的拦截器,使得所有的JSF的请求都能被正确处理。这个拦截器在Struts的插件包中已经定义好了,继承这个包就可以使 用这些拦截器。拦截器的配置如代码17-17所示。
代码17-17  struts.xml中JSF拦截器的配置
<!-- 重写拦截器,将其命名在包myJSF中 -->
<package name="myJSF" extends="JSF-default">
                  <interceptors>
                            <interceptor-stack name="JSFFullStack">
                                     <interceptor-ref name="params" />
                                     <interceptor-ref name="basicStack" />
                                     <interceptor-ref name="JSFStack" />
                            </interceptor-stack>
                  </interceptors>
                  <default-interceptor-ref name="JSFFullStack" />
</package>
接下来配置请 求的Action。
在请求的Action配置中需要继承myJSF拦截器,用来处理JSF页面的组件。