Struts2 学习笔记(概述)

Struts2 学习笔记

2015年3月7日11:02:55css

MVC思想

Strust2的MVC对应关系以下:html

 

 

在MVC三个模块当中,struts2对应关系以下:java

Model:web

         负责封装应用的状态,并实现应用的功能。一般分为数据模型和业务逻辑模型,数据模型用来存放业务数据,好比订单信息、用户信息等;而业务逻辑模型包含应用的业务操做,好比订单的添加或者修改等。spring

封装应用状态:某些应用数据封装起来,使得视图只能经过接口获取对应的数据apache

响应状态查询:对应用的状态改变进行处理安全

暴露应用功能:暴露接口mvc

通知视图改变:主动向视图传递数据app

Controller:框架

用来控制应用程序的流程和处理视图所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;而后控制器会选择用于响应的视图,把模型更新后的数据展现给用户。

接受并验证HTTP请求的数据:对一个url请求,经过Controller将请求分发到指定的处理模块上。

将用户数据域模型的更新相映射:用户数据模型改变并不会当即对应到Model,而是须要controller来分发

选择用于响应的视图:根据配置文件,选择对应与某个模型的视图

View:

用来将模型的内容展示给用户,用户能够经过视图来请求模型进行更新。视图从模型得到要展现的数据,而后用本身的方式展示给用户,至关于提供界面来与用户进行人机交互;用户在界面上操做或者填写完成后,会点击提交按钮或是以其它触发事件的方式,来向控制器发出请求。

解析模型的数据:如velocity的功能

产生HTML的响应:

请求模型的更新:向后台发送表单

发送用户输入给控制器

Struts2工做流程

 

         一个请求在Struts2框架中的处理大概分为如下几个步骤:

  1. 客户端提起一个(HttpServletRequest)请求
  2. 请求被提交到一系列(主要是三层)的过滤器(Filter),如ActionContextCleanUp、其余过滤器、SiteMesh等、FilterDispatcher。注意这里是有顺序的,先ActionContextCleanUp,再其余过滤器(SiteMesh等)、最后到FilterDispatcher。
  3. FilterDispatcher是控制器的核心,就是mvc中controller控制层的核心。FilterDispatcher进行初始化并启用核心doFilter
  4. ActionProxy经过Configuration Manager(struts.xml)询问框架的配置文件,找到须要调用的Action类.
  5. ActionProxy建立一个ActionInvocation的实例,同时ActionInvocation经过代理模式调用Action。但在调用以前ActionInvocation会根据配置加载Action相关的全部Interceptor。(Interceptor是struts2另外一个核心级的概念)
  6. Interceptor 的调度流程大体以下:
    1. ActionInvocation初始化时,根据配置,加载Action相关的全部Interceptor。
    2. 经过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。

总体流程

l  客户端提交一个HttpServletRequest请求(action或JSP页面)。

l  请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等。

l  FilterDispatcher是Struts2控制器的核心,它一般是过滤器链中的最后一个过滤器。

l  请求被发送到FilterDispatcher后,FilterDispatcher询问ActionMapper时候须要调用某个action来处理这个Request。

l  若是ActionMapper决定须要调用某个action,FilterDispatcher则把请求交给ActionProxy进行处理。

l  ActionProxy经过Configuration Manager询问框架的配置文件struts.xml,找到调用的action类。

l  ActionProxy建立一个ActionInvocation实例,经过代理模式调用Action。

l  action执行完毕后,返回一个result字符串,此时再按相反的顺序经过Intercepter拦截器。

l  最后ActionInvocation实例,负责根据struts.xml中配置result元素,找到与之相对应的result,决定进一步输出。

 

 

 

 

 

 

 

 

 

 

 

 

 

Action

Struts2的action生命周期

 

Struts2的action接口隔离

Struts2中的Action,并不须要依赖于特定的Web容器。咱们看不到相似HttpServletRequest,HttpServletResponse等Web容器相关的对象。

提问:Struts2Action并不带有任何Web容器相关的对象,Action又是如何工做在Web容器中的呢? 

