struts2中类型转换器
使用背景:在通过jsp页面传递参数时,http通常将参数设置为String类型,即接收String类型参数,而在struts2中提供了类型转换的机制,将传递来的参数转换成action需要的类型。
如下action中定义了基本类型和复杂类型的参数。基本类型的转换struts2在处理过程中会调用基本的转换方法,如将字符串类型转换为整形。
package action; import java.awt.Point; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; import com.opensymphony.xwork2.ActionSupport; public class testAction extends ActionSupport { private String name; private int age; private Date date; private List<String> i; private Set<String> s; private Point p; private List<Point> ps; private Map<String,Point> point; public Map<String, Point> getPoint() { return point; } public void setPoint(Map<String, Point> point) { this.point = point; } public List<Point> getPs() { return ps; } public void setPs(List<Point> ps) { this.ps = ps; } public Point getP() { return p; } public void setP(Point p) { this.p = p; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public List<String> getI() { return i; } public void setI(List<String> i) { this.i = i; } public Set<String> getS() { return s; } public void setS(Set<String> s) { this.s = s; } public String execute(){ return SUCCESS; } }
而如果在前台页面中如果出现像复选框这样的提交参数形式时候,可以通过List或Set在action中接收,或者通过数组也可。
但如果出现像awt.Point类的参数时,该Point类只有set方法没有get方法,意思是在struts2的action中不能将传递过来的参数实现初始化。那么现在就可以使用自定义的类型转换器来实现。如下:
package convertor; import java.awt.Point; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; import com.opensymphony.xwork2.factory.DefaultConverterFactory; public class myPointConvertor extends DefaultTypeConverter { public Object convertValue(Object value,Class toType){ if(toType==Point.class){ Point p=new Point(); String args[]=(String[])value; String xy[]=args[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); } }
为了接收处理Point类型的参数,实现一个该Point类型的转换器,需要注意的是实现该转换器时可以继承struts2中的DafaultConverter类,实现convertValue(Object,Class)方法,该方法中toType表示要转换成的类型,value表示转换的值。该转换器可以将字符串类型和Point类型相互转换,也可以将其它类转换为字符串,如果该转换器无法处理对应情况时,返回给父类的方法转换。
而为了实现该转换器需要在该项目中注册该转换器....
这里只列举一种常用的方法:即在src目录下创建properties文件,而需要注意的是该文件名称必须固定为"xwork-conversion"
文件中需要写入:想要转换的类型 以及对应的转换器 如图:
java.awt.Point=convertor.myPointConvertor
具体实现是这样的:当前台页面中传递过来的参数如p=1,2 而action中发现没有对应的方法初始化action中的参数p,此时strut2就会搜索目录下的注册文件,发现src目录下有对应的转换文件xwork-conversion.properties,找到该文件中和action对应的参数类型相同的类型,Point,然后找到该类型转换器,将需要转换的类型传递给Class toType参数。而将接收过来的参数传递给convertValue方法中的value参数。实现该类型的转换。
对于注册方式,本文中使用了全局注册方式,也可以使用局部注册或者注解方式。
浙公网安备 33010602011771号