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

前言

为什么要在struts2中类型转换器?

:struts2 只能够对java中的8种原态类型以及String、Date等常用类型提供自动转换。

但是这绝对不能满足我们的需求,如果我们想将页面的数据整合成一个javabean。到Action中去时Action得到的是一个对象,那么这个需求就需要我们使用类型转换器。

大部分时候,使用Struts2框架提供的内建的类型转换器和基于OGNL的类型转换器,就能满足大部分的类型转换需求;但是也存在一些特殊的情况下,可能需要将一个指定格式的字符串转换成一个复合对象,此时就需要使用自定义类型转换器。比如,客户端传送一个"jelly|123456"这样的字符串到服务器,我们需要将这个字符串转换成一个User类型实例,其中“jelly”作为用户名,“123456”作为用户密码。

自定义类型转换类

有这样的一个前台页面:

<form action="login" method="post">
 用户:<input type="text" name="userinfo"><br>
 <input type="submit" value="转换">
</form>

对应Action的部分代码为:

private User user; // 这是一个复合类型
private String tip;
public void setUsers(User user)
{
 this.user = user;
}

public User getUser()
{
 return user;
}

我们希望用户在前台页面输入格式为“username|password”这样的字符串,通过自定义的类型转换器,将这样“username|password”格式的字符串转换为User类型。下面就说说如何实现自定义类型转换器。

Struts2的类型转换器实际上依然是基于OGNL框架的,在OGNL项目中有一个TypeConverter接口,这个接口就是自定义类型转换器必须实现的接口。该接口的定义代码如下:

// OGNL提供的类型转换器接口
public interface TypeConverter
{
 public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
}

实现类型转换器必须实现上面的TypeConverter,不过上面接口里的方法太过复杂,所以OGNL项目还为该接口提供了一个实现类:DefaultTypeConverter,通常都采用扩展该类来实现自定义类型转换器。实现自定义类型转换器需要重写DefaultTypeConverter类的convertValue方法。

下面就是转换为User类实例的转换类:

public class UserConverter extends DefaultTypeConverter
{
 public Object convertValue(Map context, Object value, Class toType)
 {
 if (toType == User.class)
 {
  // 当需要将字符串向User类型转换时
  // 系统的请求参数是一个字符串数组
  String[] params = (String[])value;

  // 创建一个User实例
  User user = new User();

  // 只处理请求参数数组第一个数组元素,并将该字符串以'|'符号分割成两个字符串
  String[] userValues = params[0].split("\\|");

  // 为User实例赋值
  user.setName(userValues[0]);
  user.setPassword(userValues[1]);

  return user;
 }
 else if (toType == String.class)
 {
  // 当需要将User类型向字符串转换时
  User user = (User)value;
  return "<" + user.getName() + "|" + user.getPassword() + ">";
 }
 return null;
 }
}

convertValue方法的作用是非常简单的,该方法负责完成类型的转换,但是这种转换是双向的,根据参数toType来判断目标类型,然后我们就可以实现两个方向的转换逻辑了。

注册类型转换器

有了类型转换器是不够的,因为Struts2框架还不知道何时使用这些类型转换器,所以必须将类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。

Struts2主要支持以下两种注册类型转换器的方式:

  • 注册局部类型转换器:局部类型转换器仅仅对某个Action的属性起作用
  • 注册全局类型转换器:全局类型转换器对所有Action的特定类型的属性都会起作用

下面就来分别说说以上两种注册类型转换器的方法。

局部类型转换器

Struts2允许开发者通过局部类型转换文件来指定类型转换的相关配置信息。类型转换文件就是一个普通的Properties(*.properties)文件。局部类型转换文件的文件名应为ActionName-conversion.properties形式,其中ActionName是需要使用该类型转换文件的Action名,后面的-conversion.properties字符串则是固定的部分。类型转换文件应该放在和Action类文件相同的位置。

说完局部类型转换文件,就接着说这个注册局部类型转换器。注册局部类型转换器只需要在局部类型转换文件中增加以下一行配置即可:

<propName>=<ConverterClass>

将上面的<propName>替换成需要进行类型转换的属性、<ConverterClass>替换成类型转换器的实现类即可。对于上面实现的UserConverter类,需要在局部类型转换文件中这样配置:

# 指定user属性需要使用UserConverter类来完成类型转换
user=com.jellythink.practise.UserConverter

全局类型转换器

局部类型转换器的局限性太明显了,它只能对指定Action、指定属性起作用。但是,如果应用中有多个Action都包含了User类型的属性,或者一个Action中包含了多个User类型的属性,使用全局类型转换器将更合适。

全局类型转换器不是对指定Action的指定属性起作用,而是对指定类型起作用。比如对所有类型为com.jellythink.practise.User类型的属性起作用。

注册全局类型转换器应该提供一个xwork-conversion.properties文件,该文件就是全局类型转换文件,需要将该文件直接放在Web应用的WEB-INF/classes路径下即可。

