【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

时间: 2024-11-10 00:08:46

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

Spark修炼之道(进阶篇)——Spark入门到精通:第七节 Spark运行原理

作者:周志湖 网名:摇摆少年梦 微信号:zhouzhihubeyond 本节主要内容 Spark运行方式 Spark运行原理解析 本节内容及部分图片来自: http://blog.csdn.net/book_mmicky/article/details/25714419 http://blog.csdn.net/yirenboy/article/details/47441465 这两篇文件对Spark的运行架构原理进行了比较深入的讲解,写得非常好,建议大家认真看一下,在此向作者致敬! 1. Sp

【Struts2框架】第二节Result-Global_Results_全局结果集

Global_Results_全局结果集,定义了一个大家都可以使用的结果集. 例子: <package name="test" namespace="/javaee" extends="struts-default"> <!-- 同一个package中的Action都可以直接用 --> <global-results> <result name="mainpage">/Hello

【Struts2框架】第二节Result-向结果传参数

重定向需要传值的原因就是栈值不共享 struts.xml: <package name="resultTypes" namespace="/r" extends="struts-default"> <action name="result2" class="cn.edu.hpu.action.ResultAction2"> <result type="redirect

Struts2类型转换(一) 常规类型,自定义类型,错误处理

Struts2的类型转换是基于OGNL表达式的.有良好的扩展性. WEB应用接收到表单提交的数据都 是String类型的,Struts2可方便的转换为 常规类型(数值,日期)/ 自定义类型(User,Point类). 如果转换中出现异常,conversionError拦截器会自动处理该异常. 一, 常规类型的转换: 比如表单提交的信息有 用户名,生日, 年龄, Action中对应的数据类型分别是 String, Date, int.没什么好说的, Struts2会自动完成. Struts2内建了

Struts2框架基础篇

首先,要了解Struts2框架中参数传递的大体流程: 服务器端的Web容器收到用户的请求(URL)--Struts2的核心控制器FilterDispatcher接受用户发起的请求,然后判断这个请求是交给action还是交给web组件来处理:如果请求的action或web组件不存在,就会报错404.在整个处理过程中,需要一个辅助对象: ActionMapper ,它会确定调用哪个Action--相应的action会根据struts.xml的配置信息(首先执行拦截此action的所有拦截器,然后再执

详解Java的Struts2框架的结构及其数据转移方式_java

Struts2的结构 1.为什么要使用框架? (1)框架自动完成了很多琐屑的任务 对于Struts2来说,它帮助我们方便地完成了数据类型转换.数据验证.国际化等等 Web开发中常见的任务.还有Spring中大量使用的Template模式,都是在让我们的开发 过程更加自动化.智能化.使用框架就是避免重新发明轮子,重新复制这些模板代码. 框架让我们将精力更多地放在更高级别的问题上,而不是常见工作流和基础任务上. (2)使用框架就是优雅地继承了框架背后的架构 框架背后的架构通常定义了一系列的工作流程,

Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法。

问题描述 Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法. 关键代码如下: ${Msg.sendUser.username } 上面代码的意思是:把${Msg.sendUser}提交到action,赋值给 action类属性message的sendUser.(sendUser数据类型是User对象) 请求后提示找不到action中的自定义方法,但是我表单中的值换成下面 的,变成赋值给message的属性sendUser的属性username,就能成功. 是

java struts2-怎样利用Java 中的struts2框架实现数据库中用户登录功能?

问题描述 怎样利用Java 中的struts2框架实现数据库中用户登录功能? 在Action中LoginAction怎样写? 配置文件中怎样写? 总体实现能够使数据库中已经存在的用户凭自己的密码与用户名登录成功呢?数据库是Oracle数据库.

基本教程篇--第六、七节

HorizontalBarSampleDemo.cs和StackedBarSampleDemo.cs介绍 第六.七节HorizontalBarSampleDemo.cs和StackedBarSampleDemo.cs介绍 这两节与第五节相比,并没有本质上的区别,所以这里只给出相应的代码.示例图和必要的说明. using System; using System.Drawing; using System.Collections; using ZedGraph; namespace ZedGrap