Struts2学习(二)
一、封装请求正文到对象(非常重要)
1 、静态参数封装
在struts.xml配置文件中,给动作类注入值。调用的是setter方法
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161227204743257-1318702273.png)
原因:是由一个staticParams的拦截器完成注入的
http://localhost:8080/strutsParams/action1.action
2、动态参数封装:开发时用到的
通过用户的表单封装请求正文参数
2.1 、动作类作为实体模型
数据模型和动作类写在一起
实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)
表单中的name属性取值必须和动作类中的数据模型的set方法后的名称一致 <input type="text" name="username"/>对应动作类中的setUsername方法
原因:是由params拦截器(ParametersInterceptor)完成的
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161228112105820-1905117846.png)
2.2 、动作类和实体模型分开
数据模型和动作类分开写
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161228112147773-1932636921.png)
会出现空指针异常
问题:由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。
原因:通过执行过程:
getUser --> setUser --> getUser
第一次执行getter方法看对象是否存在,如果不存在就是用反射创建一个对象
第二次执行setter方法 不存在对象就创建一个对象,把它set回去
第三次执行getter方法得到对象,调用对应的set属性方法为属性赋值
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161228112320617-742075846.png)
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161228112334101-668911231.png)
2.3、模型驱动(开发中采用的方式)
建立动作类和数据模型分开的前提下
原因:是由一个modelDrivenIntercepter拦截器做的
步骤:
1、实现modelDriven的接口
2、实现接口中的抽象方法getModel
3、在使用模型驱动的时候,数据模型必须由我们自己来实例化
private User user = new User();
表单中name属性的取值已经不是一个字符串了
二、数据类型的转换(实际开发中几乎不用)
1、开发中的情况:
实际开发中用户通过浏览器输入的数据都是String或者String[]。
String/String[]————填充模型(set方法)————>POJO(plain old java object) pojo中有java的数据类型。
POJO————————获取(get方法)————>页面展示:String
2、类型转换情况
写数据:(增,删,改)都是String或String[]数组转换为其他类型。
读数据:(查)其他类型转换为String。
3、Struts2提供的常用类型转换
a.基本数据类型自动转换。
b.日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。
c.字符串数组:默认用逗号+空格,连接成一个字符串。
4、自定义类型转换器(知道)
示例:把日期格式按照 MM/dd/yyyy的格式转换
4.1、Struts2中的类型转换器结构:
4.2、编写类型转换器(编写一个类继承StrutsTypeConverter,实现抽象方法)
第一步:编写一个类,继承自StrutsTypeConverter,实现抽象方法convertFromString,convertToString的抽象方法
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161229102842554-987477719.png)
4.3、注册类型转换器
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161229102930101-506665979.png)
全局类型转换器:(推荐)
按照要转换的数据类型来注册
在顶层路径建立一个固定名称xwork-conversion.properties的属性文件
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161229102952664-2085154886.png)
5、转换失败后的处理(重要)
问题一:当转换失败后,页面出错,提示:
![](https://images2015.cnblogs.com/blog/979308/201612/979308-20161229103130445-853280198.png)
解决办法:配置回显结果视图
问题二:配置了回显视图后,当转换失败时,可以回到请求页面,但是表单数据都没了
显示错误提示:借助Struts2的标签库
回显数据:使用struts2的标签库生成表单(建议使用)
1 <%@ taglib uri="/struts-tags" prefix="s" %> <%-- 导入标签库--%> 2 <s:fielderror /> <%-- 字段错误提示--%> 3 <s:actionerror /> <%-- 动作错误提示--%> 4 <%-- struts2的form表单标签提供了和原始HTML标签几乎一致的属性 5 action:请求地址,直接动作名称,不用前面加上contextPath属性 6 method:请求方式,struts的表单项默认post 7 enctype:表单编码的MIME(多用途互联网扩展类型) 8 --%> 9 <s:form> 10 </s:form>
问题三:错误信息中文提示,使用的是struts2的国际化
类型转换器当转换失败后,进入input视图是由conversionError的拦截器完成
要想使用类型转换中的错误处理,在定义Action时必须继承ActionSupport实现类
有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。