所有的MVC框架,都属于表现层的解决方案,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件。

这时问题出现了,所有的请求参数都是字符串类型数据,因此MVC框架必须具备将这些字符串请求参数转换成相应的数据类型。

struts2提供了非常强大的类型转换机制,struts2的类型转换是基于OGNL表达式。

struts2提供了很好的扩展性,开发者可以开发出自己的类型转换器。完成字符串到自定义类型之间的转换。

如果类型转换中出现未知异常,开发者无须关心异常处理,struts2的conversionError拦截器会自动处理该异常,并且在页面上生成提示信息。

servlet中的类型转换

表单中提交的所有数据都是字符串类型

例如我们有一个User类,name为String类型,age为int类型,birthday为Date类型,我们必须在servlet中获取表单传入的参数,然后将其进行类型转换,然后封装到User对象中。

上述需要程序员自己进行类型转换操作,比较繁琐。

对于一个MVC框架而言,一样需要将请求参数封装成对象,也必须将请求参数转换成对象属性的数据类型,这就是类型转换的意义。

Struts2内建的类型转换器

struts内建的类型转换器能自动将我们的表单数据(字符串)转换成对应的数据类型。

完成字符串和日期类型之间的转换时,日期格式必须使用请求用户本地的格式。一般是yyyy-MM-dd,如果输入的日期格式不是本地的日期格式,例如我们输入1996/01/31,就会出现错误,类型转换失败。

自定义类型转换器

需求:

当我们在表单中输入的日期格式不是本地的格式时,就会出现类型转换错误,我们也经常需要将字符串转换成其他的格式,例如字符串转换成对象之类的操作,这时我们就需要自定义类型转换器。 struts2的类型转换器实际上是基于OGNL实现的。xwork集成了OGNL。 实现类型转换器必须实现TypeConverter接口。这个接口的方法太过复杂,所以还提供了一个该接口的实现类DefaultTypeConverter。 我们重写DefaultTypeConverter类的convertValue方法即可。 我们基于DefaultTypeConverter类实现类型转换器时,将字符串转换成我们需要的类型通过convertValue方法实现,将我们的类型转换成字符串也是通过convertValue方法实现,因此我们必须判断转换的类型来实现不同的逻辑。 为了简化类型转换器的实现,struts2提供了一个StrutsTypeConverter抽象类,这个类是DefaultTypeConverter类的子类。我们看下这个类的源码 :

  

 继承DefaultTypeConverter
public abstract class StrutsTypeConverter extends DefaultTypeConverter { //重写DefaultTypeConverter类的convertValue方法public Object convertValue(Map context, Object o, Class toClass) { //如果要转换的类型是字符串类型,也就是把我们的类型转换成字符串,调用convertToString方法if (toClass.equals(String.class)) {return convertToString(context, o);}//如果参数是字符串数组,也就是将字符串转换成我们需要的类型,调用convertFromString方法        else if (o instanceof String[]) {return convertFromString(context, (String[]) o, toClass);} //如果参数是字符串,也就是将字符串转换成我们需要的类型,调用convertFromString方法else if (o instanceof String) {return convertFromString(context, new String[]{(String) o}, toClass);} else {return performFallbackConversion(context, o, toClass);}}protected Object performFallbackConversion(Map context, Object o, Class toClass) {return super.convertValue(context, o, toClass);}//将字符串转换成我们需要的类型的方法public abstract Object convertFromString(Map context, String[] values, Class toClass);//将我们的类型转换成字符串的方法public abstract String convertToString(Map context, Object o);} 三个参数 :Map context:OGNL的上下文。暂时还没学,后面会学到,暂时不用管。value:需要转换的参数。toClass:转换后的类型

例子:

需求:我们将我们前面的注册案例中的生日改成 yyyy/MM/dd类型

(1)创建自定义类型转换器

 public class MyConverter extends StrutsTypeConverter { //日期转换器,转换成指定的类型private DateFormat format=new SimpleDateFormat("yyyy/MM/dd");//将字符串转换成日期类型public Object convertFromString(Map context, String[] values, Class toClass) { //判断参数是否为空if(values==null||values.length==0){return null;} //我们只有一个参数,就是表单的birthdayString date=values[0]; //判断目标类型是否是Dateif(toClass==java.util.Date.class){try { //进行转换return format.parse(date);} catch (ParseException e) {e.printStackTrace();}}return null;    }//将日期类型转换成字符串public String convertToString(Map context, Object o) { //判断当前参数是否是日期类型if(o instanceof java.util.Date){return format.format(o);}return null;}}

(2)注册类型转换器

局部类型转换器按照属性来注册如果属性都在action中,那么应该创建一个文件 Action名字-conversion.properties ,例如LoginAction-conversion.properties 如果属性放到了javaBean中,那么创建一个文件 javaBean名称-conversion.properties 例如  User-conversion.properties文件由键值对组成。键为需要转换的属性名字,值为自己实现的类型转换器全类名。我们创建 User-conversion.properties 内容 birthday=com.cad.web.convert.MyConverter 这时我们注册时使用 1996/01/24这种格式进行注册就不会出现类型转换错误。用户提交请求时,请求中的birthday参数会先被该类型转换器处理。全局类型转换器所有的Action都能用。我们需要在src目录下创建一个 xwork-conversion.properties 的文件因为是全局的,就不存在只对birthday这个属性进行转换。这里的键是要转换的类型,值还是类型转换器类。我们创建 xwork-conversion.properties 内容 java.util.Date=com.cad.web.convert.MyConverter 这样当我们输入日期的表单时,就可以使用我们自定义的日期格式。

  

类型转换中的错误处理

struts2提供了一个名为conversionError的拦截器,这个拦截器被注册在默认拦截器栈中。

当类型转换器执行类型转换出现错误时,该拦截器负责将对应错误封装成表单域错误(fieldError),并将错误信息放入ActionContext中。

当拦截器对转换异常进行处理后,系统会跳转到名为input的逻辑视图。