虽然Struts2的Action只是一个很是普通的Java对象,并不具有任何Web容器的特质,可是咱们须要把Action放到一个更加大的环境中来看。事实上,Struts2为Action的执行,准备了完整的数据环境和执行环境。而这个执行环境,就保证了Action在Web容器中的顺利运行。 

在Struts2中,每一个Http的请求,会被发送到一个Filter。而这个Filter,就会针对每一个请求,建立出一个代码的执行环境,并在这个基础上,为每一个执行环境配备与之对应的数据环境,这个数据环境中的内容,就来自于Web容器中的一个又一个对象。这样,就可以顺利调用Action执行代码而无需担忧它是否运行在Web容器中了。

提问:Struts2Action并不带有任何Web容器相关的对象,Action中又如何与Web容器进行通讯并获取Web容器的相关对象呢? 

刚刚咱们提到Struts2会为每一个Http的请求创建一个执行环境和数据环境。其中,数据环境就成为了Action获取Web容器的基础。因此,当Action须要获取Web容器的相关对象,须要经过数据环境来进行。 

Struts2设置的优势

1. 使得Struts2的Action很是易于测试

若是咱们彻底不考虑Action的执行环境,仅仅把Action看做一个普通的Java对象,那么咱们甚至能够直接new一个Action的对象,经过执行其中的方法完成测试。这样,咱们就不须要任何的Mock,来模拟Web容器的环境。

2. 结合Action的执行环境,使得Struts2在Control这个层次上,可以定义更加丰富的执行层次

由于Action是一个普通的Java类,而不是一个Servlet类,彻底脱离于Web容器,因此咱们就可以更加方便地对Control层进行合理的层次设计,从而抽象出许多公共的逻辑,并将这些逻辑脱离出Action对象自己。事实上,Struts2也正是这么作的,不管是Interceptor,仍是Result,其实都是抽象出了Action中公共的逻辑部分,将他们放到了Action的外面,从而更加简化了Action的开发。

3. 使得Struts2的Action看上去更像一个POJO,从而更加易于管理

Struts2的Action是一个线程安全的对象。而Web容器传递过来的参数,也会传递到Action中的成员变量中。这样,Action看上去就更像一个POJO,从而可以方便的被许多对象容器进行管理。好比说,你能够很是方便得把Action归入到Spring的容器中进行管理。

数据交互上下文 ActionContext(BeatContext)

因为Action是应对于一个又一个的URL请求,因此ActionContext应该具有如下的特性:

1. ActionContext应成为Action与Web容器之间的桥梁

2. ActionContext中应该保存有针对某个请求的详细信息

3. ActionContext应该是一个线程安全的类对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Struts2拦截器与过滤器

拦截器和过滤器的区别:

一、拦截器是基于java的反射机制的,而过滤器是基于函数回调

二、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

三、拦截器只能对action请求起做用,而过滤器则能够对几乎全部的请求起做用

四、拦截器能够访问action上下文、值栈里的对象,而过滤器不能

五、在action的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次

过滤器

         首先讨论struts2过滤器,struts2的主要过滤器是FilterDispatcher,至关于MVC框架当中的controller,有以下几个功能:

(1)执行Actions:过滤器经过ActionMapper对象,来判断是否应该被映射到Action.若是mapper对象指示他应该被映射,过滤链将会被终止,而后Action被调用。这一点很是重要,若是同时使用SiteMesh filter,则SiteMesh filter应该放到该过滤器前,不然Action的输出将不会被装饰。

(2)清除ActionContext:过滤器为了确保内存溢出,会自动的清除ActionContext。这可能会存在一些问题,在和其它的框架集成时,例如SiteMesh(一致的web页面布局框架,相似装饰器)。ActionContextCleanUp提供了怎么处理这些问题的一些信息。在配置了FilterDispatcher的前提下已经配置了ActionContextCleanUp拦截器。

(3)维护静态内容:过滤器也会维护在Struts2中使用的一些公共的静态的内容,例如JavaScript文件,CSS文件等。搜索/struts/*范围内的请求,而后将/struts/后面的值映射到一些struts的公共包中,也能够在你的类路径中搜索。

默认状况下会去查找如下包:org.apache.struts2.static.template。这样你只用请求/struts/xhtml/styles.css,XHTML UI主题默认的样式表将会被返回。一样,AJAX UI组件须要的JavaScript文件,也能够在org.apache.struts2.static包中被找到。若是你想加入其它被搜索的包,在web.xml中设置filter时,经过给"actionPackages"初始参数一个逗号隔开的包列表值来设定。

(4)清除request生命周期内的XWork的interceptors

自定义过滤器

应该知道若是咱们本身定义过滤器的话, 是要放在strtus2的过滤器以前的, 若是放在struts2过滤器以后,你本身的过滤器对action的过滤做用就废了,不会有效!除非你是访问jsp/html! 

那我如今有需求, 我必须使用Action的环境,而又想在执行action以前拿filter作一些事, 用FilterDispatcher是作不到的.

那么StrutsPrepareAndExecuteFilter能够把他拆分红StrutsPrepareFilter和StrutsExecuteFilter,能够在这两个过滤器之间加上咱们本身的过滤器.! 

         过滤器也能够本身定义,在使用新的StrutsPrepareAndExecuteFilter做为核心过滤器的状况下,能够将自定义的过滤器放在各类位置上。

      具体的配置在web.xml当中进行配置。

拦截器

         在使用拦截器的时候,在Action里面必须最后必定要引用struts2自带的拦截器缺省堆栈defaultStack,以下所示:

 

<interceptor-ref name="checkbox">
  <param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>(必须加,不然出错)

 

Strust2拦截器构成拦截器栈,在使用过程当中,至关于递归调用这些拦截器的intercept方法。一般咱们采用struts2的默认拦截器,本身开发,则要遵循如下的步骤:

1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在strutx.xml中注册上一步中定义的拦截器。

3 在须要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的状况下全部的Action都被这个拦截器拦截。

开发

Interceptor接口声明了三个方法:

public interface Interceptor extends Serializable {

    void destroy();

    void init();

    String intercept(ActionInvocation invocation) throws Exception;

}

Init方法在拦截器类被建立以后,在对Action镜像拦截以前调用,至关于一个post-constructor方法,使用这个方法能够给拦截器类作必要的初始话操做。

Destroy方法在拦截器被垃圾回收以前调用,用来回收init方法初始化的资源。

Intercept是拦截器的主要拦截方法,若是须要调用后续的Action或者拦截器,只须要在该方法中调用invocation.invoke()方法便可,在该方法调用的先后能够插入Action调用先后拦截器须要作的方法。若是不须要调用后续的方法,则返回一个String类型的对象便可,例如Action.SUCCESS。另外AbstractInterceptor提供了一个简单的Interceptor的实现。

注册拦截器

<interceptors>

  <interceptor name="login" class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>

     <interceptor-stack name="teamwareStack">

            <interceptor-ref name="login"/>

            <interceptor-ref name="defaultStack"/>

     </interceptor-stack>

</interceptors>

将上述拦截器设定为默认拦截器

<default-interceptor-ref name="teamwareStack"/>

这样在后续同一个package内部的全部Action执行以前都会被login拦截。

每个拦截器都有两个默认的参数:

excludeMethods - 过滤掉不使用拦截器的方法和

includeMethods – 使用拦截器的方法。

 

须要说明的几点:

1 拦截器执行的顺序按照定义的顺序执行

2 使用默认拦截器配置每一个Action都须要的拦截器堆栈

3 如何访问HttpServletRequest,HttpServletResponse或者HttpSession

有两种方法能够达到效果,使用ActionContext:

Map attibutes = ActionContext.getContext().getSession();

或者实现相应的接口:

HttpSession           SessionAware

HttpServletRequest     ServletRequestAware

HttpServletResponse    ServletResponseAware

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

剩余部分

集成spring与hibernate

OGNL与标签

高级主题

相关文章
相关标签/搜索