Struts2

1、概念

  轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC(功能模块和显示模块的分离),并提供了一系列 API,采用模式化方式简化业务开发过程。web

  注:MVC 由 Model(模型),View(视图),Controller(控制器)组成。数组

    ① 模型对应 service 层,表示业务数据或业务逻辑。浏览器

    ② 视图对应 如: JSP ,是用户看到并与之交互的界面。session

    ③ 控制器 对应 controller ,根据用户的输入,控制用户界面数据显示和更新 model 对象。app

 

2、框架结构和工做原理

  2.1 框架结构

  (图片来源见水印)框架

 

  2.2 工做原理

  (1)客户端浏览器发送 HTTP 请求到 Web 应用 。
  (2)这个请求通过一系列的过滤器(Filter)到达 StrutsPrepareAndExecuteFilter (核心控制器)(这些过滤器中有一个叫作 ActionContextCleanUp 的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin) 。
  (3)StrutsPrepareAndExecuteFilter 调用 ActionMapper(Action映射器)肯定调用哪一个Action。
  (4)若是有合适的 Action 再将控制权转移给 ActionProxy 代理 。
  (5)ActionProxy 经过 Configuration Manager 询问框架的配置文件(开始加载配置文件),找到须要调用的 Action 类,建立一个ActionInvocation的实例
  (6)ActionInvocation 在调用拦截器链中的拦截器后再调用 Action。
  (7)根据 Action 返回的结果字符串在 struts.xml 中的配置找到对应的 Result 。返回结果一般是(但不老是,也多是另外的一个 Action 链)一个须要被表示的JSP或者FreeMarker的模版。再以相反的顺序执行拦截器链,返回HTTP响应
  (8)HTTP响应以相反的顺序返回给核心控制器 StrutsPrepareAndExecuteFilter 以及其余 web.xml 中定义的过滤器,最终返回给客户端。工具

 

  FilterDispatch和StrutsPrepareAndExecuteFilter区别?spa

  FilterDispatcher 是 struts 2.0.x到2.1.2版本的核心过滤器,
代理

  StrutsPrepareAndExecuteFilter 是自 2.1.3 开始就替代了 FilterDispatcher 。xml

 

  2.3 工做流程

  一、客户端浏览器发出HTTP请求。
  二、根据 web.xml 配置,该请求会被  StrutsPrepareAndExecuteFilter(核心控制器) 接收。
  三、根据 struts.xml 配置,找到须要调用的 Action 类和方法, 并经过 IoC 方式,将值注入给 Aciton。
  四、Action 调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
  五、Action 执行完毕,根据 struts.xml 中的配置找到对应的返回结果 result,并跳转到相应页面。
  六、返回 HTTP 响应到客户端浏览器。
 

3、组件说明

  ActionMapper:经过 method 参数将请求转发到具体的 action 。 

  ActionProxy代理:是 Action 的一个代理类,也就是说 Action 的调用是经过 ActionProxy 实现的,其实就是调用了 ActionProxy.execute()方法,而该方法又调用了 ActionInvocation.invoke()方法。归根到底,最后调用的是 DefaultActionInvocation.invokeAction() 方法。

  ActionInvocation:就是 Action 的调用者。ActionInvocation 在 Action 的执行过程当中,负责 Interceptor、Action和Result 等一系列元素的调度。

  Interceptor拦截器:是 Struts2 的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、校验等。

 

4、参数传递

  1.Action从页面取值  

    a)模型驱动

    b)属性驱动

  2.页面从Action取值

    a)使用EL表达式

      取基本属性值  { 属性名 }

      取域模型对象值  { 对象 . 属性名 }

    b)OGNL

 

 

5、其余

  Struts2标签库与OGNL表达式

  1.背景:在JSP中,为了减小JSP中嵌入大量的Java代码,JSP规范制定了JSP标准标签库JSTL(JSP Standard Tag Library),提升了JSP页面的可读性和可维护性。 而Struts2也有本身独特的标签库,并且更为强大,不只能够替代JSTL标签库,还适用于任何表示层技术(如Velocity、FreeMarker等)。Strut2默认采用OGNL表达式访问Action的数据,其实是经过ValueStack对象来访问Action 。相似于EL。

  2.注意:在JSP中使用标签库时,须要使用taglib指令引入标签库

  2.OGNL 用法:在Struts2中,OGNL表达式要结合Struts2标签来访问数据

    EL:${user.userName}  <==>  OGNL:<s:property value="user.userName">

    *a)访问基本属性  <s:property value="属性名"/>

    *b)访问实体对象  <s:property value="对象名.属性名"/>

    c)访问数组/集合  <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>

    d)访问Map  <s:property value="someMap.key" />

    e)运算  <s:property value="'My name is' + name" />

    f)调用方法  <s:property value="name.toUpperCase()" />

    g)建立集合  <s:property value="{'a','b','c'}" /> ArrayList

    h)建立Map  <s:property value="#{'mm':'MM','nn':'NN'}" /> LinkedHashMap

 

ValueStack

  1.概念:是Struts2中,Action向页面传递数据的媒介,封装了Action的数据,并容许JSP经过OGNL来对其访问

  2. EL表达式访问ValueStack

    a)EL也是从ValueStack中取的值

    b)EL默认的取值范围是page,request,session,application

    c)Struts2重写的request的getAttribute方法,先试图从原始request中取值,若是没取到再从ValueStack中取值

建立一个ActionInvocation的实例。

相关文章
相关标签/搜索