类型转换器的作用:
把表单传到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
>