struts2自定义类型转换_weixin_33777877的博客-程序员秘密

技术标签: java  

struts2 类型转换很智能,他会帮我们自动转换类型,struts会自动转换4类8种原生数据类型和String ,Date,当我们自己定义的类型就不会转换了,需要我们自己去编写类型转换器。

原理:类型转换有两个类,DefaultTypeConverter和Struts2TypeConverter,Struts2TypeConverter继承DefaultTypeConveter,DefaultTypeConverter里面就一个方法convertValue。

package com.shengsiyuan.converter;

import java.util.Map;

import java.util.StringTokenizer;

import ognl.DefaultTypeConverter;

import com.shengsiyuan.bean.User;

public class UserConverter extends DefaultTypeConverter

{

 @Override

 public Object convertValue(Map context, Object value, Class toType)

 {

  if(User.class == toType)  //从前台页面String转到后台对象

  {

   String[] str = (String[])value;

   String firstValue = str[0];   

   StringTokenizer st = new StringTokenizer(firstValue, ";");   

   String username = st.nextToken();

   String password = st.nextToken();   

   User user = new User();   

   user.setUsername(username);

   user.setPassword(password);   

   return user;  

  }

  else if(String.class == toType) //从后台对象转换到前台页面string

  {

   User user = (User)value;   

   String username = user.getUsername();

   String password = user.getPassword();   

   String userInfo = "username: " + username + ", password: " + password;   

   return userInfo;

  }  

  return null;

 }

}


我们在这个方法里面进行了一个if elseif的判断,到底是从页面还是转到页面而Struts2TypeConverter,还提供了另外两个方法。

package com.shengsiyuan.converter;

import java.util.Map;

import java.util.StringTokenizer;

import org.apache.struts2.util.StrutsTypeConverter;

import com.shengsiyuan.bean.User;

public class UserConverter2 extends StrutsTypeConverter

{

 @Override

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

 {

  User user = new User();  

  String value = values[0];  

  StringTokenizer st = new StringTokenizer(value, ";");  

  user.setUsername(st.nextToken());

  user.setPassword(st.nextToken());  

  return user;

 }

 @Override

 public String convertToString(Map context, Object o)

 {

  User user = (User)o;  

  String username = user.getUsername();

  String password = user.getPassword();  

  String userInfo = "username: " + username + ", password: " + password;  

  return userInfo;

 }

}

这里面的两个方法就相当于实现了那个if elseif功能了,只不过是将他们写到两个方法里面了。

我们定义了类型转换的类之后,还必须写一个配置文件,这个配置文件就是用来指定那个变量来使用我们所定义的类来进行转换,对于所有的类型转换的属性文件都是一样的,名字的后面部分都是-conversion.properties , 前面是action名字,这就代表的是Action里面需要类型转换的变量的名字。

局部或者全局:局部是需要在UserAction-convision.properties中定义UserAction中的属性名字,放在那个Action的目录下,而全局是需要在xwork-conversion.properties中指定好。
这个需要转换的类的名字,如下:com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2,放在src目录下。最后会编译到classes目录下面。

类型转换器怎么知道转换那个类型呢?比如action中有个属性是User类型的,那么有属性是User类型的,那么这个属性就会被自定义转换器转换了。

转载于:https://my.oschina.net/cjun/blog/521539

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33777877/article/details/91584183

智能推荐

Spring Cloud 实战(一)-点餐系统_JAY-CHOW的博客-程序员秘密

Spring Cloud 实战-点餐系统前言Spring Boot 环境搭建开始搭建1. 创建项目2. 基础依赖3. 补充依赖4. pom 文件概览项目概览前言学习 Spring Cloud 也很久了,今天开始准备拿点餐系统来练练手。虽然网上也有很多例子,但是,鞋到底合不合适,只有自己穿上了才知道。所以实践出真知。JUST DO IT!(嗯,咱挺适合搞 IT 的<->)Spri...

BlockDrop: Dynamic Inference Paths in Residual Networks论文阅读笔记_正则化的博客-程序员秘密

BlockDrop笔记:https://github.com/zhongzhh8/PaperReading/blob/master/BlockDrop.mdBlockDrop实验代码部分笔记:https://github.com/zhongzhh8/PaperReading/blob/master/BlockDrop_exp.md

软件测试面试官都问些啥?(内附答案)_软件测试面试官要点_程序员Baby~的博客-程序员秘密

