Struts2中的类型转换
2013-01-20 09:44
288 查看
所有MVC框架都需要负责解析HTTP请求参数,并将请求参数传给控制器组件,而HTTP请求参数都是字符串类型,因此,MVC框架必须将这些字符串参数转换成相应的数据类型。
struts2提供了强大的类型转换机制,支持转换的类型有boolean、char、int、long、float、double、Date(日期格式使用用户请求所在Locale的SHORT格式)、数组、集合。有些特殊情况,需要把字符串转换成符合对象时,需要使用自定义类型转换器。
在OGNL项目中定义了一个TypeConverter接口,该接口是自定义转换器必须实现的接口,该接口提供了一个实现类:DefaultTypeConverter,通常采用扩展该类来实现自定义转换器,此时只需重写该类的convertValue方法。该方法定义如下:
public Object convertValue(Map context, Object value, Class toType),参数含义如下:
context:类型转换环境的上下文
value:需要转化的参数,随着转换方向的不同,该参数的值也不同。
toType:需要转换的目标类型,当toType是复合对象时,表明需要将字符串类型转为复合对象实例,当toType是String类型时,表明需要将复合对象实例转换成String类型。
对于DefaultTypeConverter转换器而言,它必须考虑到最通用的情况,因此它把所有请求参数都视为字符串数组,而非字符串。
为了简化实现,struts2提供了一个StrutsTypeConverter抽象类,该类是DefaultTypeConverter类的子类,已实现了DefaultTypeConverter类的convertValue方法。实现该方法时,它将两个不同转换方向替换成不同的方法——当需要把字符窜转换成复合合类型时,调用convertFromString方法,需要把复合类型转换成字符串类型时,调用convertToString方法。
1、Point类(需要转换的对象)
3、 PointConverter类(转换器):
4、LoginAction-conversion.properties文件:
[/code]
[/code]
struts2提供了强大的类型转换机制,支持转换的类型有boolean、char、int、long、float、double、Date(日期格式使用用户请求所在Locale的SHORT格式)、数组、集合。有些特殊情况,需要把字符串转换成符合对象时,需要使用自定义类型转换器。
在OGNL项目中定义了一个TypeConverter接口,该接口是自定义转换器必须实现的接口,该接口提供了一个实现类:DefaultTypeConverter,通常采用扩展该类来实现自定义转换器,此时只需重写该类的convertValue方法。该方法定义如下:
public Object convertValue(Map context, Object value, Class toType),参数含义如下:
context:类型转换环境的上下文
value:需要转化的参数,随着转换方向的不同,该参数的值也不同。
toType:需要转换的目标类型,当toType是复合对象时,表明需要将字符串类型转为复合对象实例,当toType是String类型时,表明需要将复合对象实例转换成String类型。
对于DefaultTypeConverter转换器而言,它必须考虑到最通用的情况,因此它把所有请求参数都视为字符串数组,而非字符串。
为了简化实现,struts2提供了一个StrutsTypeConverter抽象类,该类是DefaultTypeConverter类的子类,已实现了DefaultTypeConverter类的convertValue方法。实现该方法时,它将两个不同转换方向替换成不同的方法——当需要把字符窜转换成复合合类型时,调用convertFromString方法,需要把复合类型转换成字符串类型时,调用convertToString方法。
1、Point类(需要转换的对象)
public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } 2、LoginAction类: [code]public class LoginAction extends ActionSupport { private List<Point> points; public List<Point> getPoints() { return points; } public void setPoints(List<Point> points) { this.points = points; } @Override public String execute() throws Exception { return SUCCESS; } }
3、 PointConverter类(转换器):
public class PointConverter extends StrutsTypeConverter { @SuppressWarnings("rawtypes") @Override public Object convertFromString(Map context, String[] values, Class toClass) { List<Point> points = new ArrayList<Point>(); for (String value : values) { Point point = new Point(); String[] paramValues = value.split(","); int x = Integer.parseInt(paramValues[0]); int y = Integer.parseInt(paramValues[1]); point.setX(x); point.setY(y); points.add(point); } return points; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public String convertToString(Map context, Object o) { List<Point> points = (List<Point>) o; StringBuilder result = new StringBuilder(); result.append("{"); for (Point point : points) { int x = point.getX(); int y = point.getY(); result.append("[").append("x=").append(x).append(",y=").append(y) .append("],"); } result.append("}"); result.deleteCharAt(result.length() - 2); return result.toString(); } } 转换器写完后需要注册,包括全局转换器和局部转换器,局部类型转换器只对指定Action的特定属性起作用,文件命名为ActionName-conversion.properties,与对应Action位于同一目录下,”-conversion.properties”为固定部分;全局类型转换期对该类型的所有属性起作用,文件命名固定为xwork-conversion.properties,该文件内容由多想”<propType>=<ConvertClass>”组成,<propType>为需要转换的类的全名(包名+类名),<ConvertClass>为对应类型转换器的实现类(类的全名)。
4、LoginAction-conversion.properties文件:
[/code]
points=com.wgy.struts2.PointConverter 5、struts.xml文件: [code]<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" extends="struts-default"> <action name="login" class="com.wgy.struts2.LoginAction"> <result name="success">/result.jsp</result> </action> </package> </struts> 6、index.jsp页面:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>index</title> </head> <body> <h3> <font color="red">用逗号分割点的坐标</font> </h3> <s:form action="login"> <s:textfield name="points" label="point1" /> <s:textfield name="points" label="point2" /> <s:textfield name="points" label="point3" /> <s:submit value="提交" /> </s:form> </body> </html> 7、result.jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>result</title> </head> <body> points:<s:property value="points" /> <br /> <s:debug /> </body> </html>
[/code]
相关文章推荐
- struts2-类型转换
- Struts2的类型转换器
- struts2类型转换器 返回值是空
- struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持
- Struts2学习(第七篇)——数据类型转换详解
- struts2_自定义类型转换失败的提示信息
- struts2 类型转换器 Date型数据转换
- Struts2类型转换的说明及案例分析
- 为struts2自定义类型转换器:Date的转换
- struts2之类型转换
- Struts2中的类型转换器
- Struts2学习:类型转换篇
- Struts2之OGNL类型转换
- 关于Struts2的类型转换详解
- Struts2--ognl表达式和类型转换
- java框架之struts2数据类型转换(1)
- Struts2 系列之(3)类型转换
- struts2里的类型转换发生了错误,错误信息是放在field级别里,而不是放在action级别里
- Struts2类型转换实例
- 黑马程序员——struts2学习笔记四(类型转换)