1、请求参数封装:
明确:封装参数有两种情况。
静态参数封装:
我们学习它不是为了掌握如何封装静态参数,而是了解一个事情:
我们没有做的事,不是没人做,而是框架的拦截器为我们已经实现了。
封装静态参数是由一个叫做staticParams的拦截器实现的
动态参数封装:(是我们学习的重点)
属性驱动:
动作类和模型在一起
要求表单中的name取值和动作类的get/set方法必须一致
是一种叫做params的拦截器为我们封装的
动作类和模型分开
要求动作类中需要有给模型(JavaBean),并且有get/set方法。
表单中name属性取值的写法:模型名称.属性名称(需要能找到get/set方法)
模型驱动:(一般使用这个)
实现要求:
1、要求实现一个ModelDriven接口
2、提供接口中抽象方法的实现,返回模型对象
3、定义一个模型对象,必须实例化好。new出来
是由一个叫做params的拦截器为我们封装的,但是在params之前需要先执行一个modelDriven的拦截器
它在同一个动作类中只能有一个模型数据
2、参数封装的一些细节:
a、数据类型的问题:
明确:表单中提交的数据类型(除去文件)只有两个。
一个是字符串,一个是字符串数组。
b、数据类型的转换
框架会自动为我们转换的:
1、基本类型自动转换
2、字符串数组会按照逗号+空格拼接成字符串
3、日期会按照本地格式自动转换成日期对象
本地格式:yyyy-MM-dd
c、类型转换失败的异常处理
非常重要(不仅适用于类型转换失败,几乎适用于所有struts2框架运行异常的处理)
此处最关键点就是:input结果视图
当页面出现异常:
提示是没有一个input视图被定义时,我们要做的就是配置一个input结果视图。
视图前往的页面,是从哪来回哪去。并且前往的方式要用dispatcher[dɪ'spætʃə]
d、借助struts2的异常提示标签,显示错误信息
s:fielderror标签:
指的就是字段错误。其实就是表单中属性数据有错误。
s:actionerror标签:
指的就是动作错误。在执行动作方法时,数据有错误。
e、类型转换处理的一些思想
解决保存:MM/dd/yyyy日期的方式需要用到struts2的自定义类型转换器。
转换思想:
保存到数据库:
转换就是把字符串或者字符串数组转成其他数据类型
从数据库中取数据显示:
把其他数据类型转成字符串。
自定义类型转换器
编写步骤:
1、定义一个普通类,继承StrutsTypeConverter
对里面的两个抽象方法提供具体的转换实现。
2、在需要使用类型转的实体类所在的包下,创建一个properties文件
文件的命名规范:
实体类名称-conversion.properties
文件的内容:
实体类中需要用类型转换的属性=类型转器全类名
例如:
birthday=cn.itcast.utils.MyTypeConverter
注意:
当我们自定义类型转换器之后,默认的类型转换就失效了。
f、struts2表单标签的数据回显
需要使用struts2的表单标签
s:form:用于创建一个form表单
action:请求的动作名称。此处可以不写后缀,它会自动补全。
也不用写contextPath,它也会自动补全。
method:请求的方式。默认就是Post,可以不写。
namespace:动作所在的名称空间。
s:textfield:用于创建文本框。相当于input type="text"
s:submit:用于创建一个提交按钮。相当于input type="submit"
struts2的表单标签:
会自带回显功能。其实本质就是给value属性赋值。
关于struts2表单标签和HTML表单标签的选择问题:
如果需要高效率:选择HTML标签
如果需要便捷性:选择struts2标签。
3、全局结果视图和局部结果视图
全局结果视图的配置方式:
标签:
global-results。
在标签内部写:result。和我们之前的配置方式就一样了。
例如;
<global-results>
<result name="login">/login.jsp</result>
</global-results>
全局结果视图的作用范围:
所有的动作都适用。前提是必须继承定义全局结果视图的包。
全局结果视图和局部结果视图的优先级:
先找局部结果视图,再找全局结果视图。
4、访问ServletAPI的另外两种方式:
第一种:通过实现接口的方式
第二种:通过ActionContext对象来访问三个域
5、封装集合数据
a、封装List结构的集合数据
b、封装Map结构的集合数据