通过比较来学习Struts和Struts2.docx

上传人:b****8 文档编号:23565483 上传时间:2023-05-18 格式:DOCX 页数:22 大小:224.67KB
下载 相关 举报
通过比较来学习Struts和Struts2.docx_第1页
第1页 / 共22页
通过比较来学习Struts和Struts2.docx_第2页
第2页 / 共22页
通过比较来学习Struts和Struts2.docx_第3页
第3页 / 共22页
通过比较来学习Struts和Struts2.docx_第4页
第4页 / 共22页
通过比较来学习Struts和Struts2.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

通过比较来学习Struts和Struts2.docx

《通过比较来学习Struts和Struts2.docx》由会员分享,可在线阅读,更多相关《通过比较来学习Struts和Struts2.docx(22页珍藏版)》请在冰豆网上搜索。

通过比较来学习Struts和Struts2.docx

通过比较来学习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来说,配置如下

就是配置FormBean嘛!

name就是起个别名,当要改变FormBean的时候,只要修改type指向需要的FormBean就可以了,而其他都不需要改变。

就是配置哪个页面由哪个Action来处理的,path的用途就是,从此path过来的请求由此action来处理。

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框架了。

解释一下参数。

就是插件了,value的值是两个xml的路径,一个是自己创建的validation.xml文件,一个是在jar包里的validator-rules.xml文件。

这两个文件就由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指定的是属性文件里的属性值,现看下属性文件的配置。

这个开始解释,当验证不通过的时候,struts会自动到属性文件里面找对应的错误信息,这里的required队形errors.required,minlength对应errors.minlength。

而这里的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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1