`

[原]Struts2类型转换

阅读更多

[标题]:[原]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

分享到:
评论
2 楼 xiaoqing20 2010-03-18  
下载来看看!呵呵
1 楼 xiaoqing20 2010-03-18  
 

相关推荐

    struts2+json

    当Action执行完毕后,可以返回一个JSON结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给前端。 接着,我们讨论AJAX。AJAX是一种在不重新加载整个网页的情况下,能够更新部分网页的技术。在本资源中,...

    将Struts应用迁移到Struts 2(一)

    因此,在迁移过程中需要将原Action类转换成符合Struts 2规范的形式。 2. **重构配置文件**:Struts 1使用XML文件来配置各种组件,而Struts 2则提供了更为强大的配置方式,包括但不限于XML、注解和文本文件等多种...

    struts2 json

    1. **配置Struts2**:在struts.xml配置文件中,为Action添加JSON结果类型,如`&lt;result type="json"&gt;`。 2. **创建Action**:Action类需要返回一个可以被转化为JSON的Java对象,例如一个Map或自定义的JavaBean。 3....

    struts2 相关原代码ognl xwork

    XWork则是Struts2的核心工作框架,它提供了动作(Action)执行、类型转换、异常处理等功能。 OGNL是一种强大的表达式语言,允许开发者在应用程序中动态地访问和操作对象图。在Struts2中,OGNL被用来获取或设置...

    Struts2 In Action

    - **章节概述**:本章讨论了Struts2中的数据处理技术,包括OGNL表达式语言和类型转换机制。这些是实现高效数据管理和处理的关键工具。 - **关键知识点**: - OGNL的基础用法 - 类型转换的实现方法 - 如何处理...

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 ...10 类型转换 38 Struts2总结 39

    Struts2框架学习总结【自用】【原创】【详细】

    个人struts2框架学习后的梳理和总结,内容丰富,从配置文件到action类、result、ognl、类型转换器、国际化、拦截器、表单验证等等内容,还推荐了很多博客链接,有了它自学Struts2框架毫无压力!

    ssh2中的urlrewrite和Struts2的生成静态页面

    在Struts2中生成静态页面主要依靠其强大的结果类型(result type)机制。通过自定义的结果类型,可以轻松地将动态页面的内容渲染成静态HTML文件,这对于提高网站性能、降低服务器负载等非常有益。 ##### 自定义...

    STRUTS2学习系列

    - **简化代码量**:通过内置的拦截器机制和强大的类型转换系统,大大减少了开发者需要编写的代码量,避免了“类爆炸”现象。 - **易于测试**:Struts 2.0的设计更有利于单元测试,使得测试工作更加便捷高效。 - **...

    Struts2、Spring和Hibernate应用实例

    "Struts2.doc"则可能讲解了Struts2框架的使用,包括Action配置、拦截器、结果类型等内容。 总的来说,这三个框架的结合使用,可以帮助开发者构建出健壮、高效的Java Web应用,对于提升开发效率和软件质量有着显著...

    【原创】Struts2防止表单重复提交.doc

    - **类型转换**:自动处理数据类型的转换。 - **国际化支持**:支持多语言的应用程序。 - **丰富的标签库**:提供了一系列的标签来简化前端开发工作。 #### 三、防止表单重复提交的关键技术 ##### 1. `&lt;s:token/&gt;`...

    struts2教程ppt

    struts2教程,一共有八个ppt。内容丰富。有:1、struts2配置与运行。2、类型转换器。3、 数据较验。4、拦截器。5、文件上传与下载。6、struts2国际化。7、 标签介绍。8、Struts2的插件。

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    如数据类型转换、文件上传和下载、Struts2应用的安全性、调试与性能分析、FreeMarker、Velocily、Ajax,等等。跟随作者一道深入Struts2。聆听大量来之不易的经验之谈。你对Struts2开发框架的理解和应用水平都将更上...

    一个smart+struts2的例子

    标题中的“一个smart+struts2的例子”表明这是一个关于结合SmartGWT和Struts2框架进行Web应用开发的实际示例项目。SmartGWT是Google Web Toolkit (GWT)的一个扩展,提供了一系列高级UI组件和工具,使开发者能够构建...

    中南大学软件学院架构jpetstore重构

    - 灵活的绑定和转换:Struts2支持类型转换和数据验证,可以自动将请求参数绑定到Action对象,简化了数据处理。 - 支持AJAX和富客户端应用:Struts2集成了dojo、jQuery等库,便于创建响应式的用户界面。 2. ...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...

    Java Web程序设计教程

    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...

Global site tag (gtag.js) - Google Analytics