基于mvc模式的struts2框架的开发

来源:互联网 发布:数据治理的目的和意义 编辑:程序博客网 时间:2024/04/30 10:15

最近利用struts2框架做了几个小型的项目开发又重新研究了一下这个基于mvc的流行框架,偶有心得想写下来和各位分享。

struts2实际是并不是struts1的升级版而是struts1与webwork的结合体。Struts 1框架以ActionServlet作为核心控制器,整个应用由客户端请求驱动。当客户端向Web应用发送请求时,请求将被Struts 1的核心控制器ActionServlet拦截,ActionServlet根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制器还是控制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过JSP呈现给用户。在实现业务逻辑时,是通过实现Action类来实现。在有数据传输的时候还要实ActionFrom类。并且在struts的配置文件中要配置Action和ActionFrom这两个类。对于Struts 1框架而言,因为它与JSP/Servlet耦合非常紧密,因而导致了许多不可避免的缺陷,随着Web应用的逐渐扩大,这些缺陷逐渐变成制约Struts 1发展的重要因素——这也是Struts 2出现的原因。

下面具体分析Struts 1中存在的种种缺陷。

1)支持的表现层技术单一。

2)与Servlet API严重耦合,难于测试。

3)代码严重依赖于Struts 1 API,属于侵入式设计。

相对于struts1的缺陷webwork显得更加的优秀。它采用了一种更加松耦合的设计,让系统的Action不再与Servlet API耦合。使单元测试更加方便,允许系统从B/S结构向C/S结构转换。

WebWork 2使用OGNL这个强大的表达式语言,可以访问值栈。OGNL对集合和索引属性的支持非常强大。

WebWork建立在XWork之上,使用ServletDispatcher作为该框架的核心控制器,处理HTTP的响应和请求。

从处理流程上来看,WebWork与Struts 1非常类似,它们的核心都由控制器组成,其中控制器都由两个部分组成:

— 核心控制器ServletDispatcher,该控制器框架提供。

— 业务逻辑控制器Action,该控制器由程序员提供。

相对Struts 1的Action与Servlet API紧紧耦合的弱点来说,WebWork的Action则完全与Servlet API分离,因而该Action更容易测试。

WebWork的Action可以与Servlet API分离,得益于它灵巧的设计,它使用一个拦截器链,负责将用户请求数据转发到Action,并负责将Action的处理结果转换成对用户的响应。

前面说了struts2的出现前提下面我就开始说一下struts2的特点与使用。

Struts 2框架的大致处理流程如下:

 浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。

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

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

 回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。

 Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。

Struts 2的配置文件有两份:

— 配置Action的struts.xml文件。

— 配置Struts 2全局属性的struts.properties文件。

<struts>

                                 <!-- Struts 2的Action都必须配置在package里 -->

                                 <package name="default" extends="struts-default">

                                    <!-- 定义一个Logon的Action,实现类为lee.Logon -->

                                  <action name="Logon" class="lee.Logon">

                                        <!-- 配置Action返回input时转入/pages/Logon.jsp页面 -->

                                   <result name="input">/pages/Logon.jsp</result>

                                        <!-- 配置Action返回cancel时重定向到Welcome的Action-->

                                   <result name="cancel" type="redirect-action">Welcome</result>

                                        <!-- 配置Action返回success时重定向到MainMenu的Action -->

                                   <result type="redirect-action">MainMenu</result>

                                        <!-- 配置Action返回expired时进入ChangePassword的Action链 -->

                                   <result name="expired" type="chain">ChangePassword</result>

                                  </action>

                                    <!-- 定义Logoff的Action,实现类为lee.Logoff -->

                                  <action name="Logoff" class=" lee.Logoff">

                                        <!-- 配置Action返回success时重定向到MainMenu的Action -->

                                   <result type="redirect-action">Welcome</result>

                                  </action>

    </package>

</struts>

 

原创粉丝点击