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