struts2 详解

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。struts使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。

Struts 2 相比Struts 1的优点:

1、在软件设计上Struts 2 没有像Struts 1那样跟Servlet API 和 struts API 有着紧密的耦合。

Struts 2的应用可以不依赖于Servlet API和Struts API 。

2、Struts 2 提供了拦截器,利用拦截器可以进行AOP编程。

3、Struts 2 提供了类型转换器。

4、Struts 2 提供支持多种表现层技术,如:JSP 、 freeMarker等。

5、Struts 2 的输入校验可以指定方法进行校验。

6、Struts 2 提供了全局范围、包范围和Action范围的国际化资源文件管理实现。

struts2 的工作原理:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的HttpServletRequest请求

2、这个请求经过一系列的过滤器(Filter)【ActionContextCleanUp的可选过滤器(延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除)】

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

   ActionInvocation是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而                       DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。

Interceptor的调度流程大致如下:

1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。

2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

struts2 拦截器

   拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是aop的一种实现

   拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用

工作原理:

拦截器实现类

struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。

该接口声明了3个方法

  void init();

  void destroy();

  String intercept(ActionInvocation invocation) throws Exception;

抽象类AbstractInterceptor实现了Interceptor接口,提供了init和destroy方法的空实现。如果我们的拦截器不需要打开资源,则可以无需实现这两个方法。可通过继承AbstractInterceptor抽象类来实现自定义拦截器会更简单】

 1 package interceptor;
 2 import com.opensymphony.xwork2.ActionInvocation;
 3 import com.opensymphony.xwork2.interceptor.Interceptor;
 4 public class MyInterceptor implements Interceptor {
 5   public void destroy() {
 6   // TODO Auto-generated method stub
 7   }
 8   public void init() {
 9   // TODO Auto-generated method stub
10   }
11   public String intercept(ActionInvocation invocation) throws Exception {
12       System.out.println("Action执行前插入 代码");
13     //执行目标方法 (调用下一个拦截器, 或执行Action)
14       final String res = invocation.invoke();
15       System.out.println("Action执行后插入 代码");
16       return res;
17   }18 }

自定义拦截器,拦截器

 1 <package name="custom" extends="struts-default" namespace="/">
 2         <interceptors>
 3         <!-- 定义拦截器 -->
 4         <interceptor name="拦截器名" class="拦截器实现类"/>
 5         <!-- 定义拦截器栈 -->
 6         <interceptor-stack name="拦截器栈名">
 7              <interceptor-ref name="拦截器一"/>
 8              <interceptor-ref name="拦截器二"/>
 9         </interceptor-stack>
10         </interceptors>
11
12 </package>

使用拦截器

1 <action name="user" class="com.userAction">
2             <result name="success">/success.jsp</result>
3             <result name="error">/error.jsp</result>
4             <!-- 使用拦截器,一般配置在result之后, -->
5             <!-- 引用系统默认的拦截器 -->
6        <interceptor-ref name="defaultStack"/>
7             <interceptor-ref name="拦截器名或拦截器栈名"/>
8 </action>

如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,需要在自己定义的拦截器栈中手动引入了默认拦截器。

【默认的拦截器中有一个名为params的拦截器,它的作用是“将请求的参数设置到Action中”,也就是说,如果你从页面中传值到Action,即拦截请求参数,并赋值给action里的属

性,而且你自定义的拦截器要用到这些值栈中的值,则你的拦截器栈中,需要在自定义拦截器前面加上默认的拦截器】

  struts2 已经为您提供丰富多样的,功能齐全的拦截器实现。在struts2的jar包内的struts-default.xml可以查看到关于默认的拦截器与拦截器链的配置。


拦截器


名字


说明


Alias Interceptor


alias


在不同请求之间将请求参数在不同名字件转换,请求内容不变


Chaining Interceptor


chain


让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。


Checkbox Interceptor


checkbox


添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。


Cookies Interceptor


cookies


使用配置的name,value来是指cookies


Conversion Error Interceptor


conversionError


将错误从ActionContext中添加到Action的属性字段中。


Create Session Interceptor


createSession


自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。


Debugging Interceptor


debugging


提供不同的调试用的页面来展现内部的数据状况。


Execute and Wait Interceptor


execAndWait


在后台执行Action,同时将用户带到一个中间的等待页面。


Exception Interceptor


exception


将异常定位到一个画面


File Upload Interceptor


fileUpload


提供文件上传功能


I18n Interceptor


i18n


记录用户选择的locale


Logger Interceptor


logger


输出Action的名字


Message Store Interceptor


store


存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。


