日期:2014-05-16  浏览次数:20369 次

Struts2中整合JSF
1,JSF简介

JSF是Sun公司提出的一种新的MVC规范,作为JEE规范的组成部分,并且随着JDK一起发布,从某种程序上看,JSF已经起出了传统MVC框架,非常类似于ASP.NET服务器组件的概念.严格地说,JSF并不是一个框架而是一种规范,它是JEE5.0的重要组成部分,它通过提供一种页面组件的方式,隐藏了传统Web应用开发的HTTP细节,允许开发者以传统桌面编程的方式来开发Web应用,JSF通过将后台Bean(作用等同于控制器)的属性,方法直接绑定到页面组件的value属性或者action属性,就可以非常方便地实现系统MVC控制.

Struts2提供了良好的可扩展性,借助于Struts2的JSF插件,Struts2可以实现与JSF的整合,一旦完成了Struts2和 JSF的整合,我们就可以在Struts2的JSP页面中使用JSF页面组件,并用Action来模拟JSF的后台Bean,将JSP页面的JSF组件绑定到Action属性,从而允许开发者以JSF的方式来开发Struts2应用.

JSF是一种规范,当Sun公司提出JSF规范的同时,也提供了JSF的一个参考实现(Reference Implementation,简称RI).apache也提供了JSF的另一个实现,就是MyFaces框架,目前不管是JSF RI还是MyFaces框架,都已经逐渐成熟起来,完全可作为实现项目中的MVC框架.

当Microsoft推出ASP.NET开发平台后,ASP.NET开发平台里包含了一种服务器组件概念,通过使用服务器组件,开发者能以一种开发桌面应用的方式来开发Web应用,但Web应用程序的开发与桌面应用的开发在本质上存在着太多的差异,Web应用的开发人员必须处理HTTP的细节,而且 Web应用是由一个一个页面组成,每个页面之间的信息是不连续的,是无状态的,但传统桌面程序本质上是由一个程序不断地驱动其他程序,因些各程序之间的信息是连续的.而Microsoft的ASP.NET极好地简化了Web应用的开发,在ASP.NET的服务器组件里,开发者可以直接调用服务器组件方法来取得服务器组件的值----看起来已经超出了传统Web应用的请求---响应模式.

JSF引入了大量全新的标签库,这套标签库看起来就像是普通的HTML标签一样,但它不是静态的,而是动态的.对于网面开发人员而言,使用JSF标签库与使用变通HTML标签库并没有太大的差别,网页开发人员无需理会JSF标签后端的动态部分;网页设计人员无需了解JAVA知识,甚至无需接触 JSTL这种标签库,也可以动态展现数据.对于应用程序设计人员而言,JavaServer Faces提供一个与桌面应用开发相似的模型,我们完全可以采用基于事件的编程模型,而不是请求---响应编程模型,因此避免了出现HTTP细节的问题.

从前面的介绍中可以看出,JSF已经是一个完整的MVC框架,JSF的核心就是事件驱动,类似于早期的Visual Basic编程模式,可以通过为页面中的按钮单击事件,输入框的内容改变事件提供事件响应程序来实现Web应用流程.

JSF的组件和标签的封装程度非常高,很多典型应用已经不需要开发者去处理HTTP细节了,页面操作也会被自动映射到后台的JavaBean中,处理逻辑直接访问后台的JavaBean(Back Bean也就是控制器)交互.此外,JSF提供的组件标签(非常类似于ASP.NET的服务器组件的概念),封装程度相当高,而且有很简单的编程模式,JSF的事件模型可以细化到表单里每个表单域.JSF直接使用POJO作为控制器,并且可以使用任何方法来处理用户请求.相对于 Struts2,JSF还有一个显著的优势在于丰富的组件标签,这些组件标签提供了一种事件驱动的编程模式,可以大大简化应用的开发.

从以上两者的对比可以看出Struts2和JSF有各自的优势:
Struts2更接近传统的Web编程流程,使用更加方便.
JSF的组件库能提供细致的事件模型,而且可以简化Web应用的开发.

2,使用MyFaces

通常认为JSF RI比较权威,是官方的参考实现,但过于古板,提供的组件库不够丰富;MyFaces在完全实现了JSF RI的基本功能之外,还提供了许多额外的组件库,因此在实际开发中有很大的吸引力.因此我这里使用MyFaces.

2.1 下载和安装MyFaces

MyFaces除了实现JSF RI的基本功能外,还包含了一个tomahawk额外库,这个库内包含了更多的组件,借助于tomahawk的帮助,可以提供更多页面组件.MyFaces的下载和安装请按如下步骤进行:
1,下载MyFaces必需的核心类库,登陆http://myfaces.apache.org/download.html页面,下载MyFaces的最新版本,我这里用的是MyFaces Core 1.2.3 Distribution,如果需要使用tomahawk额外标签库,则还要下载tomahawk部分.tomahawk的下载链接也可以在这个页面找到.我下载的是myfaces-core-1.2.3-bin.zip文件
2,将下载的文件\lib下的所有JAR文件复制到WEB-INF\lib目录下,此时就可以在Web应用中使用MyFaces框架了.
3,为了可以编译MyFaces程序,建议将myfaces-api-1.2.3.jar添加到JDK的环境变量classpath里,当然也可以使用 ant工具.
4,在Web应用中安装MyFaces标签库,安装MyFaces标签库根据所用的Servlet容器不同,可能会有两种做法:
对于使用支持Servlet2.4以上规范的Web容器,我们无需修改web.xml文件,如果希望在JSP页面中使用MyFaces标签库,则可以直接在JSP页面中使用如下两行来导入MyFaces标签库:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
这里看起来很奇怪,我们为什么导入的是JSF标签库而不是MyFaces的标签库呢?熟悉自定义标签库规范就知道,此处的URI只是定义标签库时指定的 URI,与实现的内容并没有必须的联系.
MyFaces的标签库文件是放在myfaces-impl-1.2.3.jar文件夹的META-INF路径下的,对于使用Servlet2.4以上规范的Web应用,会自动读取JAR文件里的TLD文件,并识别到其中的URI信息.
如果使用更早的Servlet规范的Web应用,则应该在web.xml文件中增加如下配置片段:
<taglib>
<taglib-uri>http://java.sun.com/jsf/html</taglib-uri>
<taglib-location>/WEB-INF/lib/myfaces-impl-1.2.3.jar</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsf/core</taglib-uri>
<taglib-location>/WEB-INF/lib/myfaces-impl-1.2.3.jar</taglib-location>
</taglib>

2.2 从输入页面开始

前面已经增加了MyFaces的标签库定义,所以现在可以在JSP页面使用MyFaces标签库了,如果要查看各标签库详细信息,请参看 MyFaces下tlddoc路径下的API文档.下面是一个例子的页面代码:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<!--该句绑定在classes下的messages的资源文件-->
<f:loadBundle basename="messages" var="msg"/>
<html>
<head>
<title>登陆</title>
</head>
<body>
<