所有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类:
- 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类(转换器):
4、LoginAction-conversion.properties文件:
- 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>为对应类型转换器的实现类(类的全名)。
- points=com.wgy.struts2.PointConverter
5、struts.xml文件:
- <?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>