struts2-解惑:struts2类型转换器

发布于 2016-10-25 19:40:06 字数 1725 浏览 1073 评论 1

前几天在网上看了有关struts的类型转换器,边看边做了一个demo,了解到类型转换器基本可以分为2类,一是局部一是全局。本人做了一个全局,虽然起到了作用,但还是不知他如何作用的,并且感觉没什么太大作用。当然,struts是个优秀的框架,既然有这个转换器,必定有他存在的道理,所以请高手解惑。。下图解释
图一:

请输入图片描述
这是一个测试的demo,xwork-concersion是全局转换器xml文件,用于转换user,有一个jsp页面,name属性为非叶子节点属性,也就是非user对象内部的属性,而是在action配置的一个全局的user对象的引用。

图二:

请输入图片描述
图三:

请输入图片描述
图三则是非叶子节点,页面提交会进入图一的action的一个login方法。

图四:

请输入图片描述
这是全局转换器xml文件

图五:

请输入图片描述
这是action里面的非叶子节点user对象引用user。
当在页面input里面写上name属性为user.name的时候,由于user对象里面name属性为string的,所以无论如何在页面怎么输入struts是不会错的,但是如果在页面的name属性上写上user.password的话,由于user对象的password属性是int类型,struts会自动对叶子节点的user下password进行类型转换,如果页面写a的话,此次转换将失败,所以就有了自定义类型转换器的存在,自定的类型转换器必须必须继承StrutsTypeConverter,并且实现2个方法convertFromString和convertToString,在进行转换的时候只需要在convertFromString这里处理,处理完成后则交给action,当类型转换失败的时候可是在自定义转换器内进行处理。不知道我说的这些对不对。。。。现在说说的我疑惑,首先我知道如果在页面是叶子节点,action必须要有这个叶子的对象,也就是user,并且要有set方法,user里相对的属性也需有对应的set和get方法,才可以完成封装,但是如果是非叶子节点,也就是对象,是如何进入到自定义转换器里的呢?第一。第二,自定义转换器是如何返回给action的,这里只有一个action,如果是多个的话,是不是就是因为action里只要有user对象就会进入呢?本人还觉得吧,一般我会用request来接收参数,得到的参数我会直接转换,我可以自己处理,然后有了转换器之后我觉得操作会越来越麻烦,是不是这样的呢?前面也说了,既然存在一定有道理,求解惑。。。。。不喜勿入。。。。。谢谢给予帮助的人们。。本人才疏学浅

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2017-06-25 11:12:42

首先,为什么要有转换器,是因为HTTP提交数据的时候,无论是post模式还是get模式,都是把用户的输入以字符串的方式加入到URL(GET模式)或者Request Body (POST)模式的。但是到了后台之后,你的对象属性不一定都是用String来表达的,所以需要一个转换的过程。

xwork-conversion.properties 通常用来定义数据类型的转换器。比如说你的网站对于Date类型是以yyyy-MM-dd格式回传和显示的,你的Double类型是保留2位精度的等等,此时直接使用xwork-conversion.properties是最方便的

如果你某个对象无法遵守你预先定义的全局转换规则,那么就需要为对象单独定义conversion。就是对象名字-conversion.properties文件,并且需要和你的对象位于同样的包中。

当struts组装请求传入数据或者显示响应数据时,他会查看对象是否有自己的conversion,如果没有,就找全局的conversion,然后调用对应的converter工作。

说一个具体的例子吧,我之前做过一个项目,Double类型的数据都是保留2位精度,所以我的通用类型的Converter是这样的:xwork-conversion.properties:

java.lang.Double=com.xx.common.CustomizedTypeConverter
java.math.BigDecimal=com.xx.common.CustomizedTypeConverter
java.math.BigInteger=com.xx.common.CustomizedTypeConverter

但是我某个对象的精度要求4位,所以,单独定义此对象的转换器

com.xx.pojo.XX,对应的转换器配置为:XX-conversion.properties,和XX对象位于同样的包中:
amount=com.xx.QuotaNumberConverter

或者,用你的话来说,叶子节点的属性是按照数据类型来超找转换器的,非叶子节点的数据是按照对象类型+属性来查找转换器的。至少,大家习惯上会这样设定

转换器的存在并不是为了完成传统模式无法完成的工作,而是为了更好的使用配置行为来实现控制,以便于需求变动的时候减少开发维护成本,快速完成任务。

一点拙见,仅供参考。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文