为什么需要类型转换
在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端
但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boolean Date 等等
因此 当这些参数进入应用程序时 必须被转换成适合的服务器端编程语言的数据类型
在Servlet中 类型转换工作是由开发者自己完成的
比如我们在易买网里要把分页的信息pageIndex读取出来
String s=request.getParameter("pageIndex");
int pageIndex=Integer.parseInt(s);
类型转换的工作是必不可少的 重复性的. 如果有一个良好的类型转换机制 必将大大节省开发时间,提高开发效率
Struts2提供了强大的类型转换功能
1.内置转换器
对于大部分的常用类型 开发人员在开发过程中不需要自己编码实现类型转换 这是因为在Struts2框架爱中可以完成大多数常用的类型转换
//由内部提供的类型转换器完成
1.String 将 int long double boolean String数组或者java.util.Date类型转换为字符串
2.boolean/Boolean 在字符串和布尔值之间转换
3.char/Character 在字符串和字符之间进行转换
4.int/Integer float/Float long/Long double/Double
5.Date 在字符串和日期只见进行转换 具体输入输出格式与当前的local有关
6.数组和集合 在字符串数组和数组对象 几何对象之间进行转换
2.自定义类型转换器
pom.xml
(需要注意的是build节点 否则局部properties可能无法识别到)
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.14</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> </includes> </resource> </resources> </build>
包结构如上
converter
//StrutsTypeConverter 继承自 DefaultTypeConverter
//DefaultTypeConverter 有一个实现类 XWorkConverter
@Inject public void setObjectFactory(ObjectFactory factory) { this.objectFactory = factory; // note: this file is deprecated loadConversionProperties("xwork-default-conversion.properties"); loadConversionProperties("xwork-conversion.properties"); } public String buildConverterFilename(Class clazz) { String className = clazz.getName(); return className.replace('.', '/') + "-conversion.properties"; }
具体步骤
1.新建一个converter包,在包下创建类型转换器类,继承自抽象类StrutsTypeConvert
//实现两个方法
public Object convertFromString(Map context, String[] values, Class toClass)
//其中 context是OGNL上下文的Map对象
//value是需要转换的字符串值
//toType是要转换的目标类型
public String convertToString(Map context, Object object)
//object是要转换的对象
public class DataConverter extends StrutsTypeConverter { private final DateFormat[] dfs = { new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("yyyy-MM-dd") }; public Object convertFromString(Map map, String[] strings, Class aClass) { String data = strings[0]; for (int i = 0; i < dfs.length; i++) { try { return dfs[i].parse(data); } catch (ParseException e) { continue; } } throw new TypeConversionException(); } public String convertToString(Map map, Object o) { Date date = (Date) o; return new SimpleDateFormat("yyyy年MM月dd日").format(date); } }
2.配置全局类型转换器或者特定类的类型转换器
//特定类
在Action所在的包下建立 类名-conversion.properties
配置: 特定类的属性名=类型转换器类的全名
//全局
在classpath下建立 xwork-conversion.properties
配置: 需要转换的数据类型的类的全名=类型转换器类的全名
3.处理类型转换错误
//需要启动StrutsConversionErrorInterceptor拦截器 它包含在defaultStrack拦截器栈中
(就是不用管)
//需要实现ValidationAware接口 但是ActionSupport实现了这个接口
//配置input结果映射
(失败result=input)
//用<s:filederror>接收