Struts2控制流深度解析
摘要:该文深入分析了Struts 2框架对Web应用程序基本单元request与response过程通用功能的实现细节,着重研究了基于ActionContext与ValueStack的数据传递机制和基于可拔插拦截器的控制功能实现机制,总结了拦截器机制的软件工程原理及优越性。对Struts 2框架的深入掌握和灵活使用及类似框架的开发提供指导和借鉴。
关键词:Struts 2框架;数据转移;值栈(ValueStack);拦截器
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)26-6067-03
Web应用的基本构成单位是请求request和响应response,用户提交包含表单数据(Form)的请求网页,服务器获取其中的请求数据,进行业务处理后将结果包含在响应网页中返回给用户。 在这个过程中,服务器端程序需要完成一系列的操作处理:获取请求表单数据→验证表单数据→字符串类型转换和对象封装→业务处理→结果返回与网页跳转响应。这些操作除了业务处理因应用不同而显示差异外,其他的基本相同[1, 2]。
仅使用JSP(Java Server Page)技术的应用程序需要不断机械地重复实现这些功能操作,阻碍了开发效率的提高。软件框架技术将这些共同的功能操作加以实现,达到了软件重用的目的。程序员专注于业务逻辑的开发,极大地提高了开发效率和软件质量。Struts 2是其中非常优秀的一个Java EE框架,近年来得到开发人员的认可和广泛应用[3-5]。
本文深入分析Struts 2框架中上述通用功能的实现细节,用软件工程理论研究它的实现原理。
1 Struts2控制流程
Request和response是构成web应用程序的基本单元,请求网页提交的表单数据经服务器处理后的结果通过响应网页返回给用户。图1显示了一个JSP请求页面经struts 2框架和业务逻辑程序处理后,响应网页显示结果的流程。
1) 数据进入框架
数据流程从图1的InputForm.jsp开始。在InputForm.jsp页面中,表单包含2个文本输入字段:user.username和user.passwd。用户输入表单数据后,通过HTTP(Hyper Text Transfer Protocol)协议将表单提交给JSP服务器。表单数据被封装在HttpServletRequest对象中,进入Struts 2框架。
2) ActionContext和值栈ValueStack
ActionContext是Action运行的上下文,是一个包含Action运行所需数据的容器。ValueStack是专门存放表单数据的对象,Struts2将值栈设置为ActionContext的根对象,这样,无需使用值栈对象即可访问里面的数据,从而简化访问表达式。例如:由user.username即可访问user对象的属性。Struts 2规定对ActionContext数据的访问使用OGNL(Object Graph Navigation Language)。
除ValueStack外,ActionContext还有Parameters、Request、Session和Application等与web应用程序相关的对象。
实际开发中,可通过ActionInvocation获取到ActionContext,使用以下语句:
ActionContext ctx=actionInvocation.getInvocationContext();
Struts 2框架的一个重要作用是从HttpServletRequest对象中取出表单数据,把请求参数的名字解析为一个OGNL表达式,定位到ValueStack中User对象的相应属性。同时,action对象中的属性直接对应值栈中的对象属性,且直接操纵它。
3) 数据流出框架
与数据流入框架大同小异,只是顺序相反。Struts2在调用业务逻辑、完成数据操作之后,将结果在跳转到的JSP页面呈现。在呈现结果时, Struts2通过标签中的OGNL表达式访问ValueStack,从值栈中取得数据。如图1中,系统要求在ResultPage.jsp中呈现数据,Struts 2通过OGNL表达式user.username从值栈取值。
4) 类型转换
数据无论是流入框架还是流出框架,都要进行类型转换。流入框架时,数据从基于文本的HTTP请求移动到值栈上有类型的JavaBean属性。呈现结果时,反过来将这些JavaBean属性转换为字符串在HTML页面显示。整个类型转换过程为:字符串String类型→Java类型→字符串String类型。
Struts 2框架提供了内建的OGNL类型转换器,实现对HTTP请求中的字符串数据与Java类型之间的转换,这些Java类型可以是String、boolean/Boolean、char、int、Date、Array、List、Map等[6, 7]。
当框架在值栈中定位到OGNL表达式指向的Java属性时,它会查找这个类型的转换器。该转换器管理基于字符串类型的HTTP世界和精确类型的Java世界之间数据的类型转换。
2 Struts2拦截器
Struts2控制流程的完成需要大量实现通用功能的拦截器。每个拦截器彼此独立地完成某个特定功能,它们协作实现Struts 2的控制流程。
3 struts 2的软件工程优势
在struts 2中,每个拦截器实现一个特定的功能,除了与ActionInvocation类关联外,保持完全的独立性:可自由地加入任何拦截器栈,配置给任意一个action组件。这种设计方式实现了软件工程“高内聚,低耦合”的设计原则[8],达到了软件复用,提高软件系统的可扩展性和可维护性的目的。
Struts 2提供了很好的扩展功能,使之能适应更复杂多样的现实需求。如:程序员可以定义新的类型转换类,供params拦截器调用。也可以为action定义新的返回类型,跳转到新的JSP页面[6]。
默认拦截器栈中声明了17种拦截器,解决了web应用程序的大多数情况,但同时也显得十分笨重。Struts 2提供了自定义拦截器栈的机制,可以为不同的action定制轻量、高效的拦截器栈,提高系统运行的效率。
4 总结
本文针对java web应用程序的基本组成单元request和response,深入分析了Struts2框架对这个基本单元的数据流入、处理和数据流出的控制实现过程。着重研究了数据传递的存储机制和控制功能实现的拦截器机制。从软件工程的理论高度分析了这种设计方式的越优性,为struts 2框架的灵活运用及类似框架的开发提供借鉴。
参考文献:
[1] Paul S Wang,Sanda katila.Web设计与编程导论(影印版)[M].北京:高等教育出版社,2004.[2] 张跃平,耿祥义.JSP程序设计[M].北京:清华大学出版社,2009,
[3] 陈顺通,李胡,张卢.基于SSH2框架的高校科研网络管理系统的实现[J].计算机应用与软件,2010,7(27):195-196.
[4] 金纯峰.基于Struts的远程教育系统设计与实现[J].中国新通信,2012(20):21-22.
[5] 章邺.基于Struts2框架的图书馆内部管理系统的研究[J].长春大学学报,2011,6(21):42-44.
[6] Donald Brown,Chad Michael Davis,Scott Stanlick.Struts 2实战[M].马召,译.北京:人民邮电出版社,2010.
[7] 李刚.轻量级javaEE企业应用实战[M].3版.北京:电子工业出版社,2012.
[8] 张海藩,牟永敏.软件工程导论[M].6版.北京:清华大学出版社,2013.
下一篇:计算机软件开发技术的应用