第七章 Type Convertion

为什么会有类型转换?

HTTP协

议中传递的任何内容都是String类型的,所以一旦我们在服务器上需要一个非String类型的对象,例如:int或者Date,那么我们就需要在收到

HTTP请求的数据的时候,首先将String类型的数据变换为我们需要的对应类型的数据,之后再使用。这个过程就是类型转换

类型转换在Struts2中是透明的,即Struts2内置了类型转换机制。

转换原理:

以一个例子来说明如何使用Struts2内置的类型转换功能。加入我们希望用户在画面上输入一个字符形式的坐标点,例如(33,2)而我们希望在程序中得到一个Point(33, 2)的类型与之对应。

要想达到上面的功能我们需要一个名字位:ActionName-conversion.properties的文件,在文件中定义Action中的属性和画面字段之间的转换关系。例如:

point = com.jpleasure.convertor.PointConverter

就是说画面一个叫做point的项目(input类型,name为point)提交到服务器上之后,在向Action中的point属性赋值之前需要使用

PointConverter将字符串转换为Point类,在Action中的point属性向画面显示的时候需要使用PointConverter将

Point类转换为字符串类型。

其中PointConverter需要实现ognl.TypeConverter接口。TypeConverter有两个接口,一个负责将字符串转变为对象类型,另一个负责将对象类型转换为字符串类型,分别对应着内容的提交和显示。

有些时候我们希望所有的Point类在默认的情况下使用PointConverter来转换,这时候我们需要定义全局的Converter类。这可以在xwork-conversion.properties文件中定义,例如:

com.jpleasure.Point = com.jpleasure.convertor.PointConverter

在Struts2中提供了一个TypeConverter接口的默认实现:

org.apache.struts2.action.util.StrutsTypeConverter

这个类有两个默认的抽象转换方法和performFallbackConversion,performFallbackConversion方法负责处理类型转换出错的处理。

自定义TypeConverter的时候,可以实现TypeConverter接口,之后编写TypeConverter的转换方法,也可以从

StrutsTypeConverter继承而来,StrutsTypeConverter本身实现了TypeConverter接口,并且实现了基本的

转换方法。

内建的转换:

Struts2内建了对以下类型的转换的支持:

String

boolean / Boolean

char / Character

int / Integer, float / Float, long / Long, double / Double

dates - 使用HTTP 请求对应地域(Locale)的SHORT形式转换字符串和日期类型。

arrays -每一个字符串内容可以被转换为不同的对象

collections - 转换为Collection类型,默认为ArrayList类型,其中包含String类型。

对于Array类型和Collection类型,需要对其中的每一个元素进行单独的转换。

自定义TypeConverter:

使用如下的代码自定义需要的TypeConverter

public class MyConverter extends StrutsTypeConverter {

public Object convertFromString(Map context, String[] values, Class toClass) {

.....

}

public String convertToString(Map context, Object o) {

.....

}

}

为了让Struts2框架发现类型转换的错误,需要在出错的情况下在上述的两个方法中抛出XWorkException或者TypeConversionException。

我们使用一个例子来展现如何实现TypeConvertor类型:

// Point 类

package com.jpleasure.conversion;

/**

* Created by IntelliJ IDEA.

* User: ma.zhao@dl.cn

* Date: 2007/09/04

* Time: 12:33:43

* To change this template use File | Settings | File Templates.

*/

public class Point {

private int x;

private int y;

public Point() {

}

public Point(int x, int y) {

this.x = x;

this.y = 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;

}

public String toString() {

StringBuffer sb = new StringBuffer("Point(");

sb.append(x).append(", ").append(y).append(")");

return sb.toString();

}

}

// PointConvertor 类

package com.jpleasure.conversion;

import org.apache.struts2.util.StrutsTypeConverter;

import java.util.Map;

/**

* Created by IntelliJ IDEA.

* User: ma.zhao@dl.cn

* Date: 2007/09/04

* Time: 12:34:18

* To change this template use File | Settings | File Templates.

*/

