Struts2框架基础概念总结

一、struts2框架

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2在Struts1融合webwork。

ONGL表达式:就是对象图形化导航语言,在前端页面中,访问action的属性、方法;类似于认为就是对JSP的封装,是编程更加方便。(以下详解)

二、framework(框架)

一个基本概念上的结构,用于去解决或者处理复杂的问题,框架是在特定的领域内解决问题。

框架的优点:

(1)重用代码大大增加,软件生产效率和质量也得到了提高

(2)使用框架开发,它提供统一的标准,大大降低了我们的后期维护。

三、Struts2框架运作

工作流程:
(1)客户端浏览器发送HTTP请求到Web应用
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端。

四、Struts2执行流程

  1. Struts2源码导入(Struts2官网下载地址:https://struts.apache.org/

(1) struts2核心部分源代码org.apache.struts2xx : src\core\src\main\java

    (2) struts2的xwork核心部分源代码 :src\xwork-core\src\main\java\com\opensymphony\xwork2

    (3)struts2的插件的源代码: src\plugins

   2.关于struts.xml的中文乱码

   第一步:

    在eclipse的window下首选面中查找xml  catalog

   第二步:

    Location:配置本地的dtd文件路径

    key type:选择URI

    Key: http://struts.apache.org/dtds/struts-2.3.dtd

  注意版本要对应,如果你可以上网,那么会自动缓存dtd,具有提示功能。

  3.执行流程介绍

    1.当通过浏览器发送一个请求

    2.会被StrutsPrepareAndExecuteFilter拦截

    3.会调用struts2框架默认的拦截器(interceptor)完成部分功能

    4.在执行Action中操作

   5.根据Action中方法的执行结果来选择来跳转页面Resutl视图一般管StrutsPrepareAndExecuteFilter叫做前端控制器(核心控制器),只有配置了这个filter,Struts2框架才能使     用,Struts2的默认拦截器(interceptor)它们是在struts-default.xml文件中配置。

  注意:这上xml文件是在struts-core.jar包中,默认的拦截器是在defaultStack中定义的。

五、Struts2配置详解

  1. Struts2配置文件加载顺序

   init_DefaultProperties()加载的是 default.properties 文件

    位置:struts2-core.jar 包 org.apache.struts2 包下

    作用:主要是声明了 struts2 框架的常量

  init_TraditionXmlConfigurations()加载的是一批配置文件

    Struts-default.xml

    位置:struts2-corl.jar

    作用:声明了 interceptor result bean

    Struts-plugin.xml

    位置:在 struts2 的插件包中

    作用:主要用于插件的配置声明

    Struts.xml

    位置:在我们自己的工程中

    作用:用于我们自己工程使用 struts2 框架的配置

    init_LegacyStrutsProperties()加载的是自定义的struts.properties

    位置:都是在自己工程的 src 下

    作用:定制常量

    init_CustomConfigurationProviders()自定义配置提供

    init_FilterInitParmeters()加载的是 web.xml 配置文件

    主要是加载 struts2 框架在 web.xml 文件中的相关配置.

    init_AliasStandardObjects() bean 相关配置

    重点掌握:

     1.Default.properties

     2.Struts-default.xml

       3.Struts-plugin.xml

     4.Struts.xml

     5.web.xml

 2.struts.xml件配置介绍

(1) package配置(strust.xml只存在一个package相当于一个struts的项目)

   name属性作用:定义一个包的名称,它必须唯一。

    namespace属性作用:主要是与action标签的name属性联合使用来确定一个 action的访问路径。

    extends属性作用:指定继承自哪个包。一般值是struts-default,struts-default包是 在struts-default.xml文件中声明的。

    abstruct属性它代表当前包是一个抽象的,主要是用于被继承。

(2) action配置(对应相应的以action结尾的类,一个package可以有多个action)

name属性作用:主要是与package的namespace联合使用来确定action的访问路径。

class属性作用:用于指示当前的action类。

   method属性作用:用于指示当前的action类中的哪个方法执行。

(3) result配置(用于显示视图的结果)

name属性作用是与action类的method方法的返回值进行匹配,来确定跳转路径。

   type属性作用是用于指定跳转方式。

六、Action类详解

Action类相当于javaWeb阶段下的Servlet类,做着调用service层的关系,实现页面的 跳转,完成业务逻辑操作。

  1. Action类的创建(注意:action类的全路径(即包名)必须含有action的词汇)

   (1) 创建一个POJO类;(hibernate自动会封装成PO类)

   (2) 创建一个类实现一个Action接口;

   (3) 创建一个类继承ActionSupport类。

  2. 访问Action类

   (1) 直接通过<action>标签来配置,通过method来指定访问的方法,如果method没有,默认访问的是execute方法;

   (2) 简化的 action 访问方式,可以使用*通配符来访问,使用*来简化操作方案,它对名称规范必须进行一个统一。

七、Struts2框架封装数据

  1. 属性驱动

    直接在 action 类中提供与请求参数匹配属性,提供get/set方法在, action 类中创始一个javaBean,对其提供get/set,在请求时页面上要进行修改,例如 user.username     user.password ,要使用ognl表达式

    以上两种方式的优缺点:

      第一种比较简单,在实际操作我们需要将action的属性在赋值给模型(javaBean)去操作;

      第二种:不需要在直接将值给javaBean过程,因为直接将数据封装到javaBean中。它要求在页面上必须使用ognl表达式,就存在页面不通用问题。

  2. 模型驱动

         (1)让 Action 类要实现一个指定接口 ModelDriven;

  (2)实例化模型对象(就是要new出来javaBean);

    (3)重写getModel方法将实例化的模型返回。

八、Struts2中获取Servlet

  1.ServletActionContext获取

    获取request: ServletActionContext.getRequest();

    获取response: ServletActionContext.getResponse();

    获取servletContext: ServletActionContext.getServletContext();

  2.采用注入方式

  Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor默认执行的拦截器是struts-default.xml文件中定义的,在默认执行的拦截器中有一个。

  ServletRequestAware, 实现这个接口可以获取HttpServletRequest;

  ServletResponseAware ,实现这个接口可以获取HttpServletResponse;

  ServletContextAware 实现这个接口可以获取ServletContext;

九、OGNL表达式

  OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

  Struts2框架内置了OGNL,OGNL本身也是一个项目,它是可以单独使用。

  OGNL作用:

    支持对象的操作,调用对象的方法;

    支持静态成员访问;

    支持赋值操作与表达串联;

    访问OGNL上下文,访问ActionContext;

    操作集合对象。

  Strtus2框架中如何使用ognl表达式

    在struts2框架中我们使用ognl表达式的作用是从valueStack中获取数据,在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上来获取相关的数据,要想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签<s:property value=”表达式”>来使用。

十、valueStack(值栈)

1. valueStack介绍

valueStack的主要目的是为action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,在Struts2框架中将valueStack设计成一个接口,当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题,一个valueStack对应一个action,valueStack贯穿整个action的生命周期,struts2框架将valueStack保存在request中。

2. valueStack内部结构

valueStack主要有两部分组成:

CompoundRoot:它就是一个ArrayList它主要存储的是action的相关数据;

Map<String,Object> context:就是一个Map,Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息;

pameters :请求参数;

request:请求对象中所有属性;

session:会话对象中所有属性;

application:application对象中的所有发展;

在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,如果使用#来获取,这时就会从context中来获取。

3. 获取ValueStack

(1) 通过request对象来获取;

ValueStack  vs =  (ValueStack)ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

(2) 通过ActionContext来获取

ValueStack  vs =  ActionContext.getServletContext()getValueStack();

4. ActionContext

ActionContext它是action上下文,Strtus2框架它使用ActionContext来保存Action在执行过程中所需要的一些对象,例如 session, application… ActionContext的获取  是通过它的静态方法getContext()得到。Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack。它们都对应着一次请求(一个线程),valueStack与ActionContext本质上是可以获取。

5. ValueStack存储数据

(1) 手动向valueStack存储数据;

vs.push(String str); 和 vs.set(Object obj  String str);

(2) Struts2框架自动向valueStack中存储数据;

每次请求,访问action,这个对象会存储到valueStack中。

在DefaultActionInvocation的init方法内,调用:vs.push(Action action);

在ModelDrivernInterceptor中,调用ModelDrivern的getModel()方法;

6. ValueStack获取数据

(1). Jsp页面获取,导入s标签库

<s:property  value = “ “ />

(2). 在Action中属性

调用PO类getter方法;

(3). 在Model类中(即模型驱动)

调用getModel()方法;

7. EL表达式从ValueStack中获取数据

El表达式可以从valueStack中获取信息,在jsp页面中显示:如:{$ model.name},org.apache.struts2.dispatcher.StrutsRequestWrapper这个类可以使ValueStack使用EL表达式,Struts2框架对request进行了增强,重写了getAttribute方法,如果在request域中查找不到数据,就会在valueStack中获取。

8. Ognl表达式中特殊字符

OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用,#号:它是从非root中获取数据,%号用于强制是否要解析ognl表达式,$号主要是从配置文件中来获取valueStack中数据。

十一、Interceptor拦截器

1. Interceptor拦截器介绍

Struts2中的interceptor它是基于spring aop思想,而aop思想它本质上是通过动态代理来实现。我们strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作。

拦截器链(拦截器栈)简单说,就是可以将多个拦截器形成一个链,在访问它们时依次访问。执行图见上图;

执行的过程:

当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截在其doFilter方法内执行了execute.executeAction(request, response, mapping);这个代码执行后dispatcher.serviceAction(request, response, mapping);serviceAction方法执行在这个方法执行过程中会创建Action代理对象ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);通过proxy去执行了proxy.execute();在execute方法内return invocation.invoke();invocation它是ActionInvocation一个对象。会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。在struts-default.xml文件中定义了默认加载的拦截器栈 defaultStack,在每一个拦截器的interceptor方法内,又调用了DefaultActionInvocation的invoke方法,其实就是递归调用。