全局类型转换文件内容由多项<propType>=<ConvertClass>项组成,将propType替换成需要进行类型转换的类型,将ConvertClass替换成类型转换器的实现类即可。对于上面实现的UserConverter类,需要在全局类型转换文件中这样配置:

com.jellythink.practise.User=com.jellythink.practise.UserConverter

“局部”VS“全局”

局部类型转换只能对指定Action的指定属性进行转换,不管该Action的该属性是数组也好,是集合类型也罢,该转换器的转换方法对该属性只转换一次。如果某个Action有个List<User>类型的属性users,那么局部类型转换器将只调用一次convertValue()方法,该方法把users请求参数一次性地转换为一个List<User>集合对象。

全局类型转换器会对所有Action的特定类型进行转换,如果一个Action的某个属性是数组或集合类型,而数组或集合元素是需要该转换器转换的方法,那么全局类型转换器将不是对该集合属性整体进行转换,而是对该集合属性的每个元素进行转换,也就是说,当该属性是一个数组或集合时,该数组或集合中包含几个该类型的元素,那么就会调用convertValue()方法几次。

熟悉二者的区别以后,在以后工作中就的多多注意了;特别是数组和集合元素进行转换时的区别。

基于Struts2的自定义类型转换器

上面介绍了通过继承DefaultTypeConverter类,在一个convertValue方法中,通过判断toType参数来判断转换的方向,然后分别实现不同转换方向的转换逻辑。而在Struts2框架中,为了简化类型转换器的实现,特别提供了一个StrutsTypeConverter抽象类,该类是DefaultTypeConverter类的子类。它已经实现了DefaultTypeConverter类的convertValue方法;实现该方法时,它将以前在convertValue方法中通过判断toType参数的方式来实现两个不同方向的转换变成了调用以下两个不同的方法:

  • 当把字符串转换成复合类型时,调用convertFromString抽象方法
  • 当把复合类型转换成字符串时,调用convertToString抽象方法

而我们需要做的就是继承StrutsTypeConverter抽象类,并且实现convertFromString和convertToString这两个抽象方法。

修改后的代码如下:

public class UserConverter extends StrutsTypeConverter
{
 public Object convertFromString(Map context, String[] values, Class toClass)
 {
  User user = new User();
  String[] userValues = values[0].split("\\|");
  user.setName(userValues[0]);
  user.setPassword(userValues[1]);
  return user;
 }

 public String convertToString(Map context, Object o)
 {
  // 当需要将User类型向字符串转换时
  User user = (User)o;
  return "<" + user.getName() + "|" + user.getPassword() + ">";
 }
}

总结

这篇文章对Struts2中的自定义类型转换器进行了详细的总结,总体思路如下:

  • 自定义类型转换器需要继承Struts2框架的某个抽象类
  • 实现自定义的类型转换器类
  • 注册自定义类型转换器类

就这几步就搞定了自定义类型转换器喽。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • 关于Struts2的类型转换详解
  • 如何解决struts2日期类型转换
  • Struts2开发 基本配置与类型转换
  • 一篇文章搞定Struts2的类型转换
  • struts2中类型转换实例代码
  • Struts2单选按钮详解及枚举类型的转换代码示例
(0)

