struts2的类型转换

来源:互联网 发布:网络交友英语作文 编辑:程序博客网 时间:2024/04/19 08:49

struts2实际上是通过ognl表达式来实现类型转换的。

 

将jsp页面中的值转换成int, date, point(一个自定义类,包含x,y两个int类型的属性)的类型

java基本类型可以自动转换,对象类型须写转换器。date类型要写成日期格式的字符串,如2008-8-8

 

jsp

   input.jsp

   <h3><font color="red">使用逗号将点的两个坐标分割开</font></h3>
  
   <s:form action="pointConverter">
  
   <s:textfield name="point.x" label="x"></s:textfield>
   <s:textfield name="point.y" label="y"></s:textfield>
   <s:textfield name="age" label="age"></s:textfield>
   <s:textfield name="username" label="username"></s:textfield>
   <s:textfield name="date" label="birthday"></s:textfield>
  
   <s:submit label="submit"></s:submit>
  
   </s:form>

 

entity

public class Point{
    private int x;
    private int y;
}

 

action
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;

public class PointAction extends ActionSupport {
    private Point point;

    private int age;
    private String username;
    private Date date;
   
    public Point getPoint() {
        return point;
    }

    public void setPoint(Point point) {
        this.point = point;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

}

 

converter

point类的转换器


import java.util.Map;
import ognl.DefaultTypeConverter;
import com.test.bean.Point;

public class PointConverter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map context, Object value, Class toType) {

   //如果toType的类型是Point,那么toType就是目标类型,value就是源类型。
        if(Point.class == toType) {
            Point point = new Point();
           
            String[] str = (String[])value;  //因为页面上元素名可以重名,所以用数组。
           
            String[] paramValues = str[0].split(",");
           
            int x = Integer.parseInt(paramValues[0]);
            int y = Integer.parseInt(paramValues[1]);
           
            point.setX(x);
            point.setY(y);
           
            return point;  //返回的值会对应到action中的setter方法
        }
        if(String.class == toType)  {
            Point point = (Point)value;
           
            int x = point.getX();
            int y = point.getY();
           
            String result = "[x=" + x + " , y=" + y + "]";
           
            return result;  //返回的值会对应到页面上的point元素,也就是action中的getter方法
        }
       
        return null;
    }
   
}

 

当从页面将String类型转换为Point类型时会调用setter方法,当发现Point不是一个基本类型时会调用converter并执行第一个if;

当页面获取action中的属性时会调用其getter方法,并执行converter中的第二个if。

 

struts2.xml

        <action name="pointConverter" class="com.test.action.PointAction">
            <result name="success">/output.jsp</result>
            <result name="input">/input.jsp</result>
        </action>

 

配置文件

PointAction-conversion.properties

  PointAction必须与action类同名,-conversion.properties是固定的格式,并且此文件必须与对应的action在同一个包下。 


point=com.test.converter.PointConverter

  是指对PointAction中的point这个属性,用PointConverter这个转换类进行转换。

  要对同一action中多个属性进行转换,可以写多行配置。

原创粉丝点击