zoukankan      html  css  js  c++  java
  • struts2学习笔记(3)——struts2的局部类型转换

    今天又学到了一个新的东西,就是struts2的类型转换。 

    为什么要类型转换? 

    今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存。 

    因为在表单里面传过去的是字符串,如“12,23”,要把它存进Point类,就必须进行类型转换。将字符串用“,”截取,然后第一部分赋值给x,后一部分赋值给y。 

    首先设计输入页input.jsp 

    <s:form action="converter">  
        <s:textfield name="point" label="point"></s:textfield> 
        <s:textfield name="age" label="age"></s:textfield> 
        <s:textfield name="date" label="date"></s:textfield> 
        <s:textfield name="username" label="username"></s:textfield> 
        <s:submit></s:submit> 
    </s:form> 


    定义一个Point类(限于篇幅,省略了set和get方法): 

    package cn.tshining.beans;
    
    public class Point {
    
        private int x; 
        private int y; 
    
    } 

    定义一个Action(ConverterAction),继承ActionSupport,在这里同样省略了set和get方法 

    private Point point; 
    private int age; 
    private Date date; 
    private String username; 
    
    public String execute() throws Exception {  
        return SUCCESS; 
    } 

    设计输出页(output.jsp) 

    point:<s:property value="point"/><br/> 
    age:<s:property value="age"/><br/> 
    date:<s:property value="date"/><br/> 
    username:<s:property value="username"/><br/> 


    配置struts.xml 

    <action name="converter" class="cn.tshining.action.ConverterAction"> 
        <result name="success">/output.jsp</result> 
    </action> 

    接下来重点便是怎么样写转换类! 

    struts提供了一些类型转换功能,只用继承这些类,override转换方法就可以了。这里使用ognl的DefaultTypeConverter类,override其convertValue方法即可。 

    public class PointConverter extends DefaultTypeConverter {
    
        @Override 
        public Object convertValue(Map context, Object value, Class toType) {
    
            if (Point.class == toType) { 
                Point point = new Point();
    
                String[] str = (String[]) value; 
                String[] p = str[0].split(","); 
                int x = Integer.parseInt(p[0]); 
                int y = Integer.parseInt(p[1]);
    
                point.setX(x); 
                point.setY(y);
    
                return point; 
            } else if (String.class == toType) { 
                Point point = (Point) value;
    
                StringBuilder sb = new StringBuilder();
    
                sb.append("[ x = ").append(point.getX() ).append(" , y = ").append(point.getY() ).append( 
                        " ] "); 
                return sb.toString(); 
            } 
            return null;
    
        }
    
    } 

    此方法中value是一个字符串数组(是数组!),toType是要转换的类型,有两种形式,一种是从客户端到服务器,从字符串转换为自定义类型,另一种是从自定义类型到字符串。 

    写完后基本上大功告成,但是还有一个问题,struts2怎么知道什么东西要做类型转换?要用什么来转? 

    这个就要用到properties文件了。该文件需要和Action类放在同一个目录中。而且命名也是有要求的。 

    在这里,这个文件名是ConverterAction-conversion.properties 

    内容为: 

    point=cn.tshining.converter.PointConverter 

    文件名“-”前和定义的Action是一样的,后面是固定的-conversion.properties,内容中“=”前是在Action中定义的需要转换的属性名,后面是转换的类名。 

    如此配置,即可完成struts2中的局部类型转换。 

    为什么是局部?因为这要做,每个properties文件只能转换一种类型,如果有多种类型需要转换,就要定义多个properties文件。 

    分析一下这个程序的工作流程: 

    首先用户从客户端发送数据,struts2拦截用户请求。 

    然后转发到ConverterAction,ConverterAction在调用set方法时,读取到properties配置文件,发现point属性需要做类型转换,然后将用户输入的point数据交给PointConverter类做类型转换。 

    PointConverter做完数据类型转换后,返回Point对象,ConverterAction调用set方法将point对象赋值给point字段。 

    接着ConverterAction执行execute方法,返回“success”,struts2将结果转发至output.jsp。 

    在output.jsp中输出point字段时,再次调用PointConverter类,将自定义类型转换成字符串输出。 


    在此例中比较复杂的是对这个工作流程的理解。 

    另外在ConverterAction的execute方法中返回的也不是一个字符串,而是一个常量,建议用这个常量,这样可以帮助理解,免得误以为可以返回任意字符串。

    原地址:http://blog.csdn.net/fanghao16/article/details/4713188 

  • 相关阅读:
    八月份总结+项目总结
    缓存图片技术
    7月份总结
    【转】JavaScript 事件顺序:冒泡和捕获
    【转】UTF16和UTF8什么区别?
    【转】javascript和html中unicode编码和字符转义的详解
    【笔记】javascript权威指南-第六章-对象
    Delphi 中的MD5实现方法《转》
    DELPHI 代码块集合
    Delphi Access 表中查询日期时间提示出错的问题《转》
  • 原文地址:https://www.cnblogs.com/yanff/p/3558099.html
Copyright © 2011-2022 走看看