[标题]:[原]Struts2类型转换
[时间]:2009-7-15
[摘要]:Struts2类型转换、全局类型转换、集合类型转换
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,类型转换
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys
[正文]:
在Struts Action中可以自动转换String,Date等类型,但是如果Action中用到自定义类型,就需要使用Struts类型转换。
1、Struts类型转换
自定义类型Point
public class Point {
private int x;
private int y;
//省略getter and setter
}
Struts Action:
public class PointAction extends ActionSupport {
private Point point;
......
}
客户端输入:
<s:textfield name="point" label="坐标" ></s:textfield>
这样,从客户端传过来point的String值,不能直接set到PointAction中的point对象中。同时,输出point对象时,直接调用getter也是不行的。这时,就需要一个类型转换器,实现Point类与String之间的转换。可以继承Struts中的ognl.DefaultTypeConverter实现。
/StrutsHelloWorld/src/wintys/struts2/converter/PointConverter.java:
package wintys.struts2.converter;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter {
@SuppressWarnings("unchecked")
@Override
public Object convertValue(Map context, Object value, Class toType) {
//String => Point
if(toType == Point.class){
//获取request string的字符串数组
String[] params = (String[])value;
String param = params[0];
String[] points = param.split(",");
Point point = new Point();
point.setX(Integer.parseInt(points[0]));
point.setY(Integer.parseInt(points[1]));
return point;
}
//Point => String
if(toType == String.class){
Point point = (Point)value;
int x = point.getX();
int y = point.getY();
return "["+x+","+y+"]";
}
return null;
}
}
同时,还需要一个配置文件(须跟PointAction在同一目录下)PointAction-conversion.properties(名称为XXXAction-conversion.properties)来告诉Struts2 PointAction中属性使用哪一个转换器类。
PointAction-conversion.properties:
point=wintys.struts2.converter.PointConverter
2、Struts全局类型转换
对于每一个属性应用转换器,当属性过多时会显得很繁琐,这时可以使用Struts全局类型转换。全局类型转换器名称为xwork-conversion.properties,与struts.xml同在classes目录下。
xwork-conversion.properties:
#global converter settings
#class to be converted = converter
wintys.struts2.converter.Point=wintys.struts2.converter.PointConverter
3、Struts集合类型转换
当PointAction中的属性是集合类型,跟非集合类型类似。
public class PointAction extends ActionSupport {
private List<Point> points;
......
}
转换器类可以继承org.apache.struts2.util.StrutsTypeConverter,实际上StrutsTypeConverter继承于 ognl.DefaultTypeConverter。
/StrutsHelloWorld/src/wintys/struts2/converter/StrutsPointConverter.java:
package wintys.struts2.converter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* Struts类型转换: StrutsTypeConverter 继承于 ognl.DefaultTypeConverter
* @author Winty
* @version 2009-07-14
*
*/
@SuppressWarnings("unchecked")
public class StrutsPointConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<Point> points = new ArrayList<Point>();
for(String value : values){
String[] p = value.split(",");
Point point = new Point();
point.setX(Integer.valueOf(p[0]));
point.setY(Integer.valueOf(p[1]));
points.add(point);
}
return points;
}
@Override
public String convertToString(Map context, Object o) {
List<Point> points = (List<Point>)o;
StringBuilder sb = new StringBuilder();
sb.append("[");
for(Point p : points){
sb.append("(");
sb.append(p.getX());
sb.append(",");
sb.append(p.getY());
sb.append(") ");
}
sb.append("]");
return sb.toString();
}
}
当然也需要在PointAction-conversion-properties中配置:
PointAction-conversion-properties:
#property = converter
point=wintys.struts2.converter.PointConverter
points=wintys.struts2.converter.StrutsPointConverter
4、详细内容:
/StrutsHelloWorld/WebRoot/converter/input.jsp:
其中<s:textfield name="point" label="坐标" ></s:textfield>
可以换成
<s:textfield name="point.x" label="坐标.x"/>
<s:textfield name="point.y" label="坐标.y"/>
此时,Point类无需类型转换,Struts会自己去找point对象的x与y的setter方法。
当输出时,只需重写Point类的toString()方法即可。
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>请以逗号分割输入点的坐标,如:5,3</h1>
<s:form action="pointConverter">
<s:textfield name="point" label="坐标" ></s:textfield>
<s:textfield name="points" label="points1"> </s:textfield>
<s:textfield name="points" label="points2"></s:textfield>
<s:textfield name="age" label="年龄"></s:textfield>
<s:textfield name="name" label="姓名"></s:textfield>
<s:textfield name="birthday" label="出生日期"></s:textfield>
<s:submit value="确定"></s:submit>
</s:form>
</body>
</html>
/StrutsHelloWorld/WebRoot/converter/output.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:property value="point"/><br/>
<s:property value="points"/><br/>
<s:property value="age"/><br/>
<s:property value="name"/><br/>
<s:property value="birthday"/> <br/>
</body>
</html>
/StrutsHelloWorld/src/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>
<package name="MyStruts" extends="struts-default">
<action name="pointConverter" class="wintys.struts2.converter.PointAction">
<result name="success">/converter/output.jsp</result>
</action>
</package>
</struts>
/StrutsHelloWorld/WebRoot/WEB-INF/web.xml:
<?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>MyStruts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>MyStruts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
/StrutsHelloWorld/src/wintys/struts2/converter/Point.java:
package wintys.struts2.converter;
/**
*
* @author Winty
* @version 2009-07-12
*/
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;
}
}
/StrutsHelloWorld/src/wintys/struts2/converter/PointAction.java:
package wintys.struts2.converter;
import java.util.Date;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author Winty
* @verion 2009-07-12
*/
@SuppressWarnings("serial")
public class PointAction extends ActionSupport {
private Point point;
private List<Point> points;//集合类型的转换
private int age;
private String name;
private Date birthday;
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public List<Point> getPoints() {
return points;
}
public void setPoints(List<Point> points) {
this.points = points;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
[参考资料]:
《浪曦视频之Struts2应用开发系列》
[附件]:
源代码: StrutsTypeConverter.zip
分享到:
相关推荐
01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 ...10 类型转换 38 Struts2总结 39
个人struts2框架学习后的梳理和总结,内容丰富,从配置文件到action类、result、ognl、类型转换器、国际化、拦截器、表单验证等等内容,还推荐了很多博客链接,有了它自学Struts2框架毫无压力!
01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 ...10 类型转换 38 Struts2总结 39
struts2教程,一共有八个ppt。内容丰富。有:1、struts2配置与运行。2、类型转换器。3、 数据较验。4、拦截器。5、文件上传与下载。6、struts2国际化。7、 标签介绍。8、Struts2的插件。
如数据类型转换、文件上传和下载、Struts2应用的安全性、调试与性能分析、FreeMarker、Velocily、Ajax,等等。跟随作者一道深入Struts2。聆听大量来之不易的经验之谈。你对Struts2开发框架的理解和应用水平都将更上...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3输入校验 123 6.3.1输入校验的必要性 123 6.3.2编程方式实现输入校验 125 6.3.3...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
1. spring杂谈[原创] 1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 ...1.32 Spring3 Web MVC下的数据类型转换(第一篇)——《跟我学Spring3 Web MVC》抢先看 1.33 Spring 注入集合类型
以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 工程...
多用户,权限管理,可以分配用户各自的操作目录和可操作的文件类型。 5.两种浏览方式:列表模式和图标模式。 6.在图标模式下可以预览图片文件的缩略图。 7.强大的编辑器可以实现自动缩进,显示行号 和 字符...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
增加更多的类型自动转换支持 增加全局查询范围 toJson/toArray支持隐藏和增加属性输出 增加远程一对多关联 [其它] 日志存储结构调整 Trace调试功能从日志类独立并增强 原Input类功能并入Request类 类库映射...
3.3 使用转换器完成类型转换 143 3.3.1 转换器概述、用途 144 3.3.2 JSF内建转换器 144 3.3.3 使用转换器 145 3.3.4 转换失败后的错误消息 149 3.4 自定义转换器 154 3.4.1 实现转换器类 154 3.4.2 注册转换器 156 ...
15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.1.1. DelegatingRequestProcessor 15.4.1.2. DelegatingActionProxy 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.5.1.1. 将 ...
15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.2. ActionSupport Classes 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制...