初识 Stripes
和我们熟悉 Struts 1 和 Struts 2 类似,Stripes 同样是一种展示层框架,用于快速构建web程序。在使用Struts 1,WebWork 和 Struts 2 等框架的时候,通常需要大量额外的 XML 配置,当一个项目达到一定规模的的时候,编写 Java 代码的同时还要维护大量的 XML 配置,这的确是件费神的事。Stripes 完全抛弃了这些框架的弊病,使用了最新的 Java 5 带来的技术,遵循 “Convention over Configuration” 理念,只需要在 Java 代码中加入少量的 Annotation,就可以完成配置,大量减少了代码的维护工作。
从 Stripes 网站,可以了解到 Stripes 框架的目标:
简化 Java web 开发。
针对一些常见问题,提供简单而强大的解决方案。
容易上手,你很难想像让一个新 Stripes 的用户在30分钟内就能很快进入状态。
容易扩展。
Stripes 提供的特性。
零配置,不需要外部配置文件,这是 Stripes 最引人注目的特性。
强大的binding引擎,足以应对复杂的对象。
验证和类型转换机制非常容易使用和本地化。
良好的本地化支持,甚至在 JSP 页面之间跳转时仍然生效。
能够复用 ActionBean,将它作 view helper 使用。
简易的 indexed property 支持。
内置支持同一个 form 触发多个事件。
具备透明的文件上传能力。
支持增量开发。
相当灵活,易于扩展。
作为一种经典的 MVC 框架,Struts 1 曾经在 Java 开发人员心目中占据了最高点。但是随着时间的推移,Struts 1 基础构架上先天性的缺陷显得越来越明显。同时,JSF 作为标准框架成为 Java EE 标准的一部分,Struts 1 面临着前所未有的挑战。一些开发人员开始尝试使用其它 web 框架,来替代 Struts 1。Struts 1 的作者也曾尝试对 Struts 1 彻底改造,并提出了雄心勃勃的 “Struts Ti” 计划,但那就意味着 Struts 1 良好的向前兼容性将被打破,升级带来的代价非常大。所幸的是,一次机缘,让 Struts 1 和 WebWork 的开发人员能够坐下来,一起探讨 web 框架的未来。很快他们达成了共识,于是全新的 Struts 2 应运而生,它是基于 WebWork 的全新的 web 框架,新的 WebWork的开发工作也转移到了 Struts 2上。
和 WebWork 一样,Struts 1 作为一个遗留项目被保留下来。Struts 的另一个分支 Shale 从Struts 项目中剥离了出去,成为 Apache 下一个独立的项目。
在 web 开发中,与 Struts 1 相比,Stripes 有很多闪亮的新特性。
大大减少了开发工作量
在 Struts 1 中,开发一个带有form的页面,你需要开发一个 JSP 页面文件,一个
ActionForm
类,一个Action
类,并要在struts-config.xml
中注册你新建的 ActionForm 和 Action。而 Stripes 就要简单得多,你只需要创建一个 JSP 文件和 一个
ActionBean
,在ActionBean
使用工 AnnotationUrlBinding
指定你要响应的 URL ,使用 AnnotationHandlesEvent
将事件映射到方法上。增量开发
在 Struts 1 中,当你写发一个 JSP 页面文件,其中有一个
<html:form>
标签,这时你还没有开发FormBean
,当你把它部署到服务器,比如tomcat。打开浏览器,查看页面,它会抛出异常,提示找不相应的FormBean
。而 Stripes 中,完全不用担心,即使没有创建
ActionBean
,你一样可以预览 JSP 页面的效果,然后再创建ActionBean
。属性绑定
在 Struts 1 中,你的
Form
有一个嵌套(nested)属性person.address.line1
,如果person
或address
为null
,Struts 1 就会抛出异常,你必须在使用嵌套属性的对象中对其一一对预先初始化,这就是意味需要一些额外的工作。而 Stripes 中,完全不用担心没有初始化的问题,Stripes 会自动进行初始化,只要定义一个不带参数的修饰符为
public
的构造器。Indexed 属性
在 Struts 1 中,完全屈从于JavaBean 规范,但对 web 模型不是很友好。你必须实现indexecd getter 和 setter 方法。
而 Stripes 中,你只要提供你所用的 List 或 Map 的 getter 和 setter 方法。使用泛型告诉 Stripes List 和 Map 中对象的类型。Stripes 会在必要的创建一个 List 或 Map 实例,需要进行扩展,产生新的对象,并将他们放入到 List 或 Map 中,设置好 List 中对象的属性。
Null的处理
在 Struts 1 中,
ActionForm
有一个 int 的属性,当时你保留页面字段为空时,Struts 1 会自动将转换成 0 ,更糟糕的,如果验证失败,回到 Form 页面,它会在输入框填充一个 0 。而 Stripes 中,如果页面输入框为空,那么这个字段不提交,
ActionBean
不会填充字段值。格式化输出
在 Struts 1 中,你只有使用 JSTL 提供的格式化功能 。
而 Stripes 中,和 JSTL类似,提供了格式化标签。
多事件支持的
Action
在 Struts 1 中,你必须使用
DispatcherAction
来实现,并且所有 button 必须使用同一名称,不同的值,它会根据值的不同来调用的不同的方法,如果button 要进行国际化时,又是一件痛苦的事。而 Stripes 中,使用 button 的 name 属性本身来映射相应的方法。
JSP/View Helper
在 Struts 1 中,没有什么好的方法将动态数据载入到 JSP 页面之中。
而 Stripes 中,
ActionBean
可以作为一个 View Hepler使用。HTML 标签
在 Struts 1 中, Struts 1 标签中 input 使用
property
而不是name
,class
被替换成styleCalss
。而 Stripes 中,尽可能保持这些属性的名称与 HTML 一致。
前不久 Apache 官方刚刚发布了 Struts 2
的最新稳定版 2.1.6.GA,在这个版本中,官方首次提供了一个 Convention Plugin 插件,以代替 2.0.x 中的
Codebehide,Zero Config 等 Annotation 插件。从名称可以看出其一个重要的特色就是 Convention
。不过,感觉 Struts 2 有“复制” Stripes 之嫌。
在 Stripes 中,可在 StripesFilter
中指定一个 init-param
参数 ActionResolver.Packages
,指定从哪些包中扫描 ActionBean
。
<init-param>
<param-name>ActionResolver.Packages</param-name>
<param-value>tutorial.action</param-value>
</init-param>
在 Struts 2 中,有相似的概念。
你可以在 Struts 2 配置文件中指定一个 struts.convention.action.packages
常量,其值为 Struts 2 中 Action
所在的包。
转自:http://blog.chinaunix.net/u/1096/showart_1858318.html