public class PointConvertor extends StrutsTypeConverter {

// 从字符串转换为对象的方法。

public Object convertFromString(Map map, String[] strings, Class aClass) {

if (strings.length > 0) {

String pointStr = strings[0];

String[] pointStrArray = pointStr.split(",");

if (pointStrArray.length == 2) {

Point p = new Point();

p.setX(Integer.parseInt(pointStrArray[0]));

p.setY(Integer.parseInt(pointStrArray[1]));

return p;

} else {

return null;

}

} else {

return null;

}

}

// 从对象转换为字符串的方法。

public String convertToString(Map map, Object o) {

if (o instanceof Point) {

return o.toString();

} else {

return "";

}

}

}

// 测试用PointAction类

package com.jpleasure.action;

import com.jpleasure.conversion.Point;

import com.opensymphony.xwork2.ActionSupport;

/**

* Created by IntelliJ IDEA.

* User: ma.zhao@dl.cn

* Date: 2007/09/04

* Time: 12:45:11

* To change this template use File | Settings | File Templates.

*/

public class PointAction extends ActionSupport {

private Point point;

public Point getPoint() {

return point;

}

public void setPoint(Point point) {

this.point = point;

}

public String execute() {

return SUCCESS;

}

}

// JSP文件

Created by IntelliJ IDEA.

User: ma.zhao@dl.cn

Date: 2007/09/04

Time: 12:47:40

To change this template use File | Settings | File Templates.

--%>

Point Page

// PointAction配置文件类。

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

/point/Point.jsp

/point/Point.jsp

复杂的类型转换:

(1)处理Null值

些时候我们会被NullPointerException搞的焦头烂额,为什么系统不能为我们定义了但是没有初始化的对象建立一个空的Object的引用

呢?Struts2有这个功能,但是在默认情况下Struts2关闭了这个功能,要想开启这个功能,需要在ParameterInterceptor开始

处理参数之前在ValueStack中将一个值开启,这个值是:InstantiatingNullHandler.CREATE_NULL_OBJECTS。

在Java代码中InstantiatingNullHandler.CREATE_NULL_OBJECTS的值是:xwork.NullHandler.createNullObjects

创建空值对象的规则为:

如果属性声明为Collection或List, 将返回一个ArrayList并赋值给空引用.

如果属性声明为Map, 将返回一个HashMap并赋值给空引用.

如果空值属性是一个带有无参构造函数的简单Bean, 将使用ObjectFactory.buildBean(java.lang.Class, java.util.Map)方法创建一个实例.

(2)Collection和Map

简单List转换

//JSP代码

Created by IntelliJ IDEA.

User: mazhao

Date: 2007/09/04

Time: 12:47:40

To change this template use File | Settings | File Templates.

--%>

Point Page

//Action代码

package com.jpleasure.action;

import com.jpleasure.conversion.Point;

import com.opensymphony.xwork2.ActionSupport;

import java.util.List;

/**

* Created by IntelliJ IDEA.

* User: ma.zhao@dl.cn

* Date: 2007/09/04

* Time: 12:45:11

* To change this template use File | Settings | File Templates.

*/

public class PointAction extends ActionSupport {

private Point point;

private List references;

public Point getPoint() {

return point;

}

public void setPoint(Point point) {

this.point = point;

}

public List getReferences() {

return references;

}

public void setReferences(List references) {

this.references = references;

}

public String execute() {

if(references == null) {

System.out.println("references is null");

} else {

System.out.println("references length is:" + references.size());

for(Object s: references) {

System.out.println("" + s);

}

}

return SUCCESS;

}

}

对象类型List转换(key-value pair 方式)

// Person 类型

package org.apache.struts2.showcase.conversion;

import java.io.Serializable;

/**

*

*/

public class Person implements Serializable {

private String name;

private Integer age;

public void setName(String name) { this.name = name; }

public String getName() { return this.name; }

public void setAge(Integer age) { this.age = age; }

public Integer getAge() { return this.age; }

}

// PersionAction 类型

package org.apache.struts2.showcase.conversion;

import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

/**

*

*/

