Struts2 小结

从工作开始便一时使用 struts 2 作为前端,已经有18个月了。对于 struts 有一定的了解,也感觉到它的麻烦之处。最大的不爽就是对错误的提示,呵呵。常常没有一句提示是指向问题所在的,而开发的经验就在这时使用上了。在这里,小结一下这18个月来我对 struts 2 的一点认识吧。
1. 基于拦截器实现。
Struts 2 是基于拦截器实现的。可以说在 struts 里,所以的功能通过拦截器完成的,而 Action 是最终的业务逻辑编写的地方。而拦截器,说白了,就是 Servlet 里的过滤器(Filter)。
让我们来看拦截器的配置,在 struts-default.xml (这里打开该文件)里,已经设置了框架自带的拦截器。这些拦截器已经实现了一般项目的大部分功能。

注意下面这段的配置

       <interceptors>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
       
       ....

       </interceptors>

        <default-interceptor-ref name="defaultStack"/>

struts 为我们准备了一个默认的拦截器,并且将其设置为全局默认。因此,对于初学者,可以完全不知道拦截器的原理而开发出有效的 struts 项目应用。

更多拦截器的介绍,请看这里

2. struts 2 标签应用

struts 开发中,我最常使用的资源是 tag reference。通过这个网页去查询 struts 2 的标签的使用方法。我们知道,JSP 最早使用脚本去编写,导致了代码的混乱与难于阅读。后来提出了 JSTL 并对标签进行了规范,而 struts 2 开放了一套自己的标签标准。使用 struts 2 的标签其实足以完成页面功能,这也是我的开发原则之一,页面完全使用 struts 标签完成。

使用标签的一个好处,就是其会为你自动填充内容。只要从 Action 链入,标签便会自动从 value stack 中获取相应的值进行填充。这在开发页面时非常有用。因为这一点,我会使用 prepare 去在后台设置初始化参数,使页面加载时有默认值。

3. Acton 编写

在 struts 1 中,Form 需要单独设置一个 FormBean 来实现。在 struts 2 中免去了这样的麻烦,换为了 action 中的 getter 和 setter。也放你会奇怪,不应该是一个变量再加相应的 getter 和 setter 吗?其实不然,变量可以设置为私有,即外部无法看到。而 struts 通过 action 的 setter 将页面的值传入,通过 getter 将 action 的值传出。这里有一个特殊,就是 list 值会通过 getter 传入及传出。即调用 getList().add(element); 将页面的 checkbox 之类的列表值传入。

扫描二维码关注公众号,回复: 827782 查看本文章

关于 Action 的编写,程序员更多关注的页面后端支持。很多人会认为业务逻辑应该在这里实现,于是在 Action 中写入大量实现代码。其实在 struts 的开发文档中有这么一句描述:

 写道
Ideally, Action classes should be as short as possible. All the core logic should be pushed back to a support class or a business facade, so that Actions only call methods. Actions are best used as adapters, rather than as a class where coding logic is defined.
事实上,Action 类应该尽可能的精简。所有的核心逻辑应该被放置在一个支持类或者一个业务封装中,而 Action 仅仅调用相应的方法。相比将 action 定义为一个包含业务逻辑的类,将其当作一个分配员更合适。

 上面的描述很清晰,如果我们将业务逻辑抽出并进行封装。那么一个精简的 action 在前端会让我们更好的进行业务的组合。

4. struts 2 插件应用

struts 的实现原理让其很方便的实现了应用插件,而插件的导入通常只需要简单的设置 package 的属性即可。

但插件的应用却不是简单的导入就完事了。我在使用 struts-json 时,就因为使用不当,而导致了莫名的错误。后面发现 JSON 插件是对返回值的 getter 方法的调用,即对 action 中的 getter 方法进行一次递归读取,然后封装为 JSON。但当使用了 spring 注入 service 时,对应 service 的 getter 方法就会导致 JSON 出错。于是我在写 action 时,都成分小心的处理 getter 和 setter。

所以要使用一个插件,还是了解它的脾气,再使用就会减少一些不必要的排错时间了。

5. 关于 struts 2 的学习资料

struts 的学习,我完全依赖了其官方网站。面对其详尽的文档描述,对于深入学习十分有帮助。这里介绍下我的检索资源的方法:

a) 通过 Guides 页面查找需要的内容

b) 在 Tag Reference 页面查找标签相关的信息

c) 通过其搜索功能查找相关资源

对于找到的链接,我们要看清楚相关的版本信息。通过在 URL 中就包含了版本信息,只需要相应的修改就可以了。

如 Guides 页面地址为:http://struts.apache.org/2.2.3/docs/guides.html

中间的 2.2.3 即为当前文档的版本,有时我们会看到其为 2.0.14,即是 2.0.14 版的 struts 开发文档。因为早期版本与最新版本在结构上有较大区别,故需要将其手工调整后再继续,避免过时的信息导致莫名的异常产生。

一般也可以将版本号设为 2.x 便可获得最新版本的开发文档了,如: http://struts.apache.org/2.x/docs/guides.html

 

上面非常粗略的介绍了一下 struts 中的一些概念,如有错落的地方,请读者雅正。谢谢

猜你喜欢

转载自mycream.iteye.com/blog/1064044