相关推荐

  • 如何解决struts2日期类型转换

    因此要想保证系统一定要正确第对Date类型进行转换,就要写一个全局的类型转换类,进行Date与String之间的类型转换. 复制代码 代码如下: package com.great.util; import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map; import com.opensymphony.xwork2.conversion.impl.

  • 关于Struts2的类型转换详解

    一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构应用的请求参数是通过浏览器发送到服务器的,这些参数不可能有丰富的数据类型,因此必须在服务器端完成数据类型的转换 MVC框架是一个表现层解决方案,理应提供类型转换的支持,Struts2提供了功能非常强大的类型转换支持. 二.表现层数据的处理 1.对于web应用而言,表现层主要用于与用户交互,包括收集用户输入数据,向用户呈现服务器的状态.因此表现层的数据的流向主要有两个方向:输入数据和输出数

  • Struts2开发 基本配置与类型转换

    一.Action配置中的各项默认值 <package name="csdn" namespace="/test" extends="struts-default">        <action name="helloworld" class="cn.csdn.action.HelloWorldAction" method="execute" > <resu

  • struts2中类型转换实例代码

    类型转换 所有的页面与控制器传递的数据都是String类型,在对其进行处理时可能会用到各种的数据类型,程序无法自动完成数据类型的转换,这就需要我们在代码中进行手手动操作,这个过程就称为类型转换. 内置类型转换器 在Web应用程序中,用户在视图层输入的数据都是字符串,业务控制层在处理这些数据时,就必须把从视图层传递过来的字符串进行类型转换.Struts2提供了简单易用的数据类型转换机制,struts2提供的类型转换如下: 1)String:将int.long.double.boolean.Stri

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

    前言 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换!下面来看看详细的介绍吧. 一.类型转换的意义 所有的MVC框架,解决的都是表现层的解决方案,都需要收集用户请求参数,并把参数提供给控制器.但是,在Web应用中所有的请求参数都是字符串类型的,Java是强类型的语言,如何将字符串转换为Java类型,这是框架要解决的一个问题. 例如,一个注册页需要输入年龄.日期等.这时候就需要将日期.年龄字符串转换为相应类型. 二.Str

  • Struts2单选按钮详解及枚举类型的转换代码示例

    本文研究的主要是Struts2框架单选按钮详解及枚举类型的转换的相关示例,具体如下. 使用struts2标签,毫无疑问要先引入标签库: <%@ taglib prefix="s" uri="/struts-tags"%> 假设radio单选框中List的值为一个Map集合: <s:radio list="#{'MAN':'男','WOMEN':'女'}" name="gender" listKey="

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

    前言 为什么要在struts2中类型转换器? :struts2 只能够对java中的8种原态类型以及String.Date等常用类型提供自动转换. 但是这绝对不能满足我们的需求,如果我们想将页面的数据整合成一个javabean.到Action中去时Action得到的是一个对象,那么这个需求就需要我们使用类型转换器. 大部分时候,使用Struts2框架提供的内建的类型转换器和基于OGNL的类型转换器,就能满足大部分的类型转换需求:但是也存在一些特殊的情况下,可能需要将一个指定格式的字符串转换成一个

  • springmvc实现自定义类型转换器示例

    springmvc除了自带的部分类型转换之外,还可以自定义类型转换器,按照以下步骤: 1.写一个类实现Converter接口 package com.hy.springmvc.entities; import org.springframework.core.convert.converter.Converter; import com.google.gson.Gson; public class DepartmentConvertor implements Converter<String,

  • SpringMVC实现自定义类型转换器

    我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据类型的转换,如将String转换成Integer和Double等: <mvc:annotation-driven /> 或 复制代码 代码如下: <bean id="conversionService" class="org.springframework.format.support.Formatt

  • Mybatis自定义类型转换器的使用技巧

    一般情况下,mybatis自带的类型转换器已经足够用了,但是需求永无止境,自定义类型转换器还是学一下吧,指不定哪天会用上. 举个没啥用的示例 javabean如下: public class User { private Integer id; private Message message; } public class Message { private Integer id; private String address; private String job; } 数据库User表如下:

  • SpringMVC自定义类型转换器实现解析

    这篇文章主要介绍了SpringMVC自定义类型转换器实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 页面录入的字符串:2019/12/05可以映射到实体的日期属性上,但是如果是录入2019-12-05就会报错400 bad request,想要以2019-12-05日期格式的方式映射到实体的日期属性上,需要自定义类型转换器,主要步骤如下: 1. 自定义类实现Convertro<S,T>接口 2.Springmvc.xml中配置Conv

  • Springmvc自定义类型转换器实现步骤

    一.什么是springmvc类型转换器? 在我们的ssm框架中,前端传递过来的参数都是字符串,在controller层接收参数的时候springmvc能够帮我们将大部分字符串类型的参数自动转换为我们指定的参数,这就是springmvc为我们提供的类型转换器.但是springmvc提供的类型转换器只能够转换指定格式的参数,例如:我们参数中传递time=2020/08/18,在controller中我们就可以通过Date类型的参数接收它,springmvc能够自动将该日期字符串转换为日期对象.但是如

  • MyBatis自定义类型转换器实现加解密

    需求场景:当数据库中保存的部分数据需要加密,页面需要正常显示时.这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自定义类型转换器将CHAR或者VARCHAR2进行加解密处理,Java代码如下: /**自定义typeHandler<br/> * 1 插入数据库, 加密 * 2 查询,解密 * @author Administrator * */ public class CryptTypeHandler implements TypeHandler<CryptTy

  • Mybatis实现自定义类型转换器TypeHandler的方法

    先给大家简单介绍下mybatis MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 此文其实是java操作Oracle类型XMLType总结二:使用Mybatis附带的一篇小结. Mybatis实现自定义的转换器,

  • pytorch学习教程之自定义数据集

    自定义数据集 在训练深度学习模型之前,样本集的制作非常重要.在pytorch中,提供了一些接口和类,方便我们定义自己的数据集合,下面完整的试验自定义样本集的整个流程. 开发环境 Ubuntu 18.04 pytorch 1.0 pycharm 实验目的 掌握pytorch中数据集相关的API接口和类 熟悉数据集制作的整个流程 实验过程 1.收集图像样本 以简单的猫狗二分类为例,可以在网上下载一些猫狗图片.创建以下目录: data-------------根目录 data/test-------测

  • Java中的BaseTypeHandler自定义类型转换器的使用

    目录 简述 通用的类型转换器(存在一些问题) 定制类型转换器 简述 mysq5.7之后新增了json类型,但是在使用的过程中,Json数组中的值小于Integer.MAX_VALUE,则反序列化时会转成List类型,假设我们用的是List类型的话就会碰到类型转换错误的异常. 通用的类型转换器(存在一些问题) 此方法可以返回对象的calss,自动转成对应的类型,但是在碰到List 类型的时候,由于calss只能获取到java.util.List类型无法获取List里对象的类型,就会导致会使用fas

随机推荐