2. 自定义Interceptor

所有的Interceptor都要实现一个接口,在配置文件中声明Interceptor,可以将多个interceptor封装成一个stack,可以在Action的配置中引入自己的interceptor,在使用时name也可以引入一个interceptor stack。注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入。

十二、Struts2注解开发(现阶段主流)

1. xml文件与注解互换

@Namespace来代替<package  namespace=””>

@ParentPackage来代替<package extends=””>

@Action来描述关于<action>配置

value属性<action name=””>

使用@Action的results来描述关于结果类型的配置<result>

<result name=”” type=””>

@Action(results={@Result(name=””,type=””,location=””)})

2. 其他注解

@Actions

作用:可以通过多个映射来访问同一个action;

@Results

类似于全局的结果视图;

@InterceptorRef

它是用于处理拦截器的;

一、struts2框架

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2在Struts1融合webwork。

ONGL表达式:就是对象图形化导航语言,在前端页面中,访问action的属性、方法;类似于认为就是对JSP的封装,是编程更加方便。(以下详解)

二、framework(框架)

一个基本概念上的结构,用于去解决或者处理复杂的问题,框架是在特定的领域内解决问题。

框架的优点:

(1)重用代码大大增加,软件生产效率和质量也得到了提高

(2)使用框架开发,它提供统一的标准,大大降低了我们的后期维护。