Model Driven Interceptor


model-driven


如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。


Scoped Model Driven


scoped-model-driven


如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。


Parameters Interceptor


params


将请求中的参数设置到Action中去。


Prepare Interceptor


prepare


如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。


Scope Interceptor


scope


将Action状态存入session和application的简单方法。


Servlet Config Interceptor


servletConfig


提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。


Static Parameters Interceptor


staticParams


从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。


Roles Interceptor


roles


确定用户是否具有JAAS指定的Role,否则不予执行。


Timer Interceptor


timer


输出Action执行的时间


Token Interceptor


token


通过Token来避免双击


Token Session Interceptor


tokenSession


和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中


Validation Interceptor


validation


使用action-validation.xml文件中定义的内容校验提交的数据。


Workflow Interceptor


workflow


调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面


Parameter Filter Interceptor


N/A


从参数列表中删除不必要的参数


Profiling Interceptor


profiling


通过参数激活profile

如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈

 1 <struts>
 2     <package name="test" extends="struts-default" namespace="/">
 3
 4         <interceptors>
 5             <!-- 定义拦截器 -->
 6             <interceptor name="customInterceptor"
 7                 class="com.testInterceptor" />
 8             <!-- 定义一个拦截器栈 -->
 9             <interceptor-stack name="mydefault">
10                 <interceptor-ref name="defaultStack" />
11                 <interceptor-ref name="customInterceptor" />
12             </interceptor-stack>
13         </interceptors>
14
15         <!-- 定义默认拦截器 -->
16         <default-interceptor-ref name="mydefault" />
17
18         <!-- 定义全局处理结果 -->
19         <global-results>
20             <!-- 逻辑名为login的结果,映射到/login.jsp页面 -->
21             <result name="login">/login.jsp</result>
22         </global-results>
23
24         <action name="user" class="com.UserAction" >
25             <result name="success">/success.jsp</result>
26         </action>
27     </package>
28
29     <package name="test1" extends="struts-default" namespace="/">
30         <action name="admin" class="com.UserAction" >
31             <result name="success">/success.jsp</result>
32         </action>
33     </package>
34 </struts>

一旦在某个包下定义了默认拦截器栈,在该包下的所有action都会使用此拦截器栈。对于那些不想使用这些拦截器栈的action,则应该将它放置在其它的包下【如:test1】

拦截器与过滤器的区别:

  1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
   2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
   3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
   4.拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
   5.在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

参考:http://blog.csdn.net/laner0515/article/details/27692673/

   http://blog.csdn.net/qjyong/article/details/1824607

时间: 2024-10-05 21:24:34

struts2 详解的相关文章

JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置

Action接受请求参数 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中 Struts2提供了非常强大的类型转换机制用于请求数据 到 model对象的封装 Struts2和MVC定义关系 StrutsPrepareAndExecuteFilter:控制器 在Struts2中action是什么?(Struts2是一个MVC框架) V:jsp M:action C:action StrutsPrepareAndExecuteFilter Struts2提供了三种数据封装

JAVAWEB开发之Struts2详解(一)——Struts2框架介绍与快速入门、流程分析与工具配置以及Struts2的配置以及Action和Result的详细使用

Struts2框架介绍 三大框架:是企业主流JavaEE开发的一套架构.Struts2 + Spring + Hibernate 什么是框架?为什么要学习框架? 框架是实现部分功能的代码(半成品),使用框架简化企业级软件开发. Struts2与MVC? Struts是一款优秀的MVC框架 MVC:是一种思想,是一种模式,将软件分为Model模型.View视图.Controller控制器 JAVAEE软件三层架构:web层(表现层).业务逻辑层.数据持久层(Sun提供javaEE开发规范) Jav

Struts2学习第三课 Struts2详解

接着上次的课程 这次我们看struts.xml 修改如下:这里是加上命名空间,默认的是不加,我们手动加上时就要在访问时加上命名空间. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts

Struts2详解

 struts2框架是SSH框架集中的框架之一,是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器层(Controller)来建立模型与视图的数据交互. 在使用struts2框架的过程中,需要两个配置文件,分别为web.xml和struts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件stru

Struts2中 Result类型配置详解(转)

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:public interface Action{    public static final String SUCCESS =

Struts2中 Result类型配置详解

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出. 在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示: public interface Action {     public static final String SUCCES

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

【SSH2(理论篇)】--Struts2配置详解

上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容. 一.Struts体系简介 struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-V

【转】Struts2中的OGNL详解 (1)

 转载声明:菰☆淚 - Struts2中的OGNL详解 首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlCont