一.概念
Struts2是Struts的下一代产品,是在 struts和WebWork的技术基础上进行了合并的全新的Struts 2框架。(Struts2是对struts和WebWork的优化)
Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
二.工作原理
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
前面说Struts2采用拦截器的机制使得Action与Servlet API完全分离,但是为了实现业务逻辑,Action需要使用HttpServletRequest内容。
Struts2使用了Action代理解决了这一问题,这也就是其精妙之处;Action代理可以根据系统的配置,加载一系列的拦截器,由拦截器将HttpServletRequest参数解析出来,传入Action。同样,Action处理的结果也是通过拦截器传入HttpServletResponse,然后由HttpServletRequest传给用户(具体可看工作原理图)。
Struts2框架按照模块来划分,可以分为ServletFilters、Struts核心模块、拦截器和用户实现部分。Struts2工作原理图如下所示:
下面我对图进行一下简单的讲解:
1:web客户端发送请求,请求被在web.xml中定义的过滤器FilterDispatcher拦截,在FilterDispatcher中主要经过大概3层过滤器的处理,分别是ActionContext CleanUp、其他过滤器(Othter Filters、SiteMesh等)、FilterDispatcher。
2:在FilterDispatcher过滤器中首先询问ActionMapper是否需要调用某个Action来处理请求(ActionMapper用来负责在HTTP请求和action调用请求之间进行一个映射)。
3:如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
4:ActionProxy通过配置文件struts.xml找到需要调用的Action类。
5:ActionProxy创建一个ActionInvocation实例并调用该Action。
6:在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor。
7:等Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
8:根据result进行相应的模板处理(如跳转的界面,显示操作等)。
9:调用结束之后,ActionInvocation会继续执行该Action相关的Interceptor(栈形式,所以interceptor的执行现在是反过来的)。
10:ActionInvocation执行结束后给客户端返回Response信息。
三.struts2的特点
对比struts1,struts2有如下特点(改进):
1.Struts2所用到的技术是webwork的技术,它所用到的表达式语言是ognl语言。
2.Struts2是轻量级的,它的Action类可以是普通java类。
3.Struts2中不使用actionform管理表单,在struts2中用的action,整合了struts中的action和actionform 。
4.Struts2是线程安全的,它是每一个请求对应一个实例。(struts1的Action是单例模式)。
5.Struts2中的Action不再依赖于Servlet API,有利于测试。
四.使用技术
struts2中用到的最重要的技术就是拦截器。
拦截器是Struts 2框架的核心,通过拦截器,实现了AOP(面向切面编程)。使用拦截器,可以简化Web开发中的某些应用(如字符集,权限验证等),还可以实现Action和Servlet API的完全解耦。
对于拦截器的认识,会在后面进行讲解。
Struts2是一个目前比较流行的Web层的框架,结合了struts和WebWork的优点,关于它的知识,在以后还会继续介绍。