黄玲
摘 要:Struts从推出以来得到了广泛应用,是一种优秀的MVC开发框架,却随着应用的不断扩大,也逐渐暴露出了一些不足。Struts2框架是基于WebWork推出的一个新的MVC框架,他与Struts相比,具有较大变化。文章介绍了Struts框架与WebWork框架,系统得分析了Struts2框架的体系结构,通过他与Struts框架对比,重点探讨了Struts2控制器的实现原理,从而总结出Struts2较之Struts框架的优势。
关键词:WebWork;Struts2;控制器;面向切面编程
Struts1框架虽然用的比较广泛,也比较成熟,但在面对其他的MVC的框架来说,虽然有自己的不足之处。为了弥补这些不足,Struts1进行了一些更新,之后就产生了现在的Struts2。
1 Struts1框架
Struts1由两部分控制器组成,他们分别是核心控制器和业务逻辑控制器,核心控制器是有Struts1框架自身提供的,而业务逻辑则是有用户自定义的,由开发者提供。
应用是由请求驱动的,是由客户端的浏览器发送请求,然后被Struts1的核心控制器进行拦截,核心控制器再根据请求来决定是否调用业务逻辑控制器处理请求,当用户请求处理完后,其处理结果通过 jsp现给用户。
Struts1的缺陷:
(1)支持的前台表现比较少。Struts1推出时只能够支持jsp作为前台的表现。
(2)与Servlet API严重耦合,对测试非常不友好。一旦离开了Web容器,测试会非常困难。因为Struts1是完全是基于Servlet API的,所以在Struts1的业务逻辑控制器内部,充满了大量的Servlet API action中的参数,严重依赖Web服务器。
2 WebWork框架
WebWork是建立在名叫Xwork基础之上的框架,他是来自另一个优秀的开源组织opensymphony。Xwork是一个标准的Command模式,简便、灵活且功能强大,而且完全从web层脱离出来。
WebWork采用相互关联较低的设计,系统的action和servlet API不在相互依赖,允许系统从B/S结构向C/S结构转换 WebWork能够支持更多的前台技术。他可以脱离Web应用,通过IOC控制反转与控制反转容器,能让测试更简单。
相对于Struts1,WebWork优点如下:
(1)action无需与Servlet API耦合,使测试更加简便。
(2)action无需与WebWork耦合,代码重用率高。
还可以继承一个父类;但一旦已经继承了一个父类,则仅仅实现WebWork的action接口,包含了一个execute方法。用一个接口来代替继承是一个非常好的优化,用一个接口来实现框架行为,对类的影响较小,继承任意味着该类不能在继承其他父类。
(3)支持更多的前台技术,让画面表现更加灵活。
3 Struts2框架
Struts2是从WebWork继承而来,而非Struts1。因此Struts2框架与WebWork框架相比,只是更改了一些在WebWork框架里的名称。而我们研究他的处理流程,Struts2与Struts1相似,它们都是优控制器构成核心而成的。Struts2的控制器也由两部分组成:核心控制器ServletDispatcher和业务逻辑控制器Action。
Struts2的业务处理流程大致如下:
首先用户从客户端的浏览器输入数据,提交页面,向服务器发送请求。例如 /test/login.action、/reg/register.action;
然后Struts2得到用户请求和数据后,会根据具体的请求来调用合适的Action;
再然后通过拦截器自动对请求应用通用功能,例如:i18n、页面校验等其他功能;
之后调用Action的execute方法,该execute方法将得到用户提交的数据然后进行具体的业务逻辑处理;
最后,处理结果将以各种不同的方式返回到浏览器中,前台页面技术可由开发者自由选择。
我们来看看Struts2的核心控制器ServletDispatcher。
核心控制器其实是一个Filter,由Struts2的框架供给。他会将用户的请求进行筛选,过滤,当客户的请求以.Action结,则Struts2框架会接受该请求,进行处理。Struts2框架会根据.Action的前面部分来分配调用的Action。而我们需要在配置文件struts.xml定义Action与他的实现类之间的一一对应关系。Struts2框架还提供了一系列拦截器,这些拦截器负责传递参数到Action中,并调用Action的execute方法来处理用户请求。
AOP即面向切面编程,也就是所谓的拦截器,在执行开发者业务逻辑之前,或者之后,处理一些共通的功能需求。这样就可以分离出许多跟具体业务逻辑不相关,或者关系并不大的功能,比如说校验用户是否登陆,拦截用户的含有非法字符的请求等等。这样开发者就不需要为这些通用功能分心,只需要将重心放在自己的业务逻辑上便可。增加了代码的重用性,减少了代码的冗余,提高了性能和代码的质量,提高了开发的效率。拦截器可以实现许多功能,使用拦截器只需要在struts.xml,也就是配置文件中配置到需要的拦截器,这样的话安装配置的顺序,拦截器就看在Action执行前后执行。这样具有很好的维护性,如果需求有了变化,则只要修改这个拦截器就可以。
4 Action业务逻辑控制器
Action业务逻辑控制器,由用户自己实现。与Struts1的Action不同,Struts2的Action完全與ServletAPI分离,更加灵活,易于提高效率和质量。Struts2中的Action可以不需要Struts1中的Action那样继承Action父类。
Struts2的action有一个execute方法,这个方法没有参数。在Action中有个不带参数的execute方法,为什么要设计一个不带参数的方法呢, 因为这样的话我们开发的应用不需要部署到Web容器中,即可进行测试,更加灵活,易于提高效率和质量。由于它不依赖于servlet请求,有更强的可移植、可重用性。
Struts2中Action的属性可以实现和Struts1中ActionForm的属性类似的,但实现的方式是不同的功能。在Struts2中,是利用框架提供的拦截器来分析请求,并将请求值赋给Action的对应属性。
用户自己开发的Action类可以不继承任何父类,这样虽然自由,但是很有可能会不规范,或者是增加开发的难度和代码量。所以为了规范这些Action类,Struts2为开发者提供了一个接口,规范了类这个Action类得实现。同时,为了处理一些Web应用中常用的功能,比如国际化网页上的文字,页面数据的有效性的校验,数据的类型转换和数据装载等。用户的Action类继承该类后,大大地简化了Action的开发。
为了能够访问Web应用的原来的ServletAPI,Struts2提供了ActionContext,还有另外一些接口,如ServletContextAware、ServletRequestAware、Servle-tResponseAware。当Action类实现了这些接口,就可以通过这些接口访问ServletAPI实例。
参考文献
[1]飞思科技产品研发中心.Web服务应用开发详解[M].北京:电子工业出版社,2002:189-199.
[2]袁文雯.GSM无线数据传输的研究和应用[D].杭州:浙江大学,2003:6.
[3]赵佳玉,鲍慧.蓝牙技术及其与相关技术的比较[J].电力系统通信,2003(12):15.
[4]王金涛.一种新型分布式无线监测系统[J].计算机工程与应用,2002(13):55-57.