这里用一个例子介绍局部类型转换:
1.先在MyEclipse里面新建一个WebApp文件,我这里取名为:struts_converter
2.导入struts2的jar包
3.配置web.xml过滤器Filter
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4.新建一个input.jsp文件
<body> <h3>使用逗号将点的两个坐标分开</h3> <s:form method="post" action="pointConverter.action" > <s:textfield name="point" label="Point"></s:textfield> <s:textfield name="age" label="Age"></s:textfield> <s:textfield name="username" label="Username"></s:textfield> <s:textfield name="birthday" label="Birthday"></s:textfield> <s:submit label="SUBMIT"/> </s:form> </body>
5.新建一个PointAction类
public class PointAction extends ActionSupport {
private static final long serialVersionUID = 5497987645500599609L;
private Point point;
private int age;
private Date birthday;
private String username;
//getter()和setter()
}
6.新建一个Point类
package com.zchen.struts.bean;
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;
}
}
7.写一个Converter类
package com.zchen.struts.converter;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import com.zchen.struts.bean.Point;
public class PointConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
if(Point.class == toType){ //判断目标类型是那种类型(从字符串数组转换到对象)
Point point = new Point();
String[] str = (String[])value;//取得的值是一个数组(通用性考虑)
String[] paramValues = str[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point;
}
if(String.class == toType){
Point point = (Point)value;
int x = point.getX();
int y = point.getY();
String result = "[x="+x+" y="+y+"]";
return result;
}
return null;
}
}
5.com.zchen.struts.action包下面建一个"PointAction-conversion.properties"也就是和PointAction类在同一个目录下。
在文件里面写: point=com.zchen.struts.converter.PointConverter
6.配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="login" extends="struts-default" > <action name="pointConverter" class="com.zchen.struts.action.PointAction"> <result name="success">/output.jsp</result> </action> </package> </struts>
7.新建一个跳转页面
<body> point:<s:property value="point"/><br> age:<s:property value="age"/><br> username:<s:property value="username"/><br> birthday:<s:property value="birthday"/><br> </body>
这里简要概述一下运行流程:
1.tomcat在运行过程中先根据input.jsp页面的action判断确认运行的是struts,找到web.xml—Filter—struts.xml
2.在struts.xml中找出要跳转到的类:PointAction
3.根据set方法自动将jsp页面的表单属性name值赋值给对应的setter方法(所以命名要规范)
4.发现有对象的时候Point,找出有没有对应的Converter即根据properties配置文件找到PointConverter类。
5.DefaultTypeConverter判断目标类型是哪一种,由于jsp页面所填的都是String类型所以在这里调用的是if (Point.class == toType)方法,将字符串转换成Point对象并return point对象。
6.再次就已经将jsp页面的属性全部给队员的属性赋值。
7.调用execute()方法返回SUCCESS
8.struts.xml根据返回类型跳转到:output.jsp页面
9.输出显示(在栈中查找<s:dubug>模式可以看到)
10.当遇到对象类型的时候,重复第4步调用if(String.class == toType){}方法
11.将对象类型转换成String
说明:struts内置的转换器会将String转换成int date...类型所以不必写转换器。