十二、类型转换
十二、类型转换:
1、用户界面传来的数据都是String:String---->其他类型
显示或者是数据回显:其他类型----->String
- 基本类型自动转换。
- java.util.Date<-------->String(中国:Struts2默认按照yyyy-MM-dd本地格式进行自动转换)
数组 可以将多个同名参数,转换到数组中
总结:在使用Struts2时,基本上不用写任何类型转换器。内置的完全够用。
2、自定义类型转换器
String----------------->java.util.Date MM/dd/yyyy----->能转换
java.util.Date--------->String MM/dd/yyyy
步骤:
第一步:
- 编写一个类直接或间接实现:
com.opensymphony.xwork2.conversion.TypeConverter接口。
- 一般选择继承:
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter
覆盖掉:
public Object convertValue(Object value, Class toType)
public class MyDateConvertor1 extends DefaultTypeConverter { private DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
/** * value:有可能是String[] 用户输入时:封装到javabean * value:有可能是Date 显示时 * toType:要转换成为的目标类型 */ @Override public Object convertValue(Object value, Class toType) { // 首先判断要转换的类型是否等于Date类型 if (toType == Date.class) { // String ---> Date String[] values = (String[]) value; try { return df.parse(values[0]); } catch (ParseException e) { throw new RuntimeException(e); } } else if (toType == String.class) { // Date --> String return df.format((Date) value); } else { return null; } } } |
- 继承org.apache.struts2.util.StrutsTypeConverter(最简单和方便)
第二步:注册类型转换器
- 局部类型转换器:为某个动作类服务的(特服)
在动作类所在的包中,建立一个名称为"动作类名-conversion.properties"的配置文件
- 全局类型转换器:为所有的动作类服务的
在WEB-INF\classes目录下建立一个固定名称的配置文件:xwork-conversion.properties
3、出现转换失败时的页面转向和错误消息提示
a、配置一个name="input"的结果视图,一般指向用户输入数据的那个页面
<package name="p1" extends="struts-default"> <action name="action1" class="com.itheima.action.Demo1Action"> <!-- 出现类型转换失败时:conversionError的拦截器会把页面转向一个叫做input的逻辑视图 --> <result name="input">/01.jsp</result> </action> </package> |
b、在01.jsp中使用struts2的标签显示字段有关的错误(后面的国际化再讲)
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:fielderror/>
c、配置提示信息为中文的
在动作类所在的包中,建立一个名称为:动作类名.properties的配置文件
其中的birthday表示为:表单的字段名称