【Struts2框架】第七节类型转换-类型转换原理和自定义类型转换器实例

简介:

1.类型转换原理

类型转换是struts拦截器来实现的。
类型转换的意思是能够把参数转换成action里面所需要的类型。
转换不了可以使用自己写的转换器(但几乎不用自己写)。

在struts的传参过程中,我们已经不知不觉的在使用类型转换了
例如:
http://localhost:8080/Struts2_upload/type/test?name=jack&age=9
在http传参数的时候,参数的类型永远是string类型,但是上述url中,age是int类型。所以发生了类型转换。

所谓的类型转换就是把字符串转为特定类型,特定类型转字符串。
特定类型转字符串好转(写好toString()就行),但是字符串转为特定类型的话,就要考虑的多了。一般的特定类型struts2都已经解决(在url使用特定的输入方式),但是某种类的类型,例如Point类型的数据就不太好转。此时需要定义自定义转换转型。

自定义转换器转换数据的过程以及原理:

方法1(局部转换器,action对应的包下面有转换文件):
首先struts2接到参数(一般不是规范写法,如Point的传参应该是p.x=1&p.y=2,但是写成p=1,2,这样不加转换器struts2是识别不出来的),假设得到的参数是Point类型的p=5,8。接下来struts2发现并没有这种东西,转换不成Point,struts2就会去找action对应的包下面有没有一个对应的转换文件,会去找转换文件里面的成员变量里有没有对应的转换器,如果找到一个,就会尝试把接收到的参数传给转换器“转换方法”中的形参value,把要转换的类型传给toType。最后“转换方法”执行得到一个结果Object,结果就是一个new出来的Point

方法2(全局转换器,src下面有转换文件,常用);
转换文件名称必须为:xwork-conversion.properties。
如果全局转换文件放在action包外的话,需要指定action参数的具体路径。
如:java.awt.Point=cn.edu.hpu.converter.MyPointConverter

方法3(注解):
Annotation略

如果遇到非常麻烦的类型转换,就用:
request.setAttribute();
session


2.几种类型的输入

http://localhost:8080/Struts2_upload/type/test?name=jack&age=9
name:jack
age:9


http://localhost:8080/Struts2_upload/type/test?interests=math&interests=english&interests=chinese
[math, english, chinese]


http://localhost:8080/Struts2_upload/type/test?d=1990-8-12%205:32:15
date:90-8-12
1990/08/12 05:32:15


http://localhost:8080/Struts2_upload/type/test?users['a']=usera&users['b']=userb
{b=userb, a=usera}


3.自定义转换类型器例子

写一个自定义转换Point类型参数的转换器:
struts.xml:

<package name="type" namespace="/type" extends="struts-default">
	<action name="test" class="cn.edu.hpu.action.TestAction">
		<result>/TypeConversion/test.jsp</result>
	</action> 
</package>

cn/edu/hpu/action/TestAction.java:
package cn.edu.hpu.action;

import java.awt.Point;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {
	private Point p;
	
	public String execute() throws Exception {
		
		return super.execute();
	}

	public Point getP() {
		return p;
	}

	public void setP(Point p) {
		this.p = p;
	}
}

cn/edu/hpu/converter/MyPointConverter.java:
package cn.edu.hpu.converter;

import java.awt.Point;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
//写自己的转换器,继承DefaultTypeConverter父类
public class MyPointConverter extends DefaultTypeConverter{


	@Override
	//参数(Object)值传给value,要转换的类型传给toType
	public Object convertValue(Object value,Class toType) {
		if(toType==Point.class){
			Point p=new Point();
			String[] strs =(String[])value;
			String[] xy=strs[0].split(",");
			p.x=Integer.parseInt(xy[0]);
			p.y=Integer.parseInt(xy[1]);
			return p;
		}
		if(toType==String.class){
			return value.toString();
		}
		return super.convertValue(value, toType);
	}
	
}

test.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib prefix="s" uri="/struts-tags"  %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'test.jsp' starting page</title>


  </head>
  
  <body>
         points:<s:property value="p"/>	<br/>
  </body>
</html>

重点:
在action所在的包cn/edu/hpu/action/内写
TestAction-conversion.properties文件,内容为:
p=cn.edu.hpu.converter.MyPointConverter

输入:
http://localhost:8080/Struts2_upload/type/test?p=3,4
结果:
points:java.awt.Point[x=3,y=4]

原理:
首先struts2接到参数,假设得到的参数是Point类型的p=5,8。接下来struts2发现并没有这种东西,转换不成Point,struts2就会去找action对应的包下面有没有一个对应的转换文件,会去找转换文件里面的成员变量里有没有对应的转换器,如果找到一个,就会尝试把接收到的参数传给转换器“转换方法”中的形参value,把要转换的类型传给toType。最后“转换方法”执行得到一个结果Object,结果就是一个new出来的Point


4.Point的另一个转换器

还是以之前的Point转换为例

<pre name="code" class="java">package cn.edu.hpu.converter;

import java.awt.Point;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

//写自己的转换器2,StrutsTypeConverter继承自DefaultTypeConverter
//StrutsTypeConverter做了扩展和简化

public class MyPointConverter2 extends StrutsTypeConverter{

	@Override
	//从String转成其他类型
	public Object convertFromString(Map context, String[] values, Class yoType) {
		Point p=new Point();
		String[] strs =(String[])values;
		String[] xy=strs[0].split(",");
		p.x=Integer.parseInt(xy[0]);
		p.y=Integer.parseInt(xy[1]);
		return p;
	}

	@Override
	//从其他类型转成String
	public String convertToString(Map map, Object o) {
		// TODO Auto-generated method stub
		return o.toString();
	}
	
}
 

转载请注明出处:http://blog.csdn.net/acmman/article/details/47156789

相关文章
|
2月前
|
安全 编译器 程序员
特殊类设计以及C++中的类型转换
特殊类设计以及C++中的类型转换
30 2
|
2月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
2月前
|
安全 编译器 C++
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
23 0
|
1月前
|
Java Spring
自定义转换之美:深入Spring自定义类型转换器的奥秘
自定义转换之美:深入Spring自定义类型转换器的奥秘
15 0
|
11月前
|
设计模式 安全 Java
C++特殊类的设计与类型转换
C++特殊类的设计与类型转换
|
JavaScript 前端开发
|
Java
Java面向对象(12)--对象类型转换 (Casting )
Java面向对象(12)--对象类型转换 (Casting )
106 0
Java面向对象(12)--对象类型转换 (Casting )
|
Java C++
JavaSE (三)原生数据类型的8种类型定义、使用和陷阱
可以将表示数据范围小的值赋予表示范围大的变量;不能直接将表示范围大的值赋给表示范围小的变量,如果非要转换,只能通过强转类型实现。
|
前端开发 Java
Struts2实现类型转换器(十五)下
Struts2实现类型转换器(十五)
Struts2实现类型转换器(十五)下