分为两种:局部和全局类型转换器
局部:仅仅对某个action的属性起作用。文件格式:ActionName-conversion.properties。文件内容:propertyname=完整的类型转换器类名。
如:LoginAction-conversion.properties. 内容:user=包名.UserConverter (此处的user是类User的属性,如private User user;)
全局:对所有action的特定类型属性都会有效。 文件格式:xwork-conversion.properties(固定不变)。 文件内容:复合类型完整名=对应的完整的类型转换器类名。
如:xwork-conversion.properties. 内容:包名.User=包名.UserConverter
注:局部类型转换器的properties文件只能与其对应的Action类在同一个目录下即同一个包下。
全局类型转换器的properties文件只能位于src下即与struts.xml在同一个目录下。供所有action所用。
实例:
package test;
import com.opensymphony.xwork2.Action;
import dao.Telphone;
import dao.User;
public class Testuser implements Action {
private User user; //User类型属性封装请求参数
private Telphone telphone;
public Telphone getTelphone() {
return telphone;
}
public void setTelphone(Telphone telphone) {
this.telphone = telphone;
}
private String indicate;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getIndicate() {
return indicate;
}
public void setIndicate(String indicate) {
this.indicate = indicate;
}
public String execute() throws Exception {
//通过user属性的username属性和password属性来决定转向
if(getUser().getUsername().equals("guangming") &&getUser().getPassword().equals("admin"))
{
setIndicate("转换成功");
return SUCCESS;
}
setIndicate("转换失败");
return "error";
}
}
//以下是类型转换器
package test;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import dao.Telphone;
import dao.User;
public class UserConverter extends DefaultTypeConverter
{
//重写convertValue方法,该方法需要完成双向转换
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
if(toType==User.class) //将字符串向复合类型转换
{
String[] params=(String[])value; //系统的请求参数是一个字符串数组
User user=new User();
String[] uservalues=params[0].split(","); //处理请求参数数组第一个数组元素,并将字符串分割开
user.setUsername(uservalues[0]);
user.setPassword(uservalues[1]);
return user; //返回转换来的实例
}
else if(toType==String.class) //将复合类型转换为字符串
{
User user=(User)value; //将需要转换的值强制转换为User实例
return user.getUsername()+","+user.getPassword();
}
else if(toType==Telphone.class)
{
String[] params=(String[])value;
Telphone telphone=new Telphone();
String[] telvalues=params[0].split("-");
telphone.setSection(telvalues[0]);
telphone.setPhone(telvalues[1]);
return telphone;
}
else if(toType==String.class)
{
Telphone telphone=(Telphone)value;
return telphone.getSection()+"-"+telphone.getPhone();
}
return null;
}
}