三、Struts2框架运作

工作流程:
(1)客户端浏览器发送HTTP请求到Web应用
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端。

四、Struts2执行流程

  1. Struts2源码导入(Struts2官网下载地址:https://struts.apache.org/

(1) struts2核心部分源代码org.apache.struts2xx : src\core\src\main\java

(2) struts2的xwork核心部分源代码 :

src\xwork-core\src\main\java\com\opensymphony\xwork2

(3)struts2的插件的源代码: src\plugins

  1. 关于struts.xml的中文乱码

  第一步:

    在eclipse的window下首选面中查找xml  catalog

    第二步:

    Location:配置本地的dtd文件路径

    key type:选择URI

    Key: http://struts.apache.org/dtds/struts-2.3.dtd

注意版本要对应,如果你可以上网,那么会自动缓存dtd,具有提示功能。

  1. 执行流程介绍

1.当通过浏览器发送一个请求

2.会被StrutsPrepareAndExecuteFilter拦截

3.会调用struts2框架默认的拦截器(interceptor)完成部分功能

4.在执行Action中操作

5.根据Action中方法的执行结果来选择来跳转页面Resutl视图一般管StrutsPrepareAndExecuteFilter叫做前端控制器(核心控制器),只有配置了这个filter,Struts2框架才能使用,Struts2的默认拦截器(interceptor)它们是在struts-default.xml文件中配置。

注意:这上xml文件是在struts-core.jar包中,默认的拦截器是在defaultStack中定义的。

五、Struts2配置详解

1. Struts2配置文件加载顺序

init_DefaultProperties()加载的是 default.properties 文件

位置:struts2-core.jar 包 org.apache.struts2 包下

作用:主要是声明了 struts2 框架的常量

init_TraditionXmlConfigurations()加载的是一批配置文件

Struts-default.xml

位置:struts2-corl.jar

作用:声明了 interceptor result bean

Struts-plugin.xml

位置:在 struts2 的插件包中

作用:主要用于插件的配置声明

Struts.xml

位置:在我们自己的工程中

作用:用于我们自己工程使用 struts2 框架的配置

init_LegacyStrutsProperties()加载的是自定义的struts.properties

位置:都是在自己工程的 src 下

作用:定制常量

init_CustomConfigurationProviders()自定义配置提供

init_FilterInitParmeters()加载的是 web.xml 配置文件

主要是加载 struts2 框架在 web.xml 文件中的相关配置.

init_AliasStandardObjects() bean 相关配置

重点掌握:

1.Default.properties

2.Struts-default.xml

3.Struts-plugin.xml

4.Struts.xml

5.web.xml

 2.struts.xml件配置介绍

(1) package配置(strust.xml只存在一个package相当于一个struts的项目)

name属性作用:定义一个包的名称,它必须唯一。

namespace属性作用:主要是与action标签的name属性联合使用来确定一个 action的访问路径。

extends属性作用:指定继承自哪个包。一般值是struts-default,struts-default包是 在struts-default.xml文件中声明的。

abstruct属性它代表当前包是一个抽象的,主要是用于被继承。

(2) action配置(对应相应的以action结尾的类,一个package可以有多个action)

name属性作用:主要是与package的namespace联合使用来确定action的访问路径。

class属性作用:用于指示当前的action类。

method属性作用:用于指示当前的action类中的哪个方法执行。

(3) result配置(用于显示视图的结果)

name属性作用是与action类的method方法的返回值进行匹配,来确定跳转路径。

type属性作用是用于指定跳转方式。

六、Action类详解

Action类相当于javaWeb阶段下的Servlet类,做着调用service层的关系,实现页面的 跳转,完成业务逻辑操作。

1. Action类的创建(注意:action类的全路径(即包名)必须含有action的词汇)

(1) 创建一个POJO类;(hibernate自动会封装成PO类)

(2) 创建一个类实现一个Action接口;

(3) 创建一个类继承ActionSupport类。

2. 访问Action类

(1) 直接通过<action>标签来配置,通过method来指定访问的方法,如果method没有,默认访问的是execute方法;

(2) 简化的 action 访问方式,可以使用*通配符来访问,使用*来简化操作方案,它对名称规范必须进行一个统一。

七、Struts2框架封装数据

1. 属性驱动

直接在 action 类中提供与请求参数匹配属性,提供get/set方法

在 action 类中创始一个javaBean,对其提供get/set,在请求时页面上要进行修改,

例如 user.username user.password ,要使用ognl表达式

以上两种方式的优缺点:

第一种比较简单,在实际操作我们需要将action的属性在赋值给模型(javaBean)

去操作;

第二种:不需要在直接将值给javaBean过程,因为直接将数据封装到javaBean

中。它要求在页面上必须使用ognl表达式,就存在页面不通用问题。

2. 模型驱动

    (1)让 Action 类要实现一个指定接口 ModelDriven;

(2)实例化模型对象(就是要new出来javaBean);

(3)重写getModel方法将实例化的模型返回。

八、Struts2中获取Servlet

 1. ServletActionContext获取

获取request: ServletActionContext.getRequest();

获取response: ServletActionContext.getResponse();

获取servletContext: ServletActionContext.getServletContext();

2.采用注入方式

Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor默认执行的拦截器是struts-default.xml文件中定义的,在默认执行的拦截器中有一个。

ServletRequestAware, 实现这个接口可以获取HttpServletRequest;

ServletResponseAware ,实现这个接口可以获取HttpServletResponse;

ServletContextAware 实现这个接口可以获取ServletContext;

九、OGNL表达式

OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

Struts2框架内置了OGNL,OGNL本身也是一个项目,它是可以单独使用。

OGNL作用:

支持对象的操作,调用对象的方法;

支持静态成员访问;

支持赋值操作与表达串联;

访问OGNL上下文,访问ActionContext;

操作集合对象。

Strtus2框架中如何使用ognl表达式

在struts2框架中我们使用ognl表达式的作用是从valueStack中获取数据,在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上来获取相关的数据,要想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签<s:property value=”表达式”>来使用。

十、valueStack(值栈)

1. valueStack介绍

valueStack的主要目的是为action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,在Struts2框架中将valueStack设计成一个接口,当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题,一个valueStack对应一个action,valueStack贯穿整个action的生命周期,struts2框架将valueStack保存在request中。

2. valueStack内部结构

valueStack主要有两部分组成:

CompoundRoot:它就是一个ArrayList它主要存储的是action的相关数据;

Map<String,Object> context:就是一个Map,Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息;

pameters :请求参数;

request:请求对象中所有属性;

session:会话对象中所有属性;

application:application对象中的所有发展;

在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,如果使用#来获取,这时就会从context中来获取。

3. 获取ValueStack

(1) 通过request对象来获取;

ValueStack  vs =  (ValueStack)ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

(2) 通过ActionContext来获取

ValueStack  vs =  ActionContext.getServletContext()getValueStack();

4. ActionContext

ActionContext它是action上下文,Strtus2框架它使用ActionContext来保存Action在执行过程中所需要的一些对象,例如 session, application… ActionContext的获取  是通过它的静态方法getContext()得到。Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack。它们都对应着一次请求(一个线程),valueStack与ActionContext本质上是可以获取。

5. ValueStack存储数据

(1) 手动向valueStack存储数据;

vs.push(String str); 和 vs.set(Object obj  String str);

(2) Struts2框架自动向valueStack中存储数据;

每次请求,访问action,这个对象会存储到valueStack中。

在DefaultActionInvocation的init方法内,调用:vs.push(Action action);

在ModelDrivernInterceptor中,调用ModelDrivern的getModel()方法;

6. ValueStack获取数据

(1). Jsp页面获取,导入s标签库

<s:property  value = “ “ />

(2). 在Action中属性

调用PO类getter方法;

(3). 在Model类中(即模型驱动)

调用getModel()方法;

7. EL表达式从ValueStack中获取数据

El表达式可以从valueStack中获取信息,在jsp页面中显示:如:{$ model.name},org.apache.struts2.dispatcher.StrutsRequestWrapper这个类可以使ValueStack使用EL表达式,Struts2框架对request进行了增强,重写了getAttribute方法,如果在request域中查找不到数据,就会在valueStack中获取。

8. Ognl表达式中特殊字符

OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用,#号:它是从非root中获取数据,%号用于强制是否要解析ognl表达式,$号主要是从配置文件中来获取valueStack中数据。

十一、Interceptor拦截器

1. Interceptor拦截器介绍

Struts2中的interceptor它是基于spring aop思想,而aop思想它本质上是通过动态代理来实现。我们strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作。

拦截器链(拦截器栈)简单说,就是可以将多个拦截器形成一个链,在访问它们时依次访问。执行图见上图;

执行的过程:

当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截在其doFilter方法内执行了execute.executeAction(request, response, mapping);这个代码执行后dispatcher.serviceAction(request, response, mapping);serviceAction方法执行在这个方法执行过程中会创建Action代理对象ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);通过proxy去执行了proxy.execute();在execute方法内return invocation.invoke();invocation它是ActionInvocation一个对象。会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。在struts-default.xml文件中定义了默认加载的拦截器栈 defaultStack,在每一个拦截器的interceptor方法内,又调用了DefaultActionInvocation的invoke方法,其实就是递归调用。

