• Struts2


    一、概念

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

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

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

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

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

    二、框架结构和工作原理

      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区别?

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

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

      2.3 工作流程

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

    三、组件说明

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

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

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

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

    四、参数传递

      1.Action从页面取值  

        a)模型驱动

        b)属性驱动

      2.页面从Action取值

        a)使用EL表达式

          取基本属性值  { 属性名 }

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

        b)OGNL

    五、其他

      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的实例。

  • 相关阅读:
    MSP430F149学习之路——蓝牙模块
    MSP430F149学习之路——SPI
    MSP430推荐网站
    MSP430F149学习之路——UART
    MSP430F149学习之路——比较器Comparaor_A
    MSP430F149学习之路——PWM信号
    MSP430F149学习之路——捕获/比较模式
    MSP430F149学习之路——时钟1
    CUDA学习笔记(三)——CUDA内存
    CUDA学习笔记(一)——CUDA编程模型
  • 原文地址:https://www.cnblogs.com/sun7897/p/8824953.html
Copyright © 2020-2023  润新知