Struts2框架技术的研究与分析

时间:2022-04-27 05:18:09

Struts2框架技术的研究与分析

摘要:作为一个优秀的MVC框架,Struts得到了广泛应用。然而,随着应用领域的扩大,也逐渐暴露出了一些不足。Struts2框架是新推出的一个MVC框架,基于WebWork核心,与Struts相比,具有较大变化。介绍了Struts框架与WebWork框架,详细分析了Struts2框架的体系结构,通过与Struts框架对比,重点探讨了Struts2控制器的实现原理,总结出Struts2的优势。

关键词:WebWork;Struts1;Struts2;控制器;拦截器;视图层

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)33-1312-02

Research and Analysis of Technology Based on Struts2

GENG Wei, LIU Zhen-hai, SUN Lei

(China University of Mining and Technology, Xuzhou 221008, China)

Abstract: Struts has being applied widely as an excellent framework based on MVC pattern. while the shortage of Struts has being discovered gradually with the expansion of applications. Struts2 is a new MVC framework based on the core of WebWork framework. By contrast with Struts, Struts2 has changed greatly. Describes the WebWork and Struts1 framework, and expatiates the architecture of Struts2. By contrasting Struts2 and Struts, emphatically discusses the principle of the controller, and summarizes the advantage of using Struts2.

Key words: webwork; struts1; struts2; controller; interceptor; viewer

Struts2是APACHE新推出的一个框架,于2007年上半年。此前的Struts框架被称为Struts1。它是世界上的第一个MVC框架,得到了广泛应用,至今已发展成为一个成熟、稳定、性能较高的框架。尽管Struts1框架已经非常地成熟、可靠,但面对大量新兴的MVC框架,Struts1逐渐地暴露出了自身的不足,需要不断地进行更新。因此,Struts2便应运而生了。

相对于Struts1框架而言,Struts2框架是一个全新的框架,尽管两个框架在名字上相似,但Struts2框架和Struts1框架在体系上的差别非常大。实际上,Struts2并非一个全新的框架,因为Struts2和另外一个MVC框架WebWork非常相似,Struts2是基于WebWork核心的。Struts2更像是一个WebWork的升级版本,从WebWork到Struts2到是一次平滑的过渡。

1 WebWork框架

WebWork框架来自另一个优秀的开源组织opensymphony。WebWork是建立在名叫Xwork的项目基础之上的。

Xwork简洁、灵活且功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截器(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL,the Object Graph Notation Language),IoC(Inversion of Control反转控制)容器等。

Webwork2建立在Xwork之上,处理HTTP的响应和请求。Webwork2使用ServletDispatcher将HTTP请求变成Action(业务层Action类)、session(会话)及application(应用程序)范围的映射,request请求参数映射为Webwork2支持的多视图表示,视图部分可以使用JSP、Velocity、FreeMarker、JasperRepots、XML等[1]。

2 Struts1框架

Struts1的视图部分由JSP实现。Struts1提供了丰富的标签库,通过这些标签库可以减少脚本的使用。Struts1提供了与Ties框架的整合,通过Ties框架提供的模板机制,可以提高网页的可重用性和可扩展性。但Struts1所支持的表现技术仍非常单一。ActionForm Bean作为数据传输对象(DTO),用于在视图和控制器之间传递数据。ActionFormBean通常被划分到视图层。

Struts1的控制器由两部分组成:系统核心控制器和业务逻辑控制器。系统核心控制器为ActionServlet,它继承HttpServlet类,负责接收所有的HTTP请求,然后根据用户请求决定是否需要调用业务逻辑控制器。如果需要调用业务逻辑控制器,则将请求转发给Action处理,否则直接转向请求的JSP页面。业务逻辑控制器是用户自定义的Action类,需要继承系统的Action类,负责调用模型方法,充当用户请求和业务逻辑处理之间的适配器[2]。

Struts1的程序运行流程如图1所示。

图1 Struts1的程序运行流程

3 Struts2框架

Struts2使用了WebWork设计核心,而不是Struts1设计核心。Struts2框架与WebWork框架相比,在很多方面仅仅是改变了其在WebWork下的名称。图2为Struts2体系概图。

从处理流程上看,Struts2(WebWork)与Struts1类似,它们的核心都由控制器组成。Struts2的控制器也由两部分组成:核心控制器ServletDispatcher和业务逻辑控制器Action。

Struts2的处理流程如下:

浏览器发出请求。

核心控制器FilterDispatccher根据请求决定调用合适的Action。

拦截器链自动对请求应用通用功能,如workflow、validation、或文件上传等功能。

回调Action的execute方法,该方法获取用户的请求参数,并调用业务逻辑。

Action的execute方法根据执行结果返回result值,在struts.xml配置文件中,指定result值和视图资源之间的映射关系。Struts2支持的视图资源除了JSP以外,还有Velocity、FreeMarker等。

3.1 核心控制器ServletDispatcher