2. 自定义Interceptor

所有的Interceptor都要实现一个接口,在配置文件中声明Interceptor,可以将多个interceptor封装成一个stack,可以在Action的配置中引入自己的interceptor,在使用时name也可以引入一个interceptor stack。注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入。

十二、Struts2注解开发(现阶段主流)

1. xml文件与注解互换

@Namespace来代替<package  namespace=””>

@ParentPackage来代替<package extends=””>

@Action来描述关于<action>配置

value属性<action name=””>

使用@Action的results来描述关于结果类型的配置<result>

<result name=”” type=””>

@Action(results={@Result(name=””,type=””,location=””)})

2. 其他注解

@Actions

作用:可以通过多个映射来访问同一个action;

@Results

类似于全局的结果视图;

@InterceptorRef

它是用于处理拦截器的;

原文地址:https://www.cnblogs.com/xu-cceed3w/p/8886453.html

时间: 2024-07-29 14:22:40

Struts2框架基础概念总结的相关文章

WCF分布式开发步步为赢(1):WCF分布式框架基础概念

众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推出了自己的中间件产品,比如Oracle Fusion和 SAP NetWeaver,IBM.BEA等企业也推出了自己基于SOA的解决方案.基于J2EE平台的SOA架构设计中的一个重要概念就是EJB企业服务总线,作用是实现各个系统的数据交互.而.NET平台上,WCF就是微软为各个系统的数据交互提供通讯

