background image

Java 教程:JSF 与 Struts 的异同

Struts 和 JSF/Tapestry 都属于表现层框架,这两种分属不同性质的框架,后者是一种事
件驱动型的组件模型,而 Struts 只是单纯的 MVC 模式框架,老外总是急吼吼说事件驱动
型就比 MVC 模式框架好,何以见得,我们下面进行详细分析比较一下到底是怎么回事?
 首先事件是指从客户端页面(浏览器)由用户操作触发的事件,Struts 使用 Action 来接受
浏览器表单提交的事件,这里使用了 Command 模式,每个继承 Action 的子类都必须实现
一个方法 execute。
 在 Struts 中,实际是一个表单 Form 对应一个 Action 类(或 DispatchAction),换一句话说:
在 Struts 中实际是一个表单只能对应一个事件,Struts 这种事件方式称为 application 
event,application event 和 Component event 相比是一种粗粒度的事件。
 Struts 重要的表单对象 ActionForm 是一种对象,它代表了一种应用,这个对象中至少
包含几个字段,这些字段是 Jsp 页面表单中的 input 字段,因为一个表单对应一个事件,
所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个
事件时,单纯使用 Struts 就不太可能,当然通过结合 JavaScript 也是可以转弯实现的。
 而这种情况使用 JSF 就可以方便实现
 #{login.userId}表示从名为 login 的 JavaBean 的 getUserId 获得的结果,这个功能使用
struts 也可以实现,name="login" property="userId"
 关键是第二行,这里表示如果 userId 的值改变并且确定提交后,将触发调用类
UserLoginChanged 的 processValueChanged(...)方法。
 JSF 可以为组件提供两种事件:Value Changed

 

和 Action. 前者我们已经在上节见识过用

处,后者就相当于 struts 中表单提交 Action 机制,它的 JSF 写法如下:
 从代码可以看出,这两种事件是通过 Listerner 这样观察者模式贴在具体组件字段上的,
而 Struts 此类事件是原始的一种表单提交 Submit 触发机制。如果说前者比较语言化(编程
语言习惯做法类似 Swing 编程);后者是属于 WEB 化,因为它是来自 Html 表单,如果你起
步是从 Perl/PHP 开始,反而容易接受 Struts 这种风格。
 基本配置
 Struts 和 JSF 都是一种框架,JSF 必须需要两种包 JSF 核心包、JSTL 包(标签库),此外,
JSF 还将使用到 Apache 项目的一些 commons 包,这些 Apache 包只要部署在你的服务器中
既可。
 JSF 包下载地址:http:

//java.sun.com/j2ee/javaserverfaces/download.html 选择其中

Reference Implementation。

 JSTL 包下载在 http:

//jakarta.apache.org/site/downloads /downloads_taglibs-standard.cgi

 所以,从 JSF 的驱动包组成看,其开源基因也占据很大的比重,JSF 是一个 SUN 伙伴
们工业标准和开源之间的一个混血儿。
 上述两个地址下载的 jar 合并在一起就是 JSF 所需要的全部驱动包了。与 Struts 的驱动包
一样,这些驱动包必须位于 Web 项目的 WEB-INF/lib,和 Struts 一样的是也必须在
web.xml 中有如下配置:
 Faces Servlet