struts2类型转换介绍

1. ActionSupport介绍

我们自定义一个Action的时候,通常需要继承ActionSupport,因为ActionSupport实现了一系列的接口,也就是说通过继承它,我们可以很方便的实现一些功能,例如:国际化、数据校验

2. DefaultTypeConverter介绍

我们自定义开发的类型转换器需要直接或间接继承它,才能够被struts2框架调用

3. StrutsTypeConverter介绍

struts2自带的类型转换器的父类,继承了DefaultTypeConverter,也就是说对DefaultTypeConverter进行了优化,通过继承它更方便开发者开发自己的类型转换器

4. 自定义局部转换器实现步骤

首先要说明StrutsTypeConverter底层使用的就是DefaultTypeConverter,所以我们自定义的类型转换器不管是继承谁,其实现机理是不变的

  1. 新建一个package,并在该包下新建一个类,该类要继承DefaultTypeConverter

  2. 覆盖convertValue(Map<String, Object> context, Object value, Class toType)方法

  3. 编写convertValue方法中的核心逻辑

  4. 在需要进行类型转换的Action所在的包下新建一个properties文件,该文件的命名要遵循如下规则:

ActionName-conversion.properties

  1. 在ActionName-conversion.properties文件中输入key/value,该key是Action中需要进行类型转换的属性名(准确的说是该属性所对应的方法名的后缀,即setXXX中的xxx)而value为之前新建的类型转换器的全限定名

这样当struts2处理http请求的时候,当发现有符合条件的自定义类型转换器的时候,就会使用该转换器进行类型转换,并将转换后的结果,注入到Action对应的属性中,同理当需要将该Action的属性输出到页面上的时候,也会经过我们自定义的类型转换器,从而将java对象以字符串的形式输出到页面上

5. 自定义全局转换器步骤

  1. 新建一个package,并在该包下新建一个类,该类要继承DefaultTypeConverter

  2. 覆盖convertValue(Map<String, Object> context, Object value, Class toType)方法

  3. 编写convertValue方法中的核心逻辑

  4. 在src目录下新建一个properties文件,该文件的命名格式如下:

xwork-conversion.propreties

  1. 在该属性文件中键入key/value,kay的值为需要进行类型转换的属性的类型,value的值还是自定义类型转换器的全限定名

6. 类型转换器生效优先级

局部类型转换器优先级高于全局类型转换器,换言之,当都符合条件的情况下,局部类型转换器会生效而全局类型转换器不会生效

7. 实战练习

7.1. 练习一

现有一个前端页面代码如下所示:

前台页面.png

当我在user文本框中输入"hello;world"并点击提交的时候,要求能够自动注入到UserAction中的User类型的user属性中,并且将该值输出在output.jsp中

实现步骤:

  1. 首先新建一个package命名为com.shengsiyuan.action
  2. 在该包下新建一个类命名为UserAction并继承ActionSupport类
  3. UserAction类中包含属性-user:User 并生成setter/getter方法
  4. 在该类下覆盖+ execute():String 方法,并返回SUCCESS
  5. 新建一个package命名为com.shengsiyuan.model,并在该包下新建一个类命名为User,该类包含两个属性-username:String -password:String 并生成setter/getter方法
  6. 新建一个package命名为com.shengsiyuan.converter,并在该包下新建一个类UserActionUserConverter,该类继承DefaultTypeConverter,并覆盖及实现方法convertValue,具体代码如下:
自定义转换器.png
  1. 在 com.shengsiyuan.action包下新建属性文件UserAction-conversion.properties,该属性文件中的内容为user=com.shengsiyuan.converter.UserActionUserConverter
  2. 新建output.jsp文件,该jsp文件使用struts标签库,并将UserAction中的user进行输出,具体实现如下图所示:
output.jsp.png

测试:

首先访问login_1.jsp:

login_1.jsp.png

点击提交后:

result.png

测试结果:成功

小结:自定义转换器的实现主要由Action、Model、自定义转换器、属性文件构成

7.2. 练习二

现有如下页面:

前台页面.png

要求:该表单提交后,四个文本框的值能够自动注入到UserAction对象的属性- userList:List<User>中,然后跳转到output.jsp中并输出这四个文本框的值

实现步骤:

实现步骤与练习一相似,提几个注意点:

  1. UserAction中的属性应该定义为List<User>类型,如下图所示:
UserAction.png
  1. 自定义转换器中要进行代码调整,这里使用StrutsTypeConverter,为了演示不同的形式罢了,如下图所示:
自定义转换器代码.png

8. 总结

自定义类型转换器还是比较麻烦的一件事情,在使用spring框架的时候就没有这种问题,看来spring框架对此进行了封装或改良,但我想类型转换这一块底层的实现应该差不多吧,系统学习spring的时候再看吧

9. 内容引用来源

<< 张龙JavaEE视频>>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,288评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,805评论 18 399
  • 标签 如果要配置的标签,那么必须要先配置标签,代表的包的概念。 包含的属性 name包的名称,要求是唯一的,管理a...
    偷偷得路过阅读 5,312评论 0 0
  • 阿太是《皮囊》中的第一个故事。 阿太是作者外婆的妈妈,是作者心中的“定海神针”,有她在,作者就觉得心中安稳。 作者...
    想跳舞的鱼阅读 9,691评论 0 2
  • 上面两篇介绍了库的接口及封装,还有个问题就是数据的处理。 问题一:怎么处理通过回调【-(void) onSocke...
    小儿小二阅读 4,599评论 0 3

友情链接更多精彩内容