`

Struts2自定义类型转换器

 
阅读更多

 

一  转换器的介绍

 

在Web应用中,页面提交请求的参数都是字符串类型的。但是在以前的学习中,我们都是直接在Action中按照需要来定义属性的类型,比如private int age,也没有出错,照样运行啊,而且还能正确运行呢,这是怎么回事情呢?

这就是由Struts2的类型转换框架默默的帮助我们完成的功能,只要用户输入的数据能合理的转换为需要的属性的类型,Struts2的类型转换框架就会在execute方法执行之前,替我们将参数转换为合适的类型。

二,自定义转换器的实现方式

 

1. Struts2的类型转换器实际上是基于OGNL实现的,在OGNL项目中有一个ognl.TypeConverter接口,这个接口就是实现类型转换器必须实现的接口,实现类型转换器必须实现上面的TypeConverter,不过上面的接口里的方法过于复杂,所以OGNL项目还提供了一个该接口实现类:ognl.DefaultTypeConverter,通过继承该类实现自己类型转换器,需要实现该类的public Object convertValue(Map context, Object value, Class toType) 方法。

 

二 ConvertValue方法的说明

 

该方法完成类型转换,不过这种类型转换是双向的,当需要把字符串转化对象实例时,通过该方法实现,当把对象实例转换成字符串时也通过该方法实现。这种转换是通过toType参数类型是需要转换的目标类型。所以可以根据toType参数来判断转换方向。

ConvertValue方法参数和返回意义

l  第一个参数:context是类型转换环境的上下文

l  第二个参数:value是需要转换的参数,根据转换方向的不同value参数的值也是不一样的。

l  第三个参数:toType是转换后的目标类型

l  该方法的返回值是类型转换后的值。该值的类型也会随着转换的方向的改变而改变。由此可见转换的convertValue方法接受需要转换的值,需要转换的目标类型为参数,然后返回转换后的目标值

l  Value为什么是一个字符串数组?

l  对于DefaultTypeConverter转换器而言,它必须考虑到最通用的情形,因此他把所有请求参数都视为字符串数组而不是字符串。相当于getParameterValues()获取的参数值

 

2.继承org.apache.struts2.util.StrutsTypeConverter,由于StrutsTypeConverter提供了更好的封装,所以建议大家在写转换器时通常采用继承StrutsTypeConverter方式来实现.

StrutsTypeConverter类实质上是DefaultTypeConverter的扩展

 publicabstractclass StrutsTypeConverter extendsDefaultTypeConverter

{}

StrutsTypeConverter中的两个核心方法

 publicabstract Object convertFromString(Map context, String[] values, Class toClass);

publicabstract String convertToString(Map context, Object o);

convertFromString方法用于从前台页面获取字符串,将字符串转化为对象

convertToString方法用于将对象以字符串的方式输出到页面

我们在写struts2自定义类型转换类的时候主要就是覆盖上面两个方法

 

三.类型转换器的分类

1 局部类型转换
1.1 普通Action中的类型转换
配置文件存放目录:Action同级目录;
配置文件名:Action名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:Action属性名=转换器包路径

 

1.2 基于模型驱动的类型转换
配置文件存放目录:模型同级目录;
配置文件名:模型名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:模型属性名=转换器包路径

 

2 全局类型转换
配置文件存放目录:项目根目录;
配置文件名:work-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:要转换的类型包路径=转换器包路径

注意:若在模型驱动情况下,即配置了Action的类型转换器又配置了对应模型的转换器,此时只会选择模型转换器;

 

 四,举例:

web页面往后台传值,只能传递字符串,要使得字符串能自动的转换成一个类,以便于后台能更好的处理数据,就需要使用到struts中的类型转换器了。

比如,页面上传递一个值"zhangsan,20",表示张三,20岁,action中可以直接获得直接获得这样一个user对象。

 在action中能使用如下的代码:

public class testconvert extends ActionSupport 
{ 
    private myUser user333; 
 
    public myUser getUser333() { 
        System.out.println("getuser333"); 
        return user333; 
    } 
 
    public void setUser333(myUser user) { 
        System.out.println("setuser333"); 
        this.user333 = user; 
    } 
 
    @Override 
    public String execute() throws Exception 
    { 
        System.out.println("username: " + user333.getUsername()); 
        System.out.println("age: " + user333.getAge()); 
 
        System.out.println("execute"); 
        return SUCCESS; 
    } 
} 

 DefaultTypeConverter实现

public class UserConverter extends DefaultTypeConverter { 
    @Override 
    public Object convertValue(Map context, Object value, Class toType) { 
         
        System.out.println("convertValue"); 
        if(myUser.class == toType)  //从页面向后台对象转换 
        { 
            //value是一个数组,因为它是根据表单中可能有多个元素的name属性是相同的,因此只要name属性为指定的表单元素的值都会被传输过来。 
            String[] str = (String[])value; 
             
            //通常只会取第一个。 
            String firstValue = str[0]; 
             
            System.out.println(firstValue); 
             
            StringTokenizer st = new StringTokenizer(firstValue, ","); 
             
            String username = st.nextToken(); 
            int age =Integer.parseInt( st.nextToken()); 
             
            myUser user = new myUser(); 
             
            user.setUsername(username); 
            user.setAge(age); 
             
            return user;         
        } 
        else if(String.class == toType) //从后台对象向页面转换 
        { 
            myUser user = (myUser)value; 
             
            String username = user.getUsername(); 
            int age = user.getAge(); 
             
            String userInfo = "username: " + username + ", age: " + age; 
             
            return userInfo; 
        } 
        return null; 
    } 
 
} 

 接下来属性文件的命名,必须是按照固定格式的,action类名-conversion.properties,此例中命名为testconvert-conversion.properties,和action类在同一级目录下。如果要寻找某一个action中的某属性对应的转换类,必须按照这种文件名格式寻找对应的文件。属性文件中如下编码格式为:

属性名=转换类,此例中为:

user333=com.tutorialspoint.sconvert.UserConverter,表示user333这个值用com.tutorialspoint.sconvert.UserConverter这个类做转换。

注意,此处的键名user333,是根据setUser333,getUser333而命名的,并不是根据private myUser  user333,因此,即使把private的user333改成变量user444,只要set和get的名字不改,properties文件中依旧是用user333作为键名。

在jsp提交页面中,编码如下

  1. <form action=testconvert method="post"> 
  2.       Please enter your name<br/> 
  3.       <input type="text" name="user333"/> 
  4.       <input type="submit" value="test"/> 
  5.    </form> 

此处的变量名都要对应相同,不然会出错。

对于从Javabean中把值传到前台的HTML,上面的编码已经展示了,唯一要做的是在展示页面把该值读出来。

通过语句<s:property value="user333"/>即可,该语句会调用getUser333这个方法,进而调用 UserConverter 中的convertValue方法,完成转换。

使用StrutsTypeConverter

ublic class UserConverter2 extends StrutsTypeConverter { 
 
    @Override 
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) { 
            System.out.println("convertFromString"); 
             
            //通常只会取第一个。 
            String firstValue = arg1[0]; 
             
            System.out.println(firstValue); 
             
            StringTokenizer st = new StringTokenizer(firstValue, ","); 
             
            String username = st.nextToken(); 
            int age =Integer.parseInt( st.nextToken()); 
             
            myUser user = new myUser(); 
             
            user.setUsername(username); 
            user.setAge(age); 
             
            return user;         
         
    } 
 
    @Override 
    public String convertToString(Map arg0, Object arg1) { 
         
        System.out.println("convertToString"); 
         
        myUser user = (myUser)arg1; 
         
        String username = user.getUsername(); 
        int age = user.getAge(); 
         
        String userInfo = "username: " + username + ", age: " + age; 
         
        return userInfo; 
    } 
 
} 

 当然,运行前要记得在properties文件中,将

user333=com.tutorialspoint.sconvert.UserConverter改成

user333=com.tutorialspoint.sconvert.UserConverter2

全局转换器

----------------------------------

对于某些类型,需要在全局实现转换,则对单个action配置properties文件比较繁琐,struts提供了全局转换配置文件,只需在src目录下新建xwork-conversion.properties文件即可,在文件中依旧是键值对,

但是键名有变化,为具体的类型=对应类型转换器。此例中,内容即写为:

com.tutorialspoint.struts2.myUser=com.tutorialspoint.sconvert.UserConverter2,而实现转换逻辑的类依旧不变。

分享到:
评论

相关推荐

    struts2自定义类型转换器

    struts2 自定义类型转换器,实现一个对象转换成一个int 坐标值。

    Struts自定义类型转换器

    对于Struts1和Struts2中都讲到了自定义类型转换器。但是有些人可能对自定义类型转换器的运行原理不理解,这里进行简单介绍一下……

    struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例

    struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例

    自定义类型转换器

    Struts2自定义类型转换器 如果用户登陆后,可以访问Action中的所有方法,如果用户没有登陆,不允许访问Action中的方法。并且提示你没有权限执行该操作!

    struts2自定义类型转换、拦截器实例练习

    myeclipse平台下使用struts2.3框架搭建实例,理解struts2工作原理,了解struts2自定义类型转换,自定义拦截器,掌握struts2的mvc框架应用

    传智播客struts2.1源代码_自定义类型转换器

    传智播客struts2.1源代码_自定义类型转换器

    Struts 自定义转换器

    Struts 自定义转换器Struts 自定义转换器

    Struts的自定义转换器

    Struts的自定义转换器 public class LineConvertor extends StrutsTypeConverter{...}

    struts2中的类型转换器

    对于基本数据类型 strus2可以自动的将其转换成所需要的类型,但是我们自己定义的引用数据类型无法转换,本文详细介绍了strus2的自定义类型转换器

    Struts2类型转换与输入校验 .zip

    (1) 编写一个自定义类型转换器,并基于应用程序进行全局配置,实现字符串参数与颜色值之间的转换,并将颜色值应用于视图当中。 (2) 根据实验四的图书管理系统,扩展图书新增功能,要求对新增页面表单中的每个...

    Struts2学习教程之自定义类型转换器的方法

    类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行...下面这篇文章主要给大家介绍了关于Struts2学习教程之自定义类型转换器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    实验4 Struts2的类型转换与OGNL表达式语言.doc

    1、 理解Struts2的类型转换类型 2、 理解局部类型转换器与全局类型转换器的区别 3、 掌握Struts2的自定义类型转换 4、 理解OGNL表达式语言

    一篇文章搞定Struts2的类型转换

    主要介绍了关于Struts2类型转换的相关资料,文中主要介绍了Struts2的类型转换器和自定义类型转换器的实现,有需要的朋友可以参考借鉴,下面来一起看看吧。

    struts2全局转换的问题

    测试源代码 博文链接:https://gyj129129.iteye.com/blog/225216

    自定义struts时间转换器

    自定义的struts时间转换器,轻松实现java中时间的转换。

    自己写的struts2类型转换器

    服务器可以接收到的来自用户的数据只能是字符串或者是字符串数组,而在服务器上的对象中 ,这些数据往往有多种不同的类型,如日期(Date) 整数(int) 浮点数... 要实现 上述的转换 ,Struts2中 提供了 converter。

    struts2 详解文档

    自定义类型转换器 全局类型转换器 访问或添加几个属性 文件上传 多文件上传 自定义拦截器 对Action中所有方法进行输入校验 对Action指定方法进行校验 输入校验的流程 基于XML配置方式实现对action的所有...

    Struts2全解Struts2全解

    1、struts2概述 Struts2 软件下载 Struts2 比较重要的类 操作步骤及框架配置 struts运行机制 2、简单的struts2程序 ...9 struts2类型转换 ........ 10struts2标签库 ........ 11、访问数据库 ........

    Struts2 in action中文版

    5.4.3 配置框架使用自定义转换器 103 5.5 小结 106 第三部分 构建视图——标签和结果 第6章 构建视图——标签 108 6.1 入门 108 6.1.1 ActionContext和OGNL 109 6.1.2 虚拟对象ValueStack 111 6.2 Struts 2标签概要...

Global site tag (gtag.js) - Google Analytics