1. ActionSupport介绍
我们自定义一个Action的时候,通常需要继承ActionSupport,因为ActionSupport实现了一系列的接口,也就是说通过继承它,我们可以很方便的实现一些功能,例如:国际化、数据校验
2. DefaultTypeConverter介绍
我们自定义开发的类型转换器需要直接或间接继承它,才能够被struts2框架调用
3. StrutsTypeConverter介绍
struts2自带的类型转换器的父类,继承了DefaultTypeConverter,也就是说对DefaultTypeConverter进行了优化,通过继承它更方便开发者开发自己的类型转换器
4. 自定义局部转换器实现步骤
首先要说明StrutsTypeConverter底层使用的就是DefaultTypeConverter,所以我们自定义的类型转换器不管是继承谁,其实现机理是不变的
新建一个package,并在该包下新建一个类,该类要继承DefaultTypeConverter
覆盖convertValue(Map<String, Object> context, Object value, Class toType)方法
编写convertValue方法中的核心逻辑
在需要进行类型转换的Action所在的包下新建一个properties文件,该文件的命名要遵循如下规则:
ActionName-conversion.properties
- 在ActionName-conversion.properties文件中输入key/value,该key是Action中需要进行类型转换的属性名(准确的说是该属性所对应的方法名的后缀,即setXXX中的xxx)而value为之前新建的类型转换器的全限定名
这样当struts2处理http请求的时候,当发现有符合条件的自定义类型转换器的时候,就会使用该转换器进行类型转换,并将转换后的结果,注入到Action对应的属性中,同理当需要将该Action的属性输出到页面上的时候,也会经过我们自定义的类型转换器,从而将java对象以字符串的形式输出到页面上
5. 自定义全局转换器步骤
新建一个package,并在该包下新建一个类,该类要继承DefaultTypeConverter
覆盖convertValue(Map<String, Object> context, Object value, Class toType)方法
编写convertValue方法中的核心逻辑
在src目录下新建一个properties文件,该文件的命名格式如下:
xwork-conversion.propreties
- 在该属性文件中键入key/value,kay的值为需要进行类型转换的属性的类型,value的值还是自定义类型转换器的全限定名
6. 类型转换器生效优先级
局部类型转换器优先级高于全局类型转换器,换言之,当都符合条件的情况下,局部类型转换器会生效而全局类型转换器不会生效
7. 实战练习
7.1. 练习一
现有一个前端页面代码如下所示:
当我在user文本框中输入"hello;world"并点击提交的时候,要求能够自动注入到UserAction中的User类型的user属性中,并且将该值输出在output.jsp中
实现步骤:
- 首先新建一个package命名为com.shengsiyuan.action
- 在该包下新建一个类命名为UserAction并继承ActionSupport类
- UserAction类中包含属性-user:User 并生成setter/getter方法
- 在该类下覆盖+ execute():String 方法,并返回SUCCESS
- 新建一个package命名为com.shengsiyuan.model,并在该包下新建一个类命名为User,该类包含两个属性-username:String -password:String 并生成setter/getter方法
- 新建一个package命名为com.shengsiyuan.converter,并在该包下新建一个类UserActionUserConverter,该类继承DefaultTypeConverter,并覆盖及实现方法convertValue,具体代码如下:
- 在 com.shengsiyuan.action包下新建属性文件UserAction-conversion.properties,该属性文件中的内容为user=com.shengsiyuan.converter.UserActionUserConverter
- 新建output.jsp文件,该jsp文件使用struts标签库,并将UserAction中的user进行输出,具体实现如下图所示:
测试:
首先访问login_1.jsp:
点击提交后:
测试结果:成功
小结:自定义转换器的实现主要由Action、Model、自定义转换器、属性文件构成
7.2. 练习二
现有如下页面:
要求:该表单提交后,四个文本框的值能够自动注入到UserAction对象的属性- userList:List<User>中,然后跳转到output.jsp中并输出这四个文本框的值
实现步骤:
实现步骤与练习一相似,提几个注意点:
- UserAction中的属性应该定义为List<User>类型,如下图所示:
- 自定义转换器中要进行代码调整,这里使用StrutsTypeConverter,为了演示不同的形式罢了,如下图所示:
8. 总结
自定义类型转换器还是比较麻烦的一件事情,在使用spring框架的时候就没有这种问题,看来spring框架对此进行了封装或改良,但我想类型转换这一块底层的实现应该差不多吧,系统学习spring的时候再看吧
9. 内容引用来源
<< 张龙JavaEE视频>>