通过比较来学习Struts和Struts2.docx
- 文档编号:9347558
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:22
- 大小:224.67KB
通过比较来学习Struts和Struts2.docx
《通过比较来学习Struts和Struts2.docx》由会员分享,可在线阅读,更多相关《通过比较来学习Struts和Struts2.docx(22页珍藏版)》请在冰点文库上搜索。
通过比较来学习Struts和Struts2
通过比较来学习Struts和Struts2
Author:
Ivan
Date:
2008.11.16
不管怎样也是我幸苦敲出来的,署个名。
^-^
有错误欢迎指正。
1.从HelloWorld程序开始比较Struts和Struts2
程序流程:
从login.jsp页面开始,输入用户名和密码,如果输入正确就打印欢迎,如果错误则返回login.jsp页面.
(1)对于struts和struts2一样,首先建立login.jsp页面,这里使用基本的html标签。
Struts的login.jsp页面
Struts2的login.jsp页面
这里的区别很小,就是action后缀不同,这个是可以改的,所以可以认为这两个页面没有区别。
而对于成功后的跳转页面success.jsp就一点区别都没有了,因为就打印一句,welcome!
(2)对于Struts来说,每个页面就需要一个ActionForm(可以用struts提供的LazyDynaBean简化FormBean,所有页面都使用一个FormBean,后面再说),所以写一个FormBean,FormBean的作用是作为数据从页面传输数据的载体,和hibernate里的Bean是一样的作用。
FormBean需要继承ActionForm,样子像这样。
可以看出,此类其实就是个Pojo,但是还要继承ActionForm,这里就很累赘了。
所以struts2不需要继承,直接写Pojo就行了。
并且Struts2不需要再写Action类了,它只要在Pojo里添加一个execute方法就可以了。
(相当于是把ActionForm和Action集成了)
可以看到,这个Action不需要继承任何的父类,也就是说Struts2没有侵入性。
这里的execute方法格式统一,因为struts2默认会执行这个方法的。
这里只需要返回一个字符串就行了,比下面的Struts的Action简单很多。
(3)有了FormBean这个数据载体了,那就需要处理数据的类,在Struts里就是Action了,所有的Action都要继承Action类。
如下
这里覆盖了Action里的execute方法,里面对name和password做了些处理,很简单的(简洁起见就不链接数据库了。
)这里对execute里的几个参数做下解释。
ActionMapping:
以键值对的方式保存了配置文件里的信息。
ActionForm:
传入一个ActionForm,这里传入的是LoginForm,所以下面做了强制转换,从这里也可以看出,为什么FormBean都要继承ActionForm了。
ActionForward:
就是个forward,里面保存了配置文件里配置的forward。
(4)配置配置文件,对Struts来说,配置如下
name就是起个别名,当要改变FormBean的时候,只要修改type指向需要的FormBean就可以了,而其他都不需要改变。
input是处理完成后所要跳转的页面,对应LoginAction里的actionMapping.getInputForward()。
name就是FormBean的名字,用哪个FormBean来存储数据,type就是对应Action了,使用哪个Action来处理此请求。
validate是对应FormBean的,就是是否需要对FormBean里的数据做验证,这里先不验证。
最后一个就是这个Action的作用范围。
forward是另一个forward,是供LoginAction的actionMapping.findForward(“success”)使用的。
Struts-config.xml与web.xml一样,默认放在WEB-INF下,你可以放到任意的地方,只要把下面的web.xml文件里的init-patam的值指向该文件就可以了。
对于Struts2来说,它有个struts.xml文件,放在src目录下,在web.xml也不需要任何的配置,默认就是在src下寻找此文件。
该文件的配置如下。
很明显,比struts-config.xml简单很多。
解释一下, 在action里name就是Action的别名,作用就是,表单里的action=”login.action”,去掉.action后的名字与此相同则用该Action处理该请求。 class就不用解释了吧。 两个result分别对应Action里的返回值,对应那个就跳转到哪个页面。 比struts-config.xml简洁很多吧。 (5)最后是web.xml文件。 Struts配置如下 这个应该很简单了,就配置了一个servlet,这里使用的struts的ActionServlet类,它的作用就是将凡是已*.do结尾的url的请求,转给struts-config.xml去处理。 Struts2与Struts不同,它不是一个servlet而是一个filter。 作用和struts里的servlet是一样的。 区别就是那个路径是所有路径,这里会对所有路径过滤,当检测到后缀是以.action结尾的就把请求交给struts.xml处理。 (6)总结 从这个例子可以看出,Struts2的确比Struts更好。 首先,它不需要继承任何一个类,就没有了侵入性。 而Struts的FormBean必须要继承ActionForm,Action必须要继承Action。 且execute方法比较复杂。 再来就是,Struts2的所有文件都比Strus简化不少,方便了开发。 补充: 对于Struts2来说,它支持Annotation。 可以不使用struts.xml来配置,这样会简单一些,但是Annotation也是硬编码,所以个人认为基本不变的配置可以使用Annotation(因为简单嘛! ),经常变化的就用xml。 下面看看怎么修改。 其实改动不大,首先是struts.xml文件不需要了。 。 。 。 里面的内容可以注释掉,删掉也行。 然后在web.xml文件里添加一个参数。 如下图。 这个参数的作用是扫描org.struts2.action文件夹下的所有类,来解析里面的Annotation。 然后在LoginAction里面添加Annotation。 如下 很简单吧? 作用不用解释吧? 这里眼尖的应该会发现这里没有配置Action里面的名字,那Form提交的时候怎么确认提交到哪个Action的? 那么注意这里Form是提交到login,再看类名! 是不是猜到什么了? 这里Struts2会将LoginAction的类名去掉Action(如果原本就没有Action后缀,那么就保持不变),再全部小写去匹配login,如果匹配就使用这个Action,你可以试试修改login或者LoginAction,看还能不能提交了! 2.Struts和Struts2的数据验证 Struts和Struts2都有数据验证功能。 这是毋庸置疑的。 对于Struts来说,只需要在FormBean里面覆盖父类的validate方法即可。 如下所示 红线部分即为Struts的验证部分。 记得要将验证启用,就是把struts-config.xml里的validate设为”true”,其实默认是true,上面是特意设为false的。 这样的话,只要密码长度小于3那么就直接返回了,而不会再由Action去处理了。 这里返回一个ActionErrors,就是个键值对,保存错误信息。 在loginjsp没有显示代码,所以不会显示这个错误信息。 目前我还不知道如何在普通html文件里面显示错误,后面再看。 这里先提供Struts标签的方式来显示错误信息。 先要对上面的页面做点小调整。 Validate方法里的newActionMessage(“....”),改成这样 这里的errors.password是password在属性文件里的键值。 然后在src目录下创建一个message.properties属性文件。 属性文件里errors.password所对应的值就是刚才的字符串了。 接着在struts-config.xml添加上属性文件。 最后再修改一下login.jsp文件。 这里添加了taglib和 errors/>这行标签,这样验证不通过就会显示属性文件里对应errors.password的值了。 对于Struts2来说,添加验证比Struts复杂一点,首先需要让Pojo继承Struts2的Action类,这里继承ActionSupport. 然后覆盖父类的validate方法,可以看出这个validate方法比struts的validate方法简单很多,没有返回值,没有参数。 也是验证密码长度,应为不要返回值,所以这里就有了addFieldError方法,作用和ActionErrors一样的,都是保存错误的。 这里Struts2的验证还没写完,还要在struts.xml文件里添加验证错误后的跳转页面。 如图所示,这里的name是input,这是Struts2里默认的错误处理名称。 3.Struts与Struts2的验证框架Validator 对于Struts来说,所有的验证都写在FormBean里的话,不但麻烦,冗余代码也很多,同样的上面Struts2的验证也是,还侵入了Pojo。 所以Struts和Struts2都提供了Validator框架来简化验证。 Struts使用的是Comming-Validator框架,此框架需要两个配置文件,validator-rules.xml和validation.xml,前者的作用是声明需插入到框架中的验证例程。 后者的作用是定义将哪个验证框架例程应用到哪个FormBean上去。 对于validator-rules.xml文件,你一般不需要去动它,因为它被打包到jar文件里了,而且提供的功能基本够用了。 而且如果要改动的话,需要取出此文件,修改完后再打包到jar里面去,很麻烦。 下面对原来的例子添加validator框架支持。 首先,struts默认是不启动validator的,需要再struts-config.xml里面启动这个validator框架,它是以插件的形式提供。 修改如下: 这样就启动了validator框架了。 解释一下参数。 这两个文件就由pathnames这个属性来指明。 接着修改FormBean,要使Validator起作用,必须使FormBean继承Validator提供的ActionForm,这里继承了ValidatorForm。 另外,ValidatorForm自己实现了validate方法,所以FormBean里的validate方法不再需要了。 这样看起来,这个FormBean比原来简单了不少。 最后在validation.xml文件里面配置一下检验参数。 这里的form标签里的name指定的是在struts-config.xml文件里面配置的form-bean的别名。 接着是要检验的字段,这里检验password,检验的是required和minlength。 下面两个arg指定的是属性文件里的属性值,现看下属性文件的配置。 从 而这里的arg就是来填写此属性对应的值所对应的变量的,position=”0”就对应{0},而key就会到属性文件里找对应的属性值,填到哪个{0}里面去。 对于第二个arg,它的resource=”false”,所以它不会去查找属性文件,而是把key里的值直接填到{1}里面去。 而这里面又是个表达式,它是指下面变量名为minlength的值,这里是3。 并且这个3也会作为minlength检验的标准。 当不满足required的时候就会显示passwordisrequired,而长度不够的时候就显示passwordmustlonggerthan3。 这样就比原来的硬编码灵活很多吧! Validator还有很多特性,像可以按Action来验证,而不适按Form来验证,可以扩展,可以验证索引属性,还能跨多个页面验证,除了服务器端的验证,Validator还能进行客户端的js验证。 自己去摸索吧。 Struts2的验证框架就完全不同了。 它有自己的一套验证框架。 而实现起来也比较简单。 对loginAction里的validate可以先注释掉。 然后在LoginAction的同一目录下新建一个LoginAction-validation.xml文件。 这个文件的命名是统一的,类名-validation.xml。 这个就是验证文件了,相当于struts里的validation.xml文件。 配置感觉比validation.xml文件清晰明了。 看下。 对于field标签不难理解吧? 对应的是哪个field,验证什么东西(type),错误提示什么(message),最后一个validator是对逻辑的验证,以表达式的方式来验证,这里是name不能和password相同。 配置完这个文件就ok了,很简单吧。 要看见那些错误信息。 需要修改下jsp页面,改成Struts2标签,如下。 然后运行下看看吧! 这里要说明的是,LoginAction还是要继承ActionSupport的。 因为它要使用addFieldError方法。 当然了,你可以结合validate方法和validator框架来验证。 对Struts来说,需要先调用super.validate(...),而Struts2则不需要。 这里就是实现机制的不同,书上都有说,不想费口舌。 4.与Spring集成 先看Struts2的集成。 Struts2提供了一个与Spring集成的jar包。 struts2-spring-plugin-2.0.11.jar 很明显,要集成Spring就要导入此包。 接着当然是要Spring来管理这个Action了。 Spring将操作类注入到Action中去。 首先建立一个验证接口,来验证用户名和密码,用接口是为了以后扩展的方便,虽然这里只实现了一个类。 接着实现这个接口。 这里当然可以和hibernate,jpa集成了,后话。 接着在LoginAction里面将这个CheckLogin添加进来,如下。 这里只有一个set方法,当然是给Spring注入用的。 那么怎么注入这个类呢。 在注入方面,Spring的applicationContext.xml文件和普通的注入没有一点区别。 注意到这里,scope=”prototype”。 因为Spring默认是singleton的,而Struts则会为每个请求生成一个Action,这里就有了冲突,所以需要将scope设为prototype。 那么问题就是怎么样让这个类的创建交给Spring,而不是Struts2。 需要改动两个地方。 一个是web.xml文件,一个是struts.xml。 Web.xml文件里面添加一个lintener。 而在struts.xml里面,将action的class属性,由类名改成Spring里配置的id名称即可。 这样每次请求过来时,Struts会根据class里的名字向Spring要相应的bean了。 关于Spring里的自动装配,Struts2也有支持的。 找本书看吧。 关于Struts的集成,有几种方式,这里只写一种推荐的方式。 即和上面的方式相同,将CheckLogin注入到Action里面去。 首先看看Spring的配置。 注意到了吧! 这里不是id而是name! 并且这个name要和struts-configure.xml里面的action的path相同,如下 并且这里的type,由原来的类改成了spring里面的类了。 如果你使用的是Spring2.5,那么就要导入spring-webmvc-struts.jar包。 Spring2.5将web给从Springcore里面分离出来了! jar文件在Spring下的dist/modules里面。 接着在web.xml里面配置一个listener 这里的context-param的作用是指明Spring配置文件的位置。 然后将Action改成如下即可。 相对Struts2来说,Struts的集成还是繁琐一点的。 5.集成AJAX 与AJAX的集成应该没什么区别。 直接把AJAX添加进来就可以了。 我最近学习AKoss,所以就以AK为例集成。 AK主要还是做的界面的。 所以呢,重写jsp页面即可。 (可以在jsp页面里面使用zk标签,zk有一套jsp的标签,参考相关内容。 也可以直接写zul文件,这里直接写zul) 关于AK。 请看官方网站。 www.akoss.org Zk文件名以zul为后缀,新建一个login.zul的文件。 输入如下代码。 无视错误! ! ! ! ZK目前就eclipse有个插件,也不完善,纯靠手写。 这里只要name对应,form里面提交的位置对,那就可以了。 修改web.xml文件,添加ZK配置。 这样就可以了。 访问时直接访问login.zul就可以了。 看下结果。 是不是美观了不少! 这样就使用了ZK的组件了,ZK的AJAX特性就能使用了,具体参看ZK吧!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通过 比较 学习 Struts Struts2