Elasticsearch框架基础概念

Elasticsearch(ES)是一个基于Lucene构建开源分布式搜索引擎并提供Restful接口. Es是一个分布式文档数据库(JSON数据格式存储,类似MongoDB),JSON中的每个字段数据都可作为搜索条件,并且能够扩展至数以百计的服务器存储以及处理PB(PetaByte)级的数据.可在短时间内存储.搜索和分析大量的数据. PB级级别: 拍字节(Petabytes),计算机存储容量单位,也常用PB来表示.1PB=1024TB==2^50字节. Es优势: 横向可扩展性: 只需增加服务

spring 框架基础概念理解

一. IOC 控制反转 概念解释:当我需要一个资源时,容器已经帮我准备好,我只需要接受就可以. // 加载 IOC 容器 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml") 当执行以上代码时,容器就已经加载好了所有资源.获取资源的方式如下. HelloWorld helloworld = (HelloWorld)ac.getBean("helloWorld&q

【嵌入式4412开发板学习教程】Uboot教程之uboot基础概念和框架

[4412开发板教程]Uboot教程之uboot基础概念和框架 正在学习uboot,教程讲解的很详细,先上个笔记,视频上传到网盘后再补上...... 知识点: 1.操作系统分层的概念 Windows:bios→内核模式→用户模式→用户程序 linux:bootloader→内核→文件系统→用户程序 2.bootboader种类介绍 U-boot是最通用的bootboader.(210,4412等等) vivi 针对三星的ARM来定制2440上有用到 3.4412休眠问题 它可以直接跳过uboot