转眼2021年招聘季已将到来,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer?如果你的跳槽意向已经很确定,那么请往下看!跳槽最重要的一步自然是面试,马上跳槽季,网上出现了各种面试题,一时会让人眼花缭乱,分不清最该看哪个,所以小编整理出以下资料仅供大家参考。计算机及语言基础javac#c++pythonshellLinux操作系统,SQL语句也是必须的测试基础知识01、什么是bug?答:软件的bug指的是软件当中不符

【链表】C++链表反转、链表逆序打印_c++运用栈实现链表的逆序_kc专栏的博客-程序员秘密

转载地址:http://blog.csdn.net/yebanxin/article/details/51942598题目:C++实现链表逆序打印、链表反转如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。方法1:只逆序打印,不改变结构。采用递归,到达尾结点时打印输出,否则进入下一个结点的递归,当递归一层

python画热力图_python 热力图_旺旺棒棒冰的博客-程序员秘密

python中可使用seaborn.heatmap画热力图,官方文档在这在分类任务中,也可用于画混淆矩阵:import numpy as npimport seaborn as snsimport pandas as pdimport matplotlib.pyplot as pltdef confusion_matrix(y_true, y_pred, labels=None): n = len(labels) labels_dict = {label: i for i,

深度学习与语音识别—常用声学模型简介_独家记忆_雪1314的博客-程序员秘密

2006年,Hinton提出深度学习网络,指出深度神经网络因为层数过多导致训练参数多的问题可以利用逐层初始化解决。在工业界和学术界掀起了深度学习的浪潮,并在语音识别和图像处理领域取得了巨大成功。2011年微软和谷歌在语音识别上采用DNN模型,将词错误率降低20%-30%。这里的DNN主要采用的是DBN,即深度置信网络。随着语音识别以及深度学习的发展,研究人员发现将CNN和RNN模型应用于语音识别领

随便推点

C实战:强大的程序调试工具GDB_c gdb 插件_cdai的博客-程序员秘密

C实战:强大的程序调试工具GDB1.基本调试这里只列举最最常用的GDB命令。1.1 启动GDBgdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。1.2 添加断点b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。1.3 运行程序run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常

spark输出rdd数据_使用Spark RDD进行快速数据处理_雯雯呀的博客-程序员秘密

Hadoop MapReduce很好地满足了用户的批处理需求,但由于渴望开发更灵活的大数据工具来进行实时处理,催生了大数据宝贝Apache Spark。Spark通过其强大的功能和快速的数据处理速度使大数据世界着火了。根据Typesafe的一项调查,有71%的人具有Spark的研究经验,而35%的人正在使用它。该调查显示高增长对Apache Spark的认识和在企业中的采用。在迭代机器学习算法和交...

C++语言size_t&wchar_t_yanxu_1116的博客-程序员秘密

size_t 在 C 语言中就有了。它是一种 整型 类型,里面保存的是一个整数,就像 int, long 那样。这种整数用来记录一个大小(size)。size_t 的全称应该是 size type,就是说 一种用来记录大小的数据类型。通常我们用 sizeof(XXX) 操作,这个操作所得到的结果就是 size_t 类型。因为 size_t 类型的数据其实是保存了一个整数,所以它也可以做...

【剑桥摄影协会】sRGB VS. Adobe RGB 1998_adobe rgb(1998)和srgb iec61966-2.1_温其如玉的博客-程序员秘密

sRGB IEC61966-2.1(sRGB)和Adobe RGB 1998是数码摄影中最常用的两个工作空间。本文旨在消除与sRGB和Adobe RGB 1998相关的一些概念混淆,并为其提供使用指导。

float怎么用在python中_python中float的用法_泓坊河畔的博客-程序员秘密

python中float的比较方式print float(lastpayment)-temp,'and',float(self.pyament) if (float(l浮点数不精确,如果想要使用精确小数,请用decimal 如果要比较浮点数a和b -0.00000001 < a - b < 0.00000001这样比较在python中 float当中包含int吗?int() float...

Android - gravity和layout_gravity区别_SpikeKing的博客-程序员秘密

gravity和layout_gravity区别本文地址:http://blog.csdn.net/caroline_wendy在Android的控件属性中:gravity是控件的内容如何定位在控件内;layout_gravity是控件如何在它的父布局中的定位。例如:EditText控件,gravity属性决定,输入内容的位置:如center,表示输入内容居中;layout_gravity表示Ed

推荐文章

热门文章

相关标签