初识 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 触发多个事件。
-
具备透明的文件上传能力。
-
支持增量开发。
-
相当灵活,易于扩展。
Stripes vs Struts 1
作为一种经典的 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 一致。
Stripes vs Struts 2
前不久 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