Android Multimedia框架总结(五)多媒体基础概念

http://blog.csdn.net/hejjunlin/article/details/52431887 上篇中介绍了MediaPlayer从prepare到playback的其他过程,但是很多的一些音视频的基础概念可能还不是很清楚,今天将介绍下对于多媒体开发时,常常有一些基本概念.看下今天的Agenda: 对杂而乱的概念进行归类 视频部分相关 音频部分相关 先看一张图,这样常常在说的,是否真的了解它们真实含义: 对杂而乱的概念进行归类 视频分辨率 标清.高清.720P- 标清:意思就是"

基础篇-三大框架之一(struts2框架的搭建)

Struts2是一种基于MVC的轻量级的WEB应用框架. 1.web应用框架,也就是说struts2的运行环境是一个web容器,运行于Web容器中的程序就必须遵循基本开发标准和规范:servlet标准和JSP标准(不同的Web服务器对于servlet标准和JSP的标准是不一样的),对于struts2而言,它支持的Servlet标准最低版本要求是2.4,相对于JSP的最低版本要求是2.0.struts2作为开发框架的运行环境提出了要求,要求其必须运行在JDK1.5版本以上. 2.轻量级,相对于重量

struts2框架的核心内容

 Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Ac

Struts2框架概述

Struts2-day01 一. 框架概述 什么是框架,为什么使用框架,框架优点 框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.简单说就是使用别人搭好的舞台,你来做表演. 框架是在特定的领域内解决问题. 优点 重用代码大大增加,软件生产效率和质量也得到了提高 使用框架开发,它提供统一的标准,大大降低了我们的后期维护. 学习框架重点:了解框架做了什么,我们要在这个基础上在

分享知识-快乐自己:初始 Struts2 (基本概念)及 搭建第一个Demo

1):struts2 的基本概念: 1-1):Struts2 是什么? 1.Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 2.Struts 2是Struts的下一代产品,是在 struts 1 和 WebWork 的技术基础上进行了合并的全新的Struts 2框架. 3.其全新的 Struts 2 的体系结构与 Struts 1 的体系结构差别巨大.Str