在web中我们使用beanutils
直接将表单数据封装到javaBean
中. beanutils
可以帮助我们完成基本类型的转换。
struts2
中action
得到请求参数,可以直接封装到javaBean
.
struts2 内部提供大量类型转换器,用来完成数据类型转换问
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串
数组 可以将多个同名参数,转换到数组中
集合 支持将数据保存到 List 或者 Map 集合
例如:日期类型,我们传递 yyyy-MM-dd , 但是如果是yyyy/MM/dd, 就会出现问题.
struts2中的类型转换器根接口是:
com.opensymphony.xwork2.conversion.TypeConverter
自定义类型转换器
步骤:
- 创建一个类实现TypeConverter接口.
- 重写接口中方法,实现类型转换操作.
- 注册类型转换器.
详解说明:
-
创建一个自定义类型转换器(三种方法)
实现
TypeConverter
接口:
需要重写public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
如果实现该接口,这个方法参数太多(6个)继承
DefaultTypeConverter
(接口TypeConverter
的实现类)
优点:重写的方法参数没有那么多
public Object convertValue(Map<String, Object> context, Object value, Class toType) { return convertValue(value, toType); }
-
推荐使用 继承
StrutsTypeConverter
(DefaultTypeConverter
的一个子类)
原因: 在这个类中将从页面传递的数据怎样封装,以及action中的数据怎样在页面上显示做了分离.public abstract Object convertFromString(Map context, String[] values, Class toClass); // 将页面传递过来的字符串数据 进行转换 public abstract String convertToString(Map context, Object o); // 将转换后的类型重新转换成字符串
-
注册自定义类型转换器(三种情况).
- 局部--针对于
action
配置文件所在位置以及名称: 在Action
类所在包 创建Action类名-conversion.properties
,
配置文件书写 格式 :属性名称=类型转换器的全类名
例如:date=com.example.MyTypeConverter
- 局部--针对于
model
配置文件所在位置以及名称: 在model
(即 JavaBean 例如 User.java) 类所在包 创建model类名-conversion.properties
,
配置文件书写格式 :属性名称=类型转换器的全类名
例:date=com.example.MyTypeConverter
- 全局
配置文件所在位置以及名称:在src下创建一个xwork-conversion.properties
配置文件书写 格式:要转换的类型全名=类型转换器的全类名
例:java.util.Date = com.example.MyTypeConverter
- 局部--针对于
关于转换错误视图跳转问题
对于struts2中类型转换器,如果表单数据提交时,将数据向model封装,出现了问题,会报错:
No result defined for action cn.itcast.action.RegistAction and result input
意思是,在RegistAction
的配置中没有配置input结果视图.
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/inputError.jsp</result>
</action>
如果配置了,出现类型转换问题,且抛出异常,就会跳转到input
指定的视图。
为什么会向input视图跳转?
因为struts2中的拦截器(interceptor).
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
// 用于记录类型转换问题
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
//用于得到问题,向input视图跳转。
关于错误信息展示
通过分析拦截器作用,得知当类型转换出错时,自动跳转input
视图 ,在input
视图页面中 <s:fieldError/>
显示错误信息
自定义错误展示信息
在Action
所在包中,创建 ActionName.properties
,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息
如果是自定义类型转换器,出现类型转换问题,要跳转到input
视图
在自定义的类型转换器中,必须抛出异常才可以。
示例代码
自定义Date转换类,可以将 yyyy/MM/dd 格式的字符串转换成 Date类型
-
创建 Action 类 ,将其作为Model 接收表单参数
public class DemoAction3 extends ActionSupport{ private String name; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String execute() throws Exception { System.out.println(name); System.out.println(birthday); return NONE; } }
-
页面表单信息, name 要和 Action类中的属性名对应
<form action="/converter" method="get"> <input type="text" name="name" /><br> <input type="text" name="birthday" /><br> <input type="submit" /><br> </form>
-
创建自定义类型转换器
public class MyTypeConvertor extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { String birthday = values[0]; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd"); Date date =null; try { date = simpleDateFormat.parse(birthday); } catch (ParseException e) { // e.printStackTrace(); throw new RuntimeException("类型转换错误"); // 类型转换错误,要抛出异常,才能被拦截器获取错误信息,返回到 input 视图 } return date; } @Override public String convertToString(Map context, Object o) { return null; } }
-
配置 Action 和 input 视图页面
<package name="demo" extends="struts-default" namespace="/"> <action name="converter" class="com.example.action.DemoAction3"> <result name="input">/inputError.jsp</result> </action> </package> inputError.jsp s:fielderror<br> <s:fielderror />
-
将转换属性和自定义转换类绑定
在Action类所在包下创建ActionName-conversion.properties
, 注意这里的 ActionName 是你自己的 Action 的类名birthday=com.example.action.MyTypeConvertor
-
自定义属性转换错误信息
在Action类所在包下创建ActionName.properties
invalid.fieldvalue.birthday=日期格式换错误,只能接受yyyy/MM/dd格 式
当输入不满足转换条件的日期格式:
页面返回input 视图,转发到 inputError.jsp 页面,显示自定义的错误信息