struts2_part02

来源:互联网 发布:知乎周刊plus epub 编辑:程序博客网 时间:2024/06/03 22:52

配置全局结果视图:

struts2的action在找结果视图时,是先找局部,当局部没有时,再找全局的


result标签:

作用:用于配置结果视图属性:  

name:指定逻辑结果视图。就是用于和动作方法的返回值进行比较的 

type:指定以何种方式前往指定的视图。

type的常用取值:

dispatcher: 请求转发 默认值

redirect:重定向到一个jsp,它也可以重定向到另外一个动作。 

redirectAction:重定向到另外的一个动作

重定向请求域中的数据就没了,因为他是两次请求,是服务器的动作

转发只能在应用内转发,重定向可以定向到外面


获取原始ServletAPI对象
 * 第一种方式:使用struts2提供的工具类,它里面有静态方法,可以直接获取对象实际开发中采用的方式
 * 工具类是:ServletActionContext

         第二种方式:通过实现接口的方式
 * ServletRequestAware
 * ServletResponseAware
 * ServletContextAware


无论是第一种方式获取,还是第二种方式获取,其本质都是在ActionContext中根据key来获取Value。
ActionContext它看上去就像是一个Map结构

.get(x)只有map和threadlocal 对象有这种方法



 请求参数的封装:(有三种封装方式,其中属性驱动有2种,模型驱动有一种)
 属性驱动:
 * 第一种情况:没有实体类
 * 把实体类中定义的属性,都放到动作类中定义
 * 动作类和模型在一起
 * 使用要求:
 *   表单元素的name属性取值,它必须和Action中的setXXXX方法后面的部分保持一致。
 *  这是拦截器为我们封装,是一个名称为params的拦截器为我们封装的。
 *  所有的封装方式,采用的拦截器,都是这个params。
 *  它的封装规则就是:找对应的位置上有没有对应表单name取值的set方法
第一种方式:属性驱动之没有实体类,它找的对应位置:Action中的setXXX方法

 * Struts2中自动为我们转换的数据类型:
 * 1、基本数据类型自动转换
 * 2、日期类型按照本地格式转换成日期对象本地日期格式:yyyy-MM-dd  
 * 3、字符串数组会按照逗号+空格的方式拼接成字符串。
 * 
 * Struts2默认只为我们解决了post请求的中文乱码问题,get方法没有解决

第二种方式:属性驱动之有实体类,它找的对应位置:Action中的setUser/getUser方法,找到后再去User类中找setXXX方法给属性赋值


 * 表单能提供的数据类型只有3种:
 * 1、字符串
 * 2、字符串数组(表单元素name属性取值一致时,是一个字符串数组)
 * 3、文件(input type="file")

模型驱动:
 *   要想使用模型驱动,必须遵循以下的编码要求:
 * 1、动作类必须实现ModelDriven<实体类>接口
 * 2、动作类中需要提供一个实体类对象(模型对象),并且必须自己实例化
 * 3、提供接口中抽象方法的实现,并且返回模型对象。
 * 此种封装方式,也是params拦截器实现的。
 * 它的封装规则就是:找对应的位置上有没有对应表单name取值的set方法


第三种方式:模型驱动,它找的对应位置:找User中的有没有对应setXXX方法。
 *   它在封装之前,需要另外的一个拦截器配合才能实现,拦截器就是modelDriven拦截器。
 *  
 *   modelDriven+params两个拦截器组合实现的功能。



复杂类型的封装集合参数的封装
 * 分为两种情况:List/Map



总结:

1、result标签:
name:是用于和动作方法的返回值进行比较。当一致时前往指定的视图(视图可以是jsp,也可以是一个动作)
type:指定用何种方式前往
2、全局结果视图和局部结果视图
局部:指的是在action标签内部定义的result标签,只能当前action使用。
全局:在global-results标签内部定义,所有继承有global-results标签的包的子包,都能用。
优先级: 先局部后全局。
3、获取ServletAPI的三种方式:
第一种:ServletActionContext工具类
它里面有静态方法,可以直接获取
第二种:通过实现接口
它需要使用servletConfig拦截器来实现
第三种:直接使用ActionContext来获取
前面两种其实都是从此处获取的。
4、请求参数的封装:
属性驱动:
   动作类和模型在一起
要求:表单元素的name取值必须和动作类中setXXX方法保持一致
   动作类和模型分开
要求:表单中元素name的取值必须使用OGNL表达式
     动作类中需要定义模型,并且提供get/set方法。
     同时模型(实体类)中,需要有和表单元素OGNL表达式.后面的保持一致的setXXX方法
模型驱动:
   动作类必须实现ModelDriven接口
   动作类需要定义一个模型,并且必须实例化
   提供接口中抽象方法的实现,并返回模型。
复杂类型的封装:
   List:有序的,可以通过指定索引(下标)来给指定的对象属性赋值
   Map:有键的,可以通过key给指定的对象属性赋值。
5、封装参数的细节
struts2框架能为我们转换的数据类型
基本类型自动转
日期类型按照本地格式yyyy-MM-dd来转换成日期对象
字符串数组按照逗号空格的方式拼接成字符串
表单中能为我们提供的有用数据类型只有3中
字符串  getParameter(String name)
字符串数组 getParameterValues(String name)
Map<String,String[]> map = getParameterMap(String name)
Enumeration<String> names = getParameterNames();
文件(流) getInputStream()
struts2中请求参数封装都是靠拦截器实现的
封装参数的拦截器:params
作用:到对应的位置找setXXX方法,依据就是表单元素的name属性取值。
当我们使用模型驱动时,它其实是要有一个另外的拦截器支持:
ModelDrivenInterceptor

原创粉丝点击