Struts 2

来源:互联网 发布:网络模块怎么接线 编辑:程序博客网 时间:2024/04/30 00:39

Struts 2 概述

   Struts 2Struts的下一代产品,是在 struts WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1Struts 2有着太大的变化,但是相对于WebWorkStruts 2只有很小的变化。

Struts 2 工作原理

  

工作原理(2)

Struts技术的发展概况

   经过六年多的发展,Struts1已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明。市场占有率超过20%,拥有丰富的开发人 群,几乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1的局限性也越来越多地暴露出来,并且制约了Struts1的继续发 展。 

  对于Struts1框架而言,由于与JSP/Servlet耦合非常紧密,因而导致了一些严重 的问题。首先,Struts1支持的表现层技术单一。由于Struts1出现的年代比较早,那个时候没有FreeMarkerVelocity等技术, 因此它不可能与这些视图层的模版技术进行整合。其次,Struts1Servlet API的严重耦合,使应用难于测试。最后,Struts1代码严重依赖于Struts1 API,属于侵入性框架。 

  从目前的技术层面上看,出现了许多与Struts1竞争的视图层框架,比如JSF、 TapestrySpring MVC等。这些框架由于出现的年代比较近,应用了最新的设计理念,同时也从Struts1中吸取了经验,克服了很多不足。这些框架的出现也促进了 Struts的发展。目前,Struts已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架 WebWorkStruts2Struts2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传 统的Struts1注入了WebWork的先进的设计理念,统一了Struts1WebWork两个框架。Struts1分化出来的另外一个框架是 Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不 是Struts1的升级。 本文下面的内容将主要讨论Struts2

Struts的体系结构

Struts2应用流程注解

  Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与Servlet API分离。 

  Struts2框架的大概处理流程如下: 

  1、加载类(FilterDispatcher) 

  2、读取配置(struts配置文件中的Action) 

  3、派发请求(客户端发送请求) 

  4、调用ActionFilterDispatcherstruts配置文件中读取与之相对应的Action ) 

  5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证) 

  6、处理业务(回调Actionexecute()方法) 

  7、返回响应(通过execute方法将信息返回到FilterDispatcher) 

  8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESSERROR,将跳转到哪个jsp页面) 

  9、响应用户(jsp--->客户浏览器端显示) 

  10struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)

Struts2Struts1的对比

  通过上面对Struts2体系结构的了解,我们发现Struts2Struts1进行了巨大的改进。主要表现在如下几个方面: 

  在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。 

  线程模型方面:Struts1Action工作在单例模式,一个Action的实例处理所有的请求。Struts2Action是一个请求对应一个实例。没有线程安全方面的问题。 

  Servlet依赖方面:Struts1Action依赖于Servlet API,比如Actionexecute方法的参数就包括requestresponse对象。这使程序难于测试。Struts2中的Action不 再依赖于Servlet API,有利于测试,并且实现TDD。 

  封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。 

  表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNLObject Graph NavigationLanguage)。 

  绑定值到视图技术:Struts1使用标准的JSPStruts2使用“ValueStack”技术。 

  类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。 

  数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。 

  Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。

WebWorkStruts2的对比

   StrutsWebwork同为服务于Web的一种MVC框架,从某种程度上看,Struts2是从WebWork2上升级得到的。甚至Apache 的官方文档也讲:WebWork2Struts2是平滑的过渡。我们甚至也可以说Struts2就是WebWork2.3而已。在很多方面Struts 仅仅是改变了WebWork下的名称。Struts2对应的有自己的标签,并且功能强大。Webwork也有自己的标签。在200512 月,WebWorkStruts Ti决定合并, 再此同时, Struts Ti 改名为 Struts Action Framework 2.0,成为Struts真正的下一代。

编辑本段Struts2中的ActionSupport基类

ActionSupport基类中定义的五个标准返回值

  ActionSupport基类中定义了五个标准的返回值 ,当然我们可以自己随意定义返回的名字 

  String SUCCESS = "success"; //默认是 SUCCESS 类型 

  String NONE = "none"; 

  String ERROR = "error"; 

  String INPUT = "input"; 

  String LOGIN = "login";

ActionSupport基类中的方法

  ActionSupport基类定义了了一些方法,程序员自己写的action如果继承了ActionSupport基类,就可以应用这些方法,很方便解决一些问题。 

  一些比较常用的方法: 

  getText(String aTextName);//国际化用到 

  ...//getText(String aTextName)的重载方法 

  addActionMessage(String aMessage); 

  addFieldError(String fieldName, String errorMessage); 

  //校验失败后返回给客户端的信息,struts2 标签<s:fielderror />可以取得 

  addActionError(String anErrorMessage);

编辑本段Result Type

  在默认时,<result>标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发人员可以根据自己的需要指定不同的类型,如redirectstream等。如下面代码所示: 

  <result name="save" type="redirect"> 

  /result.jsp 

  </result> 

  这此result-type可以在struts2-core-2.0.11.1.jar包或 struts2源代码中的struts-default.xml文件中找到,在这个文件中找到<result-types>标签,所有的 result-type都在里面定义了。代码如下: 

  <result-types> 

  <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> 

  <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> 

  <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> 

  <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> 

  <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> 

  <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> 

  <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> 

  <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> 

  <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> 

  <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> 

  <!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 --> 

  <result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> 

  <result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" /> 

  </result-types> 

  chain 

  用来处理Action链 

  com.opensymphony.xwork2.ActionChainResult 

  dispatcher 

  用来转向页面,通常处理JSP 

  org.apache.struts2.dispatcher.ServletDispatcherResult 

  freemaker 

  处理FreeMarker模板 

  org.apache.struts2.views.freemarker.FreemarkerResult 

  httpheader 

  控制特殊HTTP行为的结果类型 

  org.apache.struts2.dispatcher.HttpHeaderResult 

  redirect 

  重定向到一个URL 

  org.apache.struts2.dispatcher.ServletRedirectResult 

  redirectAction 

  重定向到一个Action 

  org.apache.struts2.dispatcher.ServletActionRedirectResult 

  stream 

  向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据 

  org.apache.struts2.dispatcher.StreamResult 

  velocity 

  处理Velocity模板 

  org.apache.struts2.dispatcher.VelocityResult 

  xslt 

  处理XML/XLST模板 

  org.apache.struts2.views.xslt.XSLTResult 

  plainText 

  显示原始文件内容,例如文件源代码 

  org.apache.struts2.dispatcher.PlainTextResult 

  redirect-action 

  重定向到一个Action 

  org.apache.struts2.dispatcher.ServletActionRedirectResult 

  plaintext 

  显示原始文件内容,例如文件源代码 

  org.apache.struts2.dispatcher.PlainTextResult