public class PersonAction extends ActionSupport {

private List persons;

public List getPersons() { return persons; }

public void setPersons(List persons) { this.persons = persons; }

public String input() throws Exception {

return SUCCESS;

}

public String submit() throws Exception {

return SUCCESS;

}

}

// PersonAction转化配置文件PersonAction-conversion.properties

# PersonAction中persons属性(List类型)中元素的类型

Element_persons=org.apache.struts2.showcase.conversion.Person

// JSP部分代码

name="%{'persons['+#stat.index+'].name'}" />

name="%{'persons['+#stat.index+'].age'}" />

其中stat记录了当前循环的信息,其中stat.index表示当前循环的下标。

所以上述代码会生成如下的代码:

name="persons[0].name" />

name="persons[0].age" />

name="persons[1].name" />

name="persons[1].age" />

name="persons[2].name" />

name="persons[2].age" />

对象类型List转换(value 方式)

// Address 类型

package org.apache.struts2.showcase.conversion;

/**

* @version $Date: 2006-11-23 12:31:52 -0500 (Thu, 23 Nov 2006) $ $Id: Address.java 478625 2006-11-23 17:31:52Z wsmoak $

*/

public class Address {

private String id;

private String address;

public String getId() { return id; }

public void setId(String id) { this.id = id; }

public String getAddress() { return address; }

public void setAddress(String address) { this.address = address; }

}

// AddressAction 类型

package org.apache.struts2.showcase.conversion;

import java.util.LinkedHashSet;

import java.util.Set;

import com.opensymphony.xwork2.ActionSupport;

/**

* @version $Date: 2006-11-23 12:31:52 -0500 (Thu, 23 Nov 2006) $ $Id: AddressAction.java 478625 2006-11-23 17:31:52Z wsmoak $

*/

public class AddressAction extends ActionSupport {

private Set addresses = new LinkedHashSet();

public Set getAddresses() { return addresses; }

public void setAddresses(Set addresses) { this.addresses = addresses; }

public String input() throws Exception {

return SUCCESS;

}

public String submit() throws Exception {

System.out.println(addresses);

return SUCCESS;

}

}

//AddressAction转换配置文件AddressAction-conversion.properties

KeyProperty_addresses=id

Element_addresses=org.apache.struts2.showcase.conversion.Address

CreateIfNull_addresses=true

// JSP代码

name="%{'addresses(\\'id'+#stat.index+'\\').address'}" />

上述代码会转换为:

name="addresses('id0')" />

name="addresses('id1')" />

name="addresses('id2')" />

注意两个地方:

第一,没有向服务器提交Address的id属性,那么Address的id属性是什么呢?

