开发者社区> 光仔december> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAP MM MB1C + 523 移动类型的使用
SAP MM MB1C + 523 移动类型的使用
38 0
SAP MM MB1C + 523 移动类型的使用
SAP MM MB1C + 523 移动类型的使用
36 0
自定义简单的struts2的s标签
一:自定标签前需要了解的知识: BodyTagSupport类的方法:编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(); 他们...
613 0
+关注
光仔december
目前致力于JavaEE(struts/hibernate/spring/MyBatis等框架)、数据库(Mysql/oracle)、静态页面(Html/Css)技术和脚本(JavaSript/JQuery/Ajax)等技术方面的研究
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
Java基础入门(四)-泛型、反射、注解
立即下载
低代码开发师(初级)实战教程
立即下载