传统的类型转换。(略)

Struts2中提供了内置的基本的类型转换器,可以实现基本类型的自动转换,包括:

  • Integer, Float, Double, Decimal

  • Date and Datetime

  • Arrays and Collections

  • Enumerations

  • Boolean

  • BigDecimal

基于OGNL(对OGNL暂时不熟悉)的类型转换:

  以一个User类为例:

public class User {
private String name;
private String pass; public User() {
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPass() {
return pass;
} public void setPass(String pass) {
this.pass = pass;
}
}

  假设在Action类中有一个字段类型为【private User user;】,那么在以该Action为目标地址的form表单中可以设置提交项的

name=“user.name”/name="user.pass",在表单提交的时候就会自动转换为对应的属性值。需要注意的是在User的定义中必须有一个

无参的该类的构造器,该机制实际上是创建了一个User的对象,然后把表单中提交的对应的属性值通过对应的set方法赋值给该对象,因此

还必须要有对应属性的setXxx方法。

  对于map类型的字段类型【Map<String, User> user;】,同样的表单中的格式:name=“user['one'].name”/name="user['one'].pass";

  对于list类型的字段类型【List User user;】(在学习时,笔者感觉list和数组类似),对应的表单中的格式:name=“use[0].name”/name="user[0].pass"。

   那么如果我们想把字符串“Tom,1111”转换为一个User对象呢,就需要我们自己为复合对象自定义类型转化器了。

  Struts2的类型转换器也是基于OGNL实现的,在OGNL项目中提供了一个TypeConverter接口来完成类型转换,该接口是我们编写自定

义类型转换器所必须要实现的接口。如大多数情况一样,java在提供接口的时候往往也有它默认的实现类来简化我们的工作。

TypeConverter接口的实现类是DefaultTypeCounter,我们实现自己自定义的类型转换器需要重写DefaultTypeCounter里面的

converValue()方法,方法原型为:

关于如何在ecplise中查看各类jar文件的源代码,可以参考:http://jingyan.baidu.com/article/454316ab596470f7a7c03aab.html

public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}

  方法的参数比较容易理解,context是与Action有关的上下文信息,暂且不用管它,只需要知道value是要转换的值,toType是要转换成

的目标类型的Class类型??这里详细了解的话可以参考java反射的相关教程,例如:要转成String类型,那么toType就是String.class;

  下面来看对应于User类的自定义转换器UserConverter的实现:

import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class UserConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
if (toType == User.class) {
String[] params = (String[]) value;
User user = new User();
String[] userValues = params[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
return user;
} else if (toType == String.class) {
User user = (User) value;
return "<" + user.getName() + "," + user.getPass() + ">";
}
return null;
}
}

   在上面的代码中我们使用一个字符串数组类接收value的值,是为了考虑到各方面的情况而采取的办法,不必太纠结于此。

  现在我们有了自己定义的类型转换类,那么怎么才能真正实现当用户请求时实现类型转换呢,在这里从该转换类的作用范围角度考虑,类

型转换有两种类型,一种是局部类型转换器,一种是全局类型转换器。这两种转换器都是通过资源文件的形式联系到我们的项目中的。

  @1,局部类型转换器

    文件名称:"ActionName-conversion.properties"。ActionName是需要转换的属性字段所在的Action类的名字,后面的字符串

为固定格式。

    文件内容:“key=value”的形式,需要转换的属性字段(不是类型)=自定义转换类的全限定名(包名+类名)。例如:user=com.home.UserConverter

    文件路径:与对应Action的class文件在同一路径,一般直接将其放在对应的Action的java文件路径下即可,那末在编译后也会将其

和.class文件编译到同一路径下。

    作用范围:只对指定Action的指定属性有效。

  @2,全局类型转换器

    文件名称:“xwork-conversion.properties”。均为固定格式。

    文件内容:“key=value”的形式,需要转换为的复合类型的全限定名=自定义转换类的全限定名(包名+类名)。例如:com.home.User=com.home.UserConverter。

    文件路径:只需要放到src目录下即可。

    作用范围:对指定类型的所有属性均有效。

Struts2的类型转换(上)的更多相关文章

  1. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  2. 关于Struts2的类型转换详解

    详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...

  3. java之struts2之类型转换

    在使用servlet开发中,表单中提交的数据到servlet后都是字符串类型,需要程序员手动进行类型转换. 但是到struts2后,基本数据类型struts2都可以转换.但是如果是自定义类型,stru ...

  4. (十二)struts2的类型转换

    所有的MVC框架,都属于表现层的解决方案,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件. 这时问题出现了,所有的请求参数都是字符串类型数据,因此MVC框架必须具备将这些字符串请求参数转 ...

  5. struts2学习笔记--上传单个和批量文件示例

    struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可. 单个文件上 ...

  6. struts2的文件上传

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...

  7. jsp\struts1.2\struts2 中文件上传(转)

    jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...

  8. Struts2的类型转换

    Struts2的类型转换 类型转换的作用: HTTP请求都是字符串类型,需要把这些字符串类型转化成相应的数据类型,使得Web应用的控制组件可以使用. 1.內建的类型转换器 Struts2可以完成大多数 ...

  9. Struts2+Uploadify文件上传使用详解

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...

  10. Struts2 文件的上传与下载

    1. Struts2的文件上传需要Apache的commons-io-Version.jar和commons-fileupload-Version.jar两个jar包.2. 页面中的<s:fil ...

随机推荐

  1. ubuntu下包管理器apt-get常用命令

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  2. ASP.NET应用程序的文件类型及文件夹列表

    文件类型: 1. *.aspx文件:这类文件是ASP.NET Web页面,它包括用户接口和隐藏代码. 2. *.ascx文件:这类文件是用户控件.用户控件同Web页面非常相似,但用户不能直接访问用户控 ...

  3. Unity渲染优化中文翻译(二)——CPU的优化策略

    紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...

  4. ajaxFileUpload.js 无刷新上传图片,支持多个参数同时上传,支持 ie6-ie10

    /* 131108-xxj-ajaxFileUpload.js 无刷新上传图片 jquery 插件,支持 ie6-ie10 依赖:jquery-1.6.1.min.js 主方法:ajaxFileUpl ...

  5. BZOJ 3653: 谈笑风生(DFS序+可持久化线段树)

    首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不 ...

  6. python之SQLAlchemy ORM 上

    前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...

  7. XCel 项目总结 - Electron 与 Vue 的性能优化

    XCEL 是由凹凸实验室推出的一个 Excel 数据清洗工具,其通过可视化的方式让用户轻松地对 Excel 数据进行筛选. XCEL 基于 Electron 和 Vue 2.0 进行开发,充分利用 E ...

  8. HA高可用集群

     准备2台机器:主:master:192.168.254.140从:slave:192.168.254.141 1.主上安装:wget www.lishiming.net/data/attachmen ...

  9. Node.js web快速入门 -- KoaHub.js

    介绍 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & ...

  10. JVM运行和类加载过程

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.h ...