Struts2学习

发布时间 2023-12-31 21:27:35作者: 你心中的我还隐隐约约

        在公司每天都是望着公司项目源码发呆

  使用struts2框架时,需要两个配置文件,分别为web.xml和struts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;struts2读取到struts.xml后,以javabean形式存放到内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件

  

访问流程:

  (1)客户端提交请求

  (2)请求被提交到一系列过滤器(先ActionContentCleanUp.然后其他过滤器,最后FilterDispatcher)

  (3)FiiterDispatcher咨询ActionMapper是否需要调用某个Action来处理这个请求,若ActionMapper决定调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy

  (4)ActionProxy通过Configuration Manager (struts.xml)询问框架的配置文件,找到需要调用的Action类

  (5)ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action,但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)

  (6)一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result

 

OGNL

概念:Object Graph Navigation Language,是表达式语言,Struts2默认采用ONGL表达式访问Action的数据,实际上是通过ValueStack对象来访问Action

  用法:OGNL表达式要结合Struts2标签来访问数据

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

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

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

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

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

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

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

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

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

 

ValueStack

  概念:是Struts2中,Action向页面传递数据的媒介,封装了Action数据,并允许JSP通过PGNL来对其访问

原理:

访问ValueStack

  通过<s:debug>观察其结构

  输出栈顶:<s:property />

  访问Context对象:

    OGNL表达式以“#”开头

    以key来访问context对象的值,即“#key”得到context中的属性值

  迭代集合

  按数字迭代

 

Action基本原理

  核心组件

FC:前端控制器,负责统一的分发请求

Action:业务控制器,负责处理某一类业务

ValueStack:Action与JSP数据交互的媒介

interceptor:拦截器,负责扩展Action,处理Action的共通事务

Result:负责输出的组件

Tags:标签,负责显示数据,生成框体

 

2.获取Session的方式

    a)ActionContext

      - ActionContext.getContext().getSesion(),返回Map<String, Object>

    b)ServletActionContext

      - ServletActionContext.getRequest().getSession(),返回HttpSession

    c)SessionAware(推荐使用)

      - 让Action实现SessionAware接口

      - 实现setSession(Map<String, Object> session)方法,Struts2会在实例化Action后调用方法,通过方法参数将Session对象注入进来

      - 定义成员变量,接收注入进来的Session对象

 

Result原理

  介绍:用于做输出的组件,用于向页面输出一些内容,转发,重定向可以理解为特殊方式的输出,每一个Result实际上是一个类,这些类都实现了共同接口Result,Strust2预置了10种类型的Result,定义在strutsdefault.xml

  Result类型

    a)dispatcher:用于转发的result,可以将请求转发给JSP,这种类型的Result对应的类为ServletDispacherResult,通过default="true"指定该Result为Struts2默认的Result类型。

    b)stream:用于向页面输出二进制数据,此种类型的Result可以将二进制数据输出到请求发起端,对应类为StreamResult

    c)redirectAction:用于将请求重定向给另外一个Action,对应类ServletActionRedirectResult

    d)json:用于向页面输出json格式的数据,可以将json字符串输出到请求发起端。对应类为JSONResult

 

UI标签

  1.表单  <s:form action="" method="" theme="simple" ></s:form>

  2.文本框  <s:textfield name="userName" />

  3.布尔框  <s:checkbox name="marry" />

  4.单选框  <s:radio name="sex" list="#{'M':'男','F':'女'}"/> 静态初始化

        <s:radio name="favoriteCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

  5.多选框  <s:checkboxlist name="travelCities" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化

        <s:checkboxlist name="travelCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

  6.下拉选  <s:select name="home" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化

        <s:select name="home" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

 

拦截器

  用途:拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志记录,权限检查,事务处理,拦截器通过配置方式调用,方法灵活,便于维护和拓展