核心控制器是一个Filter,由框架提供。当用户的请求到达时,它会过滤所有的用户请求,如果用户请求以Action结尾,该请求将被转入Struts2框架处理。Struts2框架根据请求*.action的“*”部分决定调用哪个Action。Action和其实现类之间的对应关系都定义在struts.xml文件中。Struts2框架提供了一系列拦截器,这些拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。

Interceptor(拦截器)将Action共用的行为独立出来,在Action执行前后运行。这其实就是AOP(Aspect Oriented Programming,面向方面编程)。Interceptor将很多功能从用户的Action中独立出来,减少了Action的大量代码,独立出来的行为具有很好的重用性。Struts2的许多功能都是由Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照指定的顺序,在Action执行前后运行。这就将需求功能从不相关类中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。这种处理方式是典型的AOP处理方式。

图2 Struts2体系概

3.2 业务逻辑控制器Action

业务逻辑控制器Action,由用户自定义。与Struts1的Action不同,Struts2的Action完全与Servlet API分离,因而该Action更容易测试。Struts2中的Action不再像Struts1中的Action那样需要继承Action父类,它可以无需实现任何接口,一个POJO就可以充当Struts2的Action。下面是一个以POJO作为Action的例子:

Public class LoginAction

{ private String username;

private String password;

public String getUsername()

{return username;}

public void setUsername(String username)

{this.username=username;}

public String getPassword();

{return password;}

public void setPassword(String password)

{this.password=password;}

public String execute() throws Exception

{if(getUsername().equals("Struts2")

&& getPassword().equals("123456")

{return "success";}

else

{return "error";}

}

}

从以上代码可以看出,这个Action与POJO的区别就是多了一个无参数的execute方法。在Action的execute方法中,不需要任何参数,这样设计的一个明显好处是,不需要把整个Web应用部署到Web容器中,即可对所写的Action类进行测试,这给开发人员带来了极大方便。由于它不依赖于servlet请求,更增强了它的可移植、可重用性[2]。

Struts2中Action的属性可以实现和Struts1中ActionForm的属性相当的功能,可实现表单数据的封装,但它们实现的方式是不同的。在Struts2中,是利用框架提供的Interceptor来解析用户请求,并将请求值赋给Action的对应属性。

为了让用户开发的Action处理类更规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应实现的规范。另外,Struts2还提供了Action类的实现类ActionSuport。该类提供了许多默认方法,包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等,用户的Action类继承该类后,将大大简化Action的开发。

Struts2提供了一个ActionContext类,通过该类可以访问Servlet API。利用ActionContext来访问Servlet API,不能直接获取Servlet API实例,为了在Action中直接访问Servlet,Struts2还提供了一系列接口:ServletContextAware、ServletRequestAware、ServletResponseAware,Action类实现这些接口,可获得Servlet API实例。

3.3 Struts2视图层

Struts2的视图部分通过大量的标签提供支持。Struts2标签库是Struts2的重要组成部分,Struts2标签库提供了非常丰富的功能,这些标签库不仅提供了表现层的数据处理,而且提供了流程控制功能、国际化、Ajax支持等功能。

与Struts1标签相比,Struts2标签使用OGNL表达式作基础。因此,对集合、对象的访问非常便利。Struts2标签库将所有标签都统一到一个标签库下,简化了用户对标签库的使用。

Struts2标签库整合了Dojo的支持,因此,可以生成更多页面表示效果。Struts2提供了许多额外的标签,包括如日期时间选择器,树形结构等。除此之外,借助于底层的DWR支持,Struts2标签库提供了Ajax支持,可以通过使用Struts2标签库来非常轻松地完成各种Ajax效果。

Struts2提供了主题、模板支持,极大简化了视图页面的编写,而且它们有很好的可扩展性,如果现有的主题、模板不能满足项目需求,完全可以开发自定义的主题、模板、可以实现更好的代码复用;Struts2还允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂多变的需求[3]。

同WebWork一样,Struts2对多种表现层技术:JSP、Velocity和FreeMarker等都有很好的支持,从而给开发者更多的选择,提供了更好的兼容性。

4 结语

Struts2核心控制器使用拦截器机制,具有更高的灵活性和可复用性;Struts2业务逻辑控制器Action可自定义,可不直接与任何的Servlet耦合,增加了代码的可复用性且更易于测试;Struts2视图层提供了丰富的标签库,而且还支持除JSP以外的其它表现层技术。此外,Struts2还提供了非常灵活的扩展方式:插件。理论上,Struts2可通过插件与任何框架整合,这极大地提高了Struts2的可扩展性。Struts2是一个有前途的框架。

参考文献:

[1] 唐善成.Webwork原理初探[J].电脑知识与技术,2005(6):83.

[2] 孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M].北京:电子工业出版社,2006:15.

[3] 李刚.Struts2权威指南[M].北京:电子工业版社,2007:309.

上一篇:用photoshop打造个性网站logo 下一篇:网管系统的性能模糊综合评价模型