类型转换器的作用:
把表单传到action的数据在中途中进行更改。
一、局部类型转换器
流程:
表单提交数据->调用配置文件properties->调用自定义的数据转换类->action接受数据->welcome.jsp输出数据。
login.jsp
<form action="login.action" method="post">
学好:<input type="text" name="id"><br>
时间:<input type="text" name="bri"><br>
<input type="submit" value="提交">
</form>
LoginAction.java
package com.action;
import java.util.Date;
public class LoginAction {
private int id;
private Date bri;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getBri() {
return bri;
}
public void setBri(Date bri) {
this.bri = bri;
}
public String execute(){
System.out.println(id);
System.out.println(bri);
return "success";
}
}
定义类型转换类:DateConverter
package com.converter;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class DateConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Object arg0, Class arg1) {
String str = ((String[])arg0)[0];
System.out.println("11111");
if(arg1==Date.class){
try {
SimpleDateFormat sd = new SimpleDateFormat("yyyy/mm/dd");
return sd.parse(str);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
配置文件:LoginAction-conversion.properties
bri=com.converter.DateConverter //数据转换类的具体路径
该配置文件必须在action的同级目录下,且名称必须为:action名-conversion.properties。
注意:
1、定义类型转换类时,使用Date类型是,会自动导入java.sql.Date包,要改为:java.util.Date。
2、在实现抽象类时,Object类型参数是个数组。
二、全局类型转换器
相对于局部类型转换器,全局类型转换器只需要更改properties配置文件即可。
新建配置文件必须在src目录下,且名称必须为:xwork-conversion.properties。
配置文件:xwork-conversion.properties
java.util.Date=com.converter.DateConverter
三、转换器中异常信息的处理
修改转换器代码:
package com.converter;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.opensymphony.xwork2.conversion.TypeConversionException;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class DateConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Object arg0, Class arg1) {
String str = ((String[])arg0)[0];
System.out.println("11111");
if(arg1==Date.class){
try {
SimpleDateFormat sd = new SimpleDateFormat("yyyy/mm/dd");
if(!str.matches("^\\d{4}/\\d{2}/\\d{2}$")){
throw new TypeConversionException();
}
return sd.parse(str);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
修改action继承关系:
package com.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private int id;
private Date bri;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getBri() {
return bri;
}
public void setBri(Date bri) {
this.bri = bri;
}
public String execute(){
System.out.println(id);
System.out.println(bri);
return "success";
}
}
修改表单页面,添加错误提示信息:
${fieldErrors.bri[0] }
<form action="login.action" method="post">
学好:<input type="text" name="id"><br>
时间:<input type="text" name="bri"><br>
<input type="submit" value="提交">
</form>