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视频>>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

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