KeyProperty_addresses=id表示向服务器提交的内容的key部分("id0”, "id1”, "id2”)会被认定为Addredd的id。

第二,CreateIfNull_addresses=true表示及时客户端没有向服务器提交任何Address内容,服务器也会为AddressAction的addresses 建立一个长度为0的Set。

相关的一些经验

开发的过程中不要一味的使用String类型,使用String类型无论在处理的速度还是内

存的使用上都不是最好的方式。一般情况下,Java的模型类(JavaBean,

Action等都可以视为Java模型类,因为其中表示了模型的信息),一般情况下需要和数据库中的类型一致。这样才能保证最好的性能。

那么像java.util.Date,Integer等类型需要表示到JSP页面上的时候还是需要表示为String类型的,但是Struts2都已经帮助实现了,所以请使用具体的类型吧,不要总是使用String类型。

ExtJS教程-Hibernate教程-Struts2 教程-Lucene教程

java的type转化class_第七章 (类型转换)Type Convertion相关推荐

  1. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  2. Java编程思想读书笔记——第七章:复用类

    第七章 复用类 使用类而不破坏现有程序代码,有两种达到这一目的的方法: 在新的类中产生现有类的对象,也就是说new一个对象,这种方法称为组合 按照现有类的类型来创建新类,不改变现有类的形式,在其基础上 ...

  3. 读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]

    文章目录 第七章 封装 1. 包的概念 2. 访问权限修饰符 3. 接口和实现 4. 类访问权限 5. 本章小结 第七章 封装 访问控制(或者隐藏实现)与"最初的实现不恰当"有关. ...

  4. JAVA程序设计第十版第七章_java程序设计第七章答案

    参考答案如下 程序对于颅内压增高较重或急性病人的措施为 设计struct abc {int a,b,c;}; void main(){ struct abc s[2]={{1,2,3},{4,5,6} ...

  5. bool类型_Python3.7知其然知其所以然-第七章 类型转换

    使用python处理数据时,不可避免的要进行数据类型之间的转换,诸如整型和字符串之间的转换. 转换有隐式和显式转换,隐式也称自动转换,不用做特殊.显示转换,也称为数据类型的强制类型转换,通过内置函数实 ...

  6. 郑莉版java第三章答案_java语言程序设计(郑莉)第七章课后习题答案.docx

    java语言程序设计(郑莉)第七章课后习题答案.docx 还剩 10页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: if (matrix.isTria ...

  7. 第七章 Java基础类库

    前言:如果你真正学习到了这里,那么先容许我夸赞一下你,太棒了!哪怕你对前面六篇文章的掌握度达到50%也是非常了不起的了,关于后面的文章学习我只能说,非常简单,只是我们文章会非常详细的介绍实现原理和一些 ...

  8. java第七章学习笔记:访问控制---java世界的卫兵

    [因为每一章都篇幅比较长(10多页,难免有的地方会写错字,如发现请指正,本人不胜感激)] [今天看到我居然有一名粉丝,内心还是有点小激动的,之间我是一枚不是很喜欢技术的妹纸,但是从现在开始,我从被动学 ...

  9. Gradle2.0用户指南翻译——第七章. Java 快速入门

    翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...

最新文章

  1. springboot中如何添加第三方的jar包或者说如何配置本地jar
  2. docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群
  3. Android OkHttp完全解析 是时候来了解OkHttp了
  4. request.cookie[name]的到的过期时间是{0001-1-1 0:00:00}
  5. ogg批量配置_Mac批量文件重命名A Better Finder Rename11.07直装
  6. IBM Lotus Domino V8.5 服务器管理入门手册
  7. 网页排序向量计算和改进
  8. Swift 枚举的用法
  9. 色彩的对比度和饱和度_使用高色彩对比度进行更方便的设计
  10. ERP管理web后台_数字化、智能化工厂管理系统原型、erp生产管理、仓库管理、采购管理、设备能源管理、计划管理、数字化工厂erp管理系统、生产计划、采购计划、用料请领、产品bom、工序管理、车间设备
  11. c语言求阶乘和的流程图_C语言:数据结构-栈与递归
  12. 转贴:【游途道标】明帝国曾经拥有的火炮技术到了满清时期已成为可悲的衰落。
  13. 阿迪达斯进博会展示首款碳足迹低于3千克运动鞋;霍尼韦尔携30余项产品和解决方案亮相进博会 | 美通社头条...
  14. 计算机中sqrt函数是什么意思,(excle sqrt)excel中的SQRT是什么意思?
  15. 五、C语言创建桌面程序:画笔和画刷
  16. 【Python爬虫】爬取云班课资源,活动
  17. Linux下tree命令安装及使用
  18. 1——从IOP思想开始
  19. 14nm 8代酷睿?Intel Coffee Lake曝2018上市
  20. 编程进阶:Java小白的序列化Serializable接口

热门文章

  1. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
  2. c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版
  3. 计算机管理也无法运行,【两种解决方法】任务管理器打不开怎么办?
  4. 悬浮窗java_Java制作一个简易的悬浮窗/PPT悬浮窗
  5. SQL Server 2008R2安装详细教程(附安装包)
  6. odp 加固 mysql_creator是一款为php框架odp的脚手架工具
  7. 数据结构-栈5-栈的应用-后缀转中缀
  8. VS中监视窗口,即时窗口和输出窗口的使用
  9. Python之日志处理(logging模块)详解
  10. UI控件之UISlider