Struts2学习(二)

一、封装请求正文到对象(非常重要
 
1 、静态参数封装
在struts.xml配置文件中,给动作类注入值。调用的是setter方法

原因:是由一个staticParams的拦截器完成注入的

http://localhost:8080/strutsParams/action1.action

2、动态参数封装:开发时用到的
通过用户的表单封装请求正文参数
 
2.1 、动作类作为实体模型
数据模型和动作类写在一起
实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)
表单中的name属性取值必须和动作类中的数据模型的set方法后的名称一致  <input type="text" name="username"/>对应动作类中的setUsername方法
原因:是由params拦截器(ParametersInterceptor)完成的
2.2 、动作类和实体模型分开
数据模型和动作类分开写

会出现空指针异常

问题:由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。
原因:通过执行过程:
getUser --> setUser --> getUser
第一次执行getter方法看对象是否存在,如果不存在就是用反射创建一个对象
第二次执行setter方法 不存在对象就创建一个对象,把它set回去
第三次执行getter方法得到对象,调用对应的set属性方法为属性赋值

 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的抽象方法
4.3、注册类型转换器
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties

全局类型转换器:(推荐)
按照要转换的数据类型来注册
在顶层路径建立一个固定名称xwork-conversion.properties的属性文件

 
5、转换失败后的处理(重要)
问题一:当转换失败后,页面出错,提示:

解决办法:配置回显结果视图

 

问题二:配置了回显视图后,当转换失败时,可以回到请求页面,但是表单数据都没了

显示错误提示:借助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实现类

有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
原文地址:https://www.cnblogs.com/1989guojie/p/6227479.html