博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2框架之类型转换(参考第二天学习笔记)
阅读量:5292 次
发布时间:2019-06-14

本文共 2267 字,大约阅读时间需要 7 分钟。

类型转换

1. 什么是类型转换

刚才学习了封装请求参数,把表单数据封装到Action(模型)的属性中。表单中的数据都是String类型,但Action(模型)的属性不一定什么类型。

将来我们还需要数据的回显,即把Action的属性值显示到表单中。把Actoin的属性显示在表单中。

类型转换是双向的

String[] --> Object,从表单到Action

Object --> String,从Action到表单

默认情况下,Struts会帮我们转换如下类型:

1. Date
2. 基本类型:int、float ....
3. String类型
4. 基本类型对应包装类型:Integer、Double....

<input type="checkbox" name="hobby" value="上网"/>
<input type="checkbox" name="hobby" value="看书"/>
<input type="checkbox" name="hobby" value="再上网"/>
<input type="checkbox" name="hobby" value="还是看书"/>
class MyAction {
private int age;
private Date birthday;
}

=====================

自定义类型转换

1. 目标

在表单给出如下数据:

张三,23,男

把这个字符串转换成Person,封装到Action的一个类型为Person的属性中。

2. 自定义类型转换

  当Struts自动类型转换失败时,它会使用最原始的类型完成封装,即使用String[]类型。
  例如要把字符串数组转换成Person类型时,自动类型转换会失败,这时Struts会去寻找setPerson(String[])方法。
  如果找不到这个方法,会抛出NoSuchMethodException异常,说明类型转换失败。

1). 编写类型转换器

2). 配置自定义的类型转换器类。

3. 编写类型转换器

1). 实现com.opensymphony.xwork2.conversion.TypeConverter(不方便)
2). 继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter(不方便)
3). 继承org.apache.struts2.util.StrutsTypeConverter(就用它)

SturtsTypeConverter

* Object convertFromString(Map context, String[] values, Class toClass):String --> Object,从表单到Action
* String convertToString(Map context, Object o):Object --> String, 从Action到表单

4. 配置自定义类型转换器

局部部署:当前转换器只对当前Action的指定属性有效

1) 配置文件的位置:Action同包下,即PersonAction同包下

2) 配置文件的名称:Action名称-conversion.properties,PersonAction-conversion.properties,
3) 配置文件的内容:要处理的属性名称=类型转换器的全名,即:person=cn.itcast.converter.PersonConverter

全局部署:对某一类型指定类型转换器,例如Person类型都使用同一类型转换器

1) 配置文件的位置:src下

2) 配置文件的名称:xwork-conversion.properties
3) 配置文件的内容:要处理的类型=类型转换器名称,即:cn.itcast.action.Person=cn.itcastion.converter.PersonConverter

5. 类型转换错误

HTTP Status 404 - No result defined for action cn.itcast.action.PersonAction and result input

说明:已经找到了类型转换器,但类型转换失败。这时struts要求跳转到input结果,但我们没有为当前Action配置input结果。

在input结果页面中给出<s:fielderror/>来显示错误信息。

但错误信息是英文的,这需要使用国际化。

国际化key:invalid.fieldvalue.当前字段名,即:invalid.fieldvalue.person

处理这一问题:
1. 在当前Action同包下创建资源文件,名称为:Action类名.properties

6. 原理

params:完成封装请求数据,它会做类型转换工作。
converterError:如果出现类型转换错误,会向当前Action中添加fielderror。
workflow:查看当前Action中是否存在fielderror或actionerror,只要存在错误,拦截请求,转发到input结果,不会在执行Action的请求处理方法。当然,如果没有错误,放行!

 

转载于:https://www.cnblogs.com/xyhero/p/9348757.html

你可能感兴趣的文章
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
6-1 并行程序模拟 uva210
查看>>
JavaScript动画打开半透明提示层
查看>>