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

第七章 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教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeVS 1068-乌龟棋

原题 题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋…

java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第一次写java的小游戏想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加,自己找了线程的内容但试了还是成功不了,求大佬们帮一下小白。代码有点乱,大佬们见谅。,&#xff…

乔布斯传

资料参考 http://www.ruanyifeng.com/blog/2013/03/apple_inc_and_division_of_labor.html 苹果公司与分工原理 1.乔布斯 "乔布斯买了一间不错的房子,但家里只有一幅帕黎思(Maxfield Parrish)的画作、一部百灵牌咖啡机和几把双人牌的刀子…

JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...

一个不超过5000行代码的,快速,简单,易用的MVC框架。我们的目的是:让MVC回归其最初的目的。因简单而快速,超过目前各种主流MVC。零侵入,零配置,易于测试,并且让开发者感觉不到MVC的存…

33 Java语言基础控制跳转语句标号

1 public class Add9 {2 public static void main(String[] args) {3 4 a:for (int i 1; i <9 ; i) { // 标号为合法的标识符5 System.out.println("\n");6 b:for (int j 1; j <i ; j) {7 8 System.o…

java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较

JMSUtil与Spring JmsTemplate的对比Author&#xff1a;信仰Date&#xff1a;2012-4-20未完待续&#xff0c;截止日期2012-4-20从以下几方面比较JMSUtil和Spring JmsTemplatel 对JNDI的支持l 对ConnectionFactory、Connection、Destination、Session、MessageProducer、Messag…

java微信支付必要参数_微信支付 开发账号体系各参数详解

商户在微信公众平台提交申请资料以及银行账户资料&#xff0c;资料审核通过并签约后&#xff0c;可以获得表6-4所示帐户(包含财付通的相关支付资金账户)&#xff0c;用于公众帐号支付。帐号及作用&#xff1a;appid &#xff1a;公众帐号身份的唯一标识。审核通过后&#xff0c…

MyEclipse10的正确破解方法

无法转载&#xff0c;故给出原文链接&#xff0c;以供需要者。 MyEclipse10的正确破解方法转载于:https://www.cnblogs.com/qbzf-Blog/p/6341400.html

【二分法】- leetcode

275. H-Index II 278. First Bad Version 此题的条件必须是left < right, 否则如果只有一个版本的话&#xff0c;一直跳不出循环&#xff0c; time limitation。转载于:https://www.cnblogs.com/93scarlett/p/6353765.html

mysql referential_constraints_hibernate4.3.8与spring mvc结合遇到的问题

2703 [2015-01-21 16:47:42 ] - [ip, ref, ua, sid]WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1109, SQLState: 42S022703 [2015-01-21 16:47:42 ] - [ip, ref, ua, sid]ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Unknown table ‘referential_constraints‘ in …

ie11浏览器可以下载java吗_解析:WindowsXP系统能否安装IE11浏览器

现在&#xff0c;IE浏览器可以称得上是市场占有率最高的一款网页浏览器。因为windowsxp是一款比较久的操作系统&#xff0c;所以很多用户都会疑惑在xp上是否能够安装最新版的ie11浏览器。下面&#xff0c;小编就给大家详细解答下该问题。很遗憾的告诉大家&#xff0c;Windows X…

centos uninstall teamviewer11

由于某些原因&#xff0c;centos系统上的teamviewer不能运行。一直没有管它&#xff08;懒&#xff09;。 但是&#xff0c;突然看不下去了。因为每次开机后都自动启动&#xff0c;需要关闭&#xff0c;否则有问题。所以&#xff0c;uninstall。 尝试了很多都失败。尝试的步骤是…

java ajax传输图片_Java使用Ajax实现跨域上传图片功能

说明 &#xff1a;图片服务器是用Nginx搭建的&#xff0c;用的是PHP语言这个功能 需要 用到两个js文件&#xff1a;jquery.js和jQuery.form.jsfunction submitImgSize1Upload() {var postData function( form , callback){var form document.getElementById("upload-for…

opencv调节图片饱和度_OpenCV调整彩色图像的饱和度和亮度

问题如何调整彩色图像的饱和度和亮度解决思路详细步骤&#xff1a;将RGB图像值归一化到[0, 1]然后使用函数cvtColor进行色彩空间的转换接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量最后转换到RGB色彩空间代码# !/usr/bin/env python# -*-enc…

Java并发——线程中断学习

1. 使用interrupt()中断线程当一个线程运行时&#xff0c;另一个线程可以调用对应的Thread对象的interrupt()方法来中断它&#xff0c;该方法只是在目标线程中设置一个标志&#xff0c;表示它已经被中断&#xff0c;并立即返回。这里需要注意的是&#xff0c;如果只是单纯的调用…

python etree创建xml_Python构建XML树结构的实例教程

这篇文章主要介绍了Python构建XML树结构的方法,结合实例形式分析了Python创建与打印xml数结构的实现步骤与相关操作技巧,需要的朋友可以参考下本文实例讲述了Python构建XML树结构的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.构建XML元素#encodingutf-8from…

分布式服务框架原理(一)设计和实现

分布式服务框架设计 分布式服务框架一般可以分为以下几个部分&#xff0c; &#xff08;1&#xff09;RPC基础层&#xff1a; 包括底层通信框架&#xff0c;如NIO框架、通信协议&#xff0c;序列化和反序列化协议&#xff0c;以及在这几部分上的封装&#xff0c;屏蔽底层通信细…

or函数 java_Java OptionalInt orElseGet()用法及代码示例

orElseGet(java.util.function.IntSupplier)方法可帮助我们获取此OptionalInt对象中的值。如果此OptionalInt中不存在值&#xff0c;则此方法返回提供函数产生的结果&#xff0c;并作为参数传递用法:public int orElseGet(IntSupplier supplier)参数&#xff1a;此方法接受提供…

ADO.NET高级应用

ADO.NET事务处理(4个步骤) 1.调用SqlConnection对象的BeginTransaction()方法&#xff0c;创建一个SqlTransaction对象&#xff0c;标志事务开始。 2.将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 3.调用相应的方法执行SqlCommand命令。 4.调用SqlT…

php日常收获

php1、sprintf 用法&#xff08;晚上写成blog w3cschool可查&#xff09;2、使用thinkphp getfield 方法时只查询一个字段默认返回第一条数据&#xff0c;如果想要返回数组需要写成&#xff1a;$this->getField(id,true); // 获取id数组3、数据分页时配合limit&#xff08;x…