Struts2提供了很多基本类的类型转换功能,但是对于自定义类,是需要自己来实现类型转换功能的。
下面以一个简单的输入输出操作来说明Struts2如何自定义类型转换。
(1)新建输入和输出的jsp文件。
input.jsp
<!-- input.jsp -->
<body>
<form action="input.action" method="post">
用户名:<input type="text" name="username" size="20"><br>
年龄:<input type="text" name="age" size="20"><br>
出生日期:<input type="text" name="birthday" size="20"><br>
坐标:<input type="text" name="point" size="20"><br>
<input type="submit" name="submit">
</form>
</body>
output.jsp 使用Struts2提供的标签库
<!-- output.jsp -->
<%@ taglib uri="/struts-tags" prefix="s" %>
<body>
<!-- value与com.test.login.InputAction字段属性对应 -->
用户名:<s:property value="username"/><br>
年龄:<s:property value="age"/><br>
出生日期:<s:property value="birthday"/><br>
坐标:<s:property value="point"/><br>
</body>
(2)web.xml文件配置
使用过滤器过滤所有URI
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3)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="struts2" extends="struts-default">
<action name="input" class="com.test.login.InputAction">
<result name="success">/output.jsp</result>
</action>
</package>
</struts>
(4)新建处理类
package com.test.login;
import java.util.Date;
import com.test.bean.Point;
public class InputAction
{
private String username;
private int age;
private Date birthday;
private Point point;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
public Point getPoint()
{
return point;
}
public void setPoint(Point point)
{
this.point = point;
}
public String execute() throws Exception
{
return "success";
}
}
package com.test.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;
}
}
(6)在处理类同目录下新建类型转换配置文件
note:2014.4.7
今天发现一个现象,不需要类转换配置文件,程序同样能够运行起来!
我使用的Struts版本是:struts-2.3.16.1
注意文件名:
InputAction-conversion.properties
命名规则是:处理类-conversion.properties
point=com.test.converter.PointConverter
(7)新建类型转换类
package com.test.converter;
import java.util.Map;
import ognl.DefaultTypeConverter;
import com.test.bean.Point;
public class PointConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(Map context, Object value, Class toType)
{
// String2Point
if (Point.class == toType)
{
// Struts2 默认输入的为String []类型
String[] original = (String[]) value;
// 取第一个字符串 例如:"1,2"
String firstValue = original[0];
// 分割
String[] resultValue = firstValue.split(",");
// 转换成Point
Point point = new Point();
point.setX(Integer.parseInt(resultValue[0]));
point.setY(Integer.parseInt(resultValue[1]));
return point;
}
// Point2String
else if (String.class == toType)
{
Point point = (Point) value;
String result = point.getX() + "," + point.getY();
return result;
}
return null;
}
}
自此,所有工作完成,接下来见证结果:
输入界面:
输出界面:
说明类型转换成功!
http://dl.vmall.com/c0x0yuwaab
http://dl.vmall.com/c0rkdydb43
http://dl.vmall.com/c0vt1z7v05