 我们在struts.xml中配置 <result name="input">/regist.jsp</result> 当类型转换失败后,再跳转到注册页面跳转到input视图以后,我们发现没有任何错误提示信息。我们前面讲过conversionError拦截器会将转换错误封装成fieldError,并放在ActionContext中。为了在页面中输出错误信息,我们需要使用struts的标签。我们先使用一些,后面会详细介绍。我们在页面添加<s:fielderror></s:fielderror>标签当我们类型转换失败后,就会输出错误信息。我们发现输出的错误信息是英文的,我们希望能变为中文的提示信息。我们只需要在创建一个properties文件  文件名为  javabean名称.properties  键为invalid.fieldvalue.属性名称  例如 :invalid.fieldvalue.birthday 值为要输出的内容 例如 invalid.fieldvalue.birthday=生日格式不正确

  

 

转载于:https://www.cnblogs.com/yuexiaoyun/p/9448873.html

(十二)struts2的类型转换相关推荐

  1. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  2. 第十二题:设int x=1,float y=2,则表达式x/y的值是:

    第十二题 设int x=1,float y=2,则表达式x/y的值是:() A 0 B 1 C 2 D 以上都不是 懵逼树上懵逼果,懵逼树下你和我 首先看到这道题,我是懵逼和绝望的. 首先我们打开评论 ...

  3. 第十二章_网络搭建及训练

    文章目录 第十二章 网络搭建及训练 CNN训练注意事项 第十二章 TensorFlow.pytorch和caffe介绍 12.1 TensorFlow 12.1.1 TensorFlow是什么? 12 ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. 感谢十二年的陪伴——分享回归,不忘初心(Eastmount博客总结及未来规划)

    曾记否,2021年4月28日,为了更好地从事科研和学习,当时给所有读者群发了我在CSDN唯一的私信,感谢大家十年的陪伴,短暂消失,不负青春.当时也收到了很多博友的鼓励与祝福,感恩. 是啊!很难想象读博 ...

  6. 渗透测试-地基篇-美杜莎Medusa(十二)

    ** 渗透测试-地基篇-美杜莎Medusa(十二) ** 作者:大余 时间:2020-11-27 简介: 渗透测试-地基篇: 该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多 ...

  7. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  8. 左耳听风 第二十二周

    左耳听风 第二十二周 每周完成一个ARTS: 每周至少做一个 leetcode 的算法题.阅读并点评至少一篇英文技术文章.学习至少一个技术技巧.分享一篇有观点和思考的技术文章.(也就是 Algorit ...

  9. 第二十二章 SQL函数 CAST(一)

    文章目录 第二十二章 SQL函数 CAST(一) 大纲 参数 描述 转换数字 字符串类型转换 转换为DATE.TIME和TIMESTAMP 转换NULL和空字符串 转换日期 第二十二章 SQL函数 C ...

最新文章

  1. 在QT的LineEdit框中输入特定字符(正则表达式的使用)
  2. java 0000 0001 0002 000a 000b_Java代码编译后的class文件
  3. 字符串处理分割字符串
  4. oracle不属于集合操作,oracle 笔试题
  5. 只读变量(常量)和位置变量
  6. 查看修改MySQL字符集
  7. Ubuntu瘦身与扩容运动
  8. puppeteer api_使用Node.js和Puppeteer API生成PDF文件
  9. Go语言实战 : API服务器 (4) 配置文件读取及连接数据库
  10. excel打开空白_啥?下载的文件显示“文件已损坏,无法打开”?
  11. 即时通讯飞鸽传书民意soft需求
  12. Objective-C 2.0 with Cocoa Foundation--- 6,NSObject的奥秘
  13. python绝对值函数fabs_Python fabs() 函数
  14. 最短路 spfa算法
  15. 通讯录 C语言分类,C语言 通讯录
  16. 论文发表费用一般是多少
  17. python 列表推导式 else_列表推导式与表达式生成器在 Python 中的滥用!
  18. 51cto学院mysql_Mysql -1_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...
  19. VMware虚拟磁盘VMDK格式说明书1.1---3 The Descriptor File描述文件
  20. 免费打印 免费抓娃娃 多次关注微信公众号-吸粉神器 技术实现细节

热门文章

  1. Android app开发捷径,让你少去踩坑
  2. 故事营销:一个具有争议的成功营销案例
  3. BeanShell 跟jdk js引擎使用记录
  4. 给力开源,.Net开源地址大收集
  5. 新闻媒体的“社会热点事件”催发微博客的诞生
  6. LFCS 系列第二讲:如何安装和使用纯文本编辑器 vi/vim
  7. Web开发者需养成的好习惯
  8. android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
  9. HDU 1180 诡异的楼梯
  10. CYQ.Data V4系列全面开源(2013-08-04)