自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的.
比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区)
这里涉及到的知识点即是将String转换为任意的JavaBean类型.
一.实现代码
程序配置入口:struts.xml
复制代码
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
复制代码
注:struts.xml是在项目运行的过程中被加载进入内存的,是项目配置的总入口,这里使用
type_struts.xml
复制代码
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
/WEB-INF/type_self_success.jsp
/type_self.jsp
复制代码
注:type_struts.xml是具体负责类型转换时的配置,这里配置了对应的type.TypeSelfAction,以及成功后的跳转页面type_self_success.jsp和程序出错时
的跳转页面type_self.jsp,并将消息回显.
type_self.jsp
复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
复制代码
注:type_self.jsp 是用户访问项目的入口,效果图如下所示:
其中使用POST请求方式是为了避免中文乱码等问题,使用struts自带的标签,如s:password,s:textfield等是为了简化开发,并且使错误消息方便回显.
TypeSelfAction.java
View Code
注:TypeSelfAction是一个与配置文件type_struts.xml相对应的JavaBean文件.
Address.java
View Code
注:Address是关于地址的JavaBean,其分为省份,市,区域三级.
为了实现自定义类型转换还必须实现StrutsTypeConverter的扩展,这里要手动写两个方法将JavaBean转为String和将String转为JavaBean.
TypeAddressConverter.java
复制代码
package type;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* @ClassName: TypeAddressConverter
* @Description: 自定义类型转换器,继承自StrutsTypeConverter,可以将String转换成任意javaBean对象
* @author: amosli
* @email:amosli@infomorrow.com
* @date Feb 13, 2014 11:42:42 PM
*/
public class TypeAddressConverter extends StrutsTypeConverter {
public TypeAddressConverter() {
System.out.println("constructor!");
}
//将String转为对象返回
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("convertFromString");
// System.out.println("context:"+context);
// System.out.println("class:"+toClass);
// System.out.println("values:"+Arrays.toString(values));
if (Address.class == toClass) {// 判断类型是否为将要转成的JavaBean
String[] split = values[0].toString().split("-");//页面中的字符串,下标为0表示第一个字符串,这里如果有多个可以依此类推.
String province = split[0];// 省份
String city = split[1];// 市
String area = split[2];// 区
Address address = new Address(province, city, area);
return address;
}
return null;
}
//将对象转为String返回
public String convertToString(Map context, Object o) {
System.out.println("convertToString");
if (o instanceof Address) {// 判断对象类型是否为Adress
Address adr = (Address) o;
return adr.toString();
}
return null;
}
}
复制代码
注:这里是自定义类型转换的核心代码,即如何将一个JavaBean转为String和将String转为JavaBean.
为了调用上面的方法还必须加一个配置.
xwork-conversion.properties
#JavaBean=self defined typeconverter
type.Address=type.TypeAddressConverter