您的位置:首页 > 编程语言 > Java开发

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类(需要转换的对象)
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 类型转换