struts2自定义类型转换器
2017-11-29 14:16
543 查看
为什么需要类型转换器
当在表单中输入填入日期时, 格式有很多,比如可以输入1990年1月1日, 也可以填1990-01-01等多种方法, 这时候使用自定义类型的转换器可以将格式进行转化, 变为Action类可读的格式类型转换器的种类
1. 基于OGNL的类型转换器
要创建基于ognl的类型转换器, 必须实现DefaultTypeConverter 并重写convertValue方法在入口的jsp页面表单中, 放入两个文本框, 分别输入一个数字,和一个日期, 由于用户很可能不输入正确的数字, 或者多种格式的日期,所以我们需要自定义类型转换 ,还需要对错误的进行处理
<body> <s:form action="action"> <s:textfield name="num" label="数字"></s:textfield> <s:textfield name="birthday" label="生日"></s:textfield> <s:submit value="提交"></s:submit> </s:form> </body>
action类仅仅如此,不需要别的操作
public class Struts2Action extends ActionSupport{ Date birthday; int num; @Override public String execute() throws Exception { return Action.SUCCESS; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
再来写我们的转换器, 继承DefaultTypeConverter
其中convertValue方法的三个参数分别表示为:
context 上下文对象
value 需要进行类型转换的参数, 是一个数组
toType 需要转成什么类.
方法中分为两种清空,使用toType来区分是从字符串转成日期,还是从日期转成字符串,其中dfs数组用多个SimpleDateFormat来格式化用户的输入,如果都没有到达用户的输入要求则会抛出TypeConversionException();
public class MyDateConverter extends DefaultTypeConverter{ //日期格式 final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"), new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("yyyy.MM.dd")}; @Override public Object convertValue(Map<String, Object> context, Object value, Class toType) { System.out.println("进入"); if (toType == Date.class){ String dateStr = ((String[])value)[0]; System.out.println("form:"+dateStr); for (int i=0; i<dfs.length; i++){ try { return dfs[i].parse(dateStr); } catch (ParseException e) { continue; } } }else if (toType == String.class){ Date date = (Date)value; return dfs[0].format(date); } throw new TypeConversionException(); } }
完成了转换器, 接着要将转换器和action类建立联系,不然他两不就不认识了, 联系起来有两种方式,一种是全局范围转换器, 另一个是应用于特定类的转换器
应用于特定类的转换器配置如下:
在action类同包下创建文件:ClassName-conversion.properties (其中ClassName指的是action类名) 编辑内容: 属性名=类型转换器的限定名
全局范围转换器:
在src目录下创建xwork-converter.properties文件, 编辑内容:需要转换的类的限定名=类型转换器限定名 (这里的需要转换的类是java.util.Date)
配置struts.xml文件如下, 其中当输入错误的信息就会action类就会返回input,将错误信息回显到index.jsp中
<struts> <package name="demo" extends="struts-default" namespace="/"> <action name="action" class="defaultStruts2.Struts2Action"> <result name="success">success.jsp</result> <result name="input">index.jsp</result> </action> </package> </struts>
为了让当输入错误信息返回到index.jsp后,在页面上显示中问, 还需要修改错误的信息,步骤如下:
在Action同包下创建ClassName.properties文件(其中ClassName表示Action类,我这里是Struts2Action) 编辑文件如下 , \u是由于properties文件无法显示中文的原因
invalid.fieldvalue.birthday=\u65E5\u671F\u9519\u8BEF invalid.fieldvalue.num=\u6570\u5B57\u9519\u8BEF
最后的success.jsp显示正确的信息:
<body> <s:property value="num"/> <s:property value="birthday"/> <s:debug></s:debug> </body>
错误结果:
正确结果:
2.基于struts2的类型转换器
使用struts2的类型转换器需要继承StrutsTypeConverter类, 并实现两个抽象方法convertFromString和convertToString, 其中第一个方法作用为将String => 对象, 第二个作用是对象 =》 String.基于struts2的类型转换器代码如下, 感觉也就是把方法写分开了, 其他都一样
public class DateConverter extends StrutsTypeConverter{ //日期格式 final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"), new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("yyyy.MM.dd")}; @Override public Object convertFromString(Map context, String[] values, Class toClass) { String dateStr = values[0]; for(int i =0 ;i<dfs.length; i++){ System.out.println(dateStr); try { return dfs[i].parse(dateStr); //转成date类型 } catch (Exception e) { continue; } } throw new TypeConversionException(); } @Override public String convertToString(Map context, Object o) { Date date = (Date)o; String str = new SimpleDateFormat("yyyy-MM-dd").format(date); return str; } }
相关文章推荐
- Struts2之自定义类型转换器
- Struts2之自定义局部类型转换器、全局类型转换器
- Struts2 自定义类型转换器
- struts2自定义类型转换器
- Struts2之自定义局部类型转换器、全局类型转换器
- Struts2中自定义类型转换器
- struts2自定义类型转换器
- Struts2之自定义类型转换器
- struts2自定义类型转换器
- Struts2的类型转换及输入校验(自定义类型转换器)
- struts2自定义类型转换器
- 为struts2自定义类型转换器:Date的转换
- 4.1.4: Struts2的类型转换---自定义类型转换器
- 为struts2自定义类型转换器:Date的转换
- Struts2之自定义类型转换器
- Struts2实现自定义转换器和全局类型转换器
- Java乔晓松-Struts2中通配符、常量、自定义类型转换器以及接受请求参数处理
- Struts2自定义类型转换器分为局部类型转换器和全局类型转换器
- Struts2学习教程之自定义类型转换器的方法
- Struts2自定义类型转换器