【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

相关文章
|
Swift iOS开发 开发者
iOS 应用上架流程详解
iOS 应用上架流程详解
|
Java Spring 容器
springboot的启动流程
springboot的启动流程
|
12月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
519 1
|
12月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
433 0
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
881 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
12月前
|
人工智能 运维 安全
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
340 4
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
705 38
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
429 1
|
缓存 负载均衡 中间件
代理服务器的原理是什么?它有什么主要功能?
随着科技的进步和互联网的发展,越来越多的企业在业务上都需要用到代理,那么代理服务器的原理是什么?它有什么主要功能?那么小编接下来就跟大家介绍一下:
592 0
代理服务器的原理是什么?它有什么主要功能?
|
存储
地理探测器Geodetector软件下载、操作方法与结果解释
本文介绍Geodetector软件的下载方法,以及地理探测器分析的完整操作,并对其结果加以解读~
2431 2
地理探测器Geodetector软件下载、操作方法与结果解释