您的位置:首页 > 编程语言 > Java开发

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: