struts2的Converter所起的作用是在页面数据和Java所支持的数据之间进行转换,在页面中,我们最常用的就是string类型。但是在Java类中,
像int,Date,Map,List等类型,直接将页面所传来的string类型值赋给这些变量,就会引异常,因此在赋值前必须进行类型转换。struts2的Converter就是这个作用。struts为我们准备了基本的Converter,如基本类型(int,double等),还有日期类型,各种集合类型。
不过struts2也给用户留下了自定义转换器的接口,通过继承OGNL.DefaultTypeConverter类,我们可以定义一个转换类。
下面仿照一个在页面中画点的项目说明。假设用户可以在jsp页面中输入一个点的坐标,如(10,10),在后台我们就有一个Point类的实例Point(10,10)
与之对应。要想做到这点,我们就需要利用类型转换了,首先定义一个Point类,然后再定义一个PointConverter类用来进行类型转换。在整一PointAction做响用。Point类的源码如下:
- package tutorial;
- public class Point {
- private int x;
- private int y;
- public int getX() {
- return x;
- }
- public void setX(int x) {
- this.x = x;
- }
- public int getY() {
- return y;
- }
- public void setY(int y) {
- this.y = y;
- }
- public Point(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
- public Point() {
- super();
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- //return "("+getX()+","+getY()+")";
- StringBuffer sb = new StringBuffer("Point(");
- sb.append(x).append(",").append(y).append(")");
- return sb.toString();
- }
- }
PointConverter的源码:
- package tutorial;
- import java.util.Map;
- import org.apache.struts2.util.StrutsTypeConverter;
- public class PointConverter extends StrutsTypeConverter {
- @Override
- public Object convertFromString(Map content, String[] param, Class aclass) {
- // TODO Auto-generated method stub
- if(param.length>0){
- String point = param[0];
- String[] pointXY = point.split(",");
- if(pointXY.length==2){
- Point p = new Point();
- p.setX(Integer.parseInt(pointXY[0]));
- p.setY(Integer.parseInt(pointXY[1]));
- return p;
- }
- else{
- return null;
- }
- }
- else
- return null;
- }
- @Override
- public String convertToString(Map content, Object o) {
- // TODO Auto-generated method stub
- if(o instanceof Point)
- return o.toString();
- return "";
- }
- }
PointAction的源码:
- package tutorial;
- import com.opensymphony.xwork2.ActionSupport;
- public class PointAction extends ActionSupport {
- private Point point;
- private String msg;
- public String getMsg() {
- return msg;
- }
- public void setMsg(String msg) {
- this.msg = msg;
- }
- public Point getPoint() {
- return point;
- }
- public void setPoint(Point point) {
- this.point = point;
- }
- @Override
- public String execute() throws Exception {
- // TODO Auto-generated method stub
- ///System.out.println(point.toString());
- return SUCCESS;
- }
- }
在tutorial目录下建立PointAction-conversion.properties文件:
- point=tutorial.PointConverter
作用是告诉struts2框架在给Point用setter方法赋值时,用tutorial.PointConverter进行转换。其中key是action中需要转换的属性,value要包括包名。
struts.xml片段:
- <action name="point" class="tutorial.PointAction">
- <result>/point/point.jsp</result>
- <result name="input">/point/point.jsp</result>
- </action>
在point下建立point.jsp文件,如下:
- <body>
- <s:form action="point">
- <s:textfield name="point"/>
- <s:textfield name="msg"/>
- <s:property value="msg"/>
- <s:property value="point"/>
- <s:submit/>
- </s:form>
- </body>
发布,运行即可。