类型转换---struts2学习笔记

类型转换的流程 

 1、用户进行请求,根据请求名在struts.xml中寻找Action

 2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的 action文件名-conversion.properties 文件。

 3、从文件中找到要转换的属性及其转换类。

 4、然后进入转换类中,在此类中判断转换的方向。我们是先从用户请求开始的,所以这时先进入从字符串到类的转换。返回转换后的对象。流程返回Action。

 5、将返回的对象赋值给Action中的属性,执行Action中的execute()

 6、执行完execute()方法,根据struts.xml的配置转向页面

 7、在jsp中显示内容时,根据页面中的属性名去调用相应的get方法,以便输出

 8、在调用get方法之前,会检查有没有此属性的自定义类型转换。如果有,再次跳转到转换类当中。

 9、在转换类中再次判断转换方向,进入由类到字符串的转换,完成转换后返回字符串。

 10、将返回的值直接带出到要展示的页面当中去展示。 


1.内建的类型转换

对于大部分的常用类型,开发者无须理会类型转换,Struts 2可以完成大多数常用的类型转换。这些常用的类型转换是通过Struts 2内建的类型转换器完成的,Struts 2已经内建了字符串类型和如下类型之间相互转换的转换器。

    1. boolean和Boolean:完成字符串和布尔值之间的转换。
    2. char和Character:完成字符串和字符之间的转换。
    3. int和Integer:完成字符串和整型值之间的转换。
    4. long和Long:完成字符串和长整型值之间的转换。
    5. float和Float:完成字符串和单精度浮点值之间的转换。
    6. double和Double:完成字符串和双精度浮点值之间的转换。
    7. Date:完成字符串和日期类型之间的转换,日期格式使用用户请求所在Locale的SHORT格式。
    8. 数组:在默认情况下,数组元素是字符串,如果用户提供了自定义类型转换器,也可以是其他复合类型的数组。
    9. 集合:在默认情况下,假定集合元素类型为String,并创建一个新的ArrayList封装所有的字符串。

对于数组的类型转换将按照数组元素的类型来单独转换每一个元素,但如果数组元素的类型转换本身无法完成,系统将出现类型转换错误。
因为Struts 2 提供了上面这些类型转换器,如果需要把HTTP请求参数转换成上面这些类型,则无须开发者进行任何特殊的处理。因此大部分实际开发中,开发人员无须自己进行类型转换。


2.基于OGNL的类型转换

1.       原始类型

<input name=”user.username” />

<input name=”user.age” />

<input name=”user.birthday” />

类里 :

private String username;

private Double age;

private Date birthday

框架会自动帮我们转换 . 我们能成功获得到 .

2.       数组 ;

<input name=”ages” />

<input name=”ages” />

<input name=”ages” />

上面这些指向 ages 属性 :Double[] ages

<input name=”names[0]” />

<input name=”names[1]” />

<input name=”names[2]” />

上面指向 :String[] names

但要注意的是 : 当我们提交上面的整个表单时 ,HTTP 请求如下 :

ages=12,33,55

names[0]=jack

names[1]=green

names[2]=mary

可以看出差别了 .

当框架转移 ages 参数时 , 它先找到 ages 属性 , 并且知道 ages 参数是一个有 3 个字符串的数组 . 由于动作上的 ages 属性也是一个数组 , 这样 OGNL 创建一个新的数组 , 值是参数的值 , 并将它赋给动作 . 并且它知道动作的属性 ages 是 double 类型的 . 它会自动将参数的值转换成对应的类型 .

3.       List

用法和数组一模一样 . 只不过 JAVA 中是 List 但注意 , 这里最好是用泛型来声明 . 不然它会自动将参数转换成String 类型并存入 List. 泛型用法 :

<input name=”names[0].username” />

<input name=”names[1].username” />

接收 :List<User> names

第一个 User 的 username 为第一个 input 提交的值 

4.       Map

和 list 不同 ,Map 需要一个键 , 一个值 . 如 :

<input name=”nameMap.mary” />

<input name=”nameMap.hellen” />

<input name=”nameMap[‘Sunyu’]” />

上面一种用点语法 , 一种用方括号 . 但两种意思一样 , 当我们提交上面表单后 , 后台获得的值如下 :

Map<String,String> nameMap; 值为 :

mary --- > 第一 input 提交的值 .

hello --- > 第二 input 提交的值 .

…..

3.指定集合元素的类型

为了让struts2俩节集合元素的类型,有两种方式

1.为集合属性指定泛型(List<User> users)

2.在Action的局部类型转换文件中指定集合元素的类型(ActionName-conversion.properties文件{  

Element_users = org.app.domain.User //List<User> users;  

Key_users = java,lang.String

Element_user = java.lang.String //Map<String , String> users})

4.自定义类型转换

1.继承DefaultTypeConverter,并重写public Object convertValue(ActionContext context,Object value,Class toType);

这个函数的功能是完成双向转换,即从String数组转到Action属性及Action属性转到String;需要注意的是从String数组转到Action属性,而不是String转到Action属性;如果只有一个字符串,则取params[0] 即可;

2.继承StrutsTypeConverter
 
StrutsTypeConverter是DefaultTypeConverter的子类,DefaultTypeConverter的类型转换器是在一个函数中进行双向转换,而继承StrutsTypeConverter的类型转换器则是将两个方向分别用两个函数实现:
 
 @Override
public Object convertFromString(Map context, String[] values, Class toClass) {}
 
@Override
public String convertToString(Map context, Object o) {}

5.注册类型转换器

完成自定义类型转换器编写后,如果需要使用此转换器,就需要配置,通常有两种配置方法:

1.局部类型转换文件中配置,仅对特定的Action的特定属性有效,比如在Action1中有aa属性,则仅对Action1的aa属性有效;

2.全局类型转换文件中配置,对某个类型都有效;比如对Person注册了类型转换器,则对任何Person和String的转换都有效;

 

全局类型转换文件命名为:xwork-conversion.properties,通常放在WEB-INF\classes下;

文件内容如:attributeName=ConvertClass ,比如aa=org.convert.Converter1

attributeName表示属性名称,convertClass表示转换器的实现类;

局部类型转换文件命名为:ActionName-conversion.properties,放在特定Action的目录下;

文件内容如:typeName=ConvertClass,比如org.person.Person = org.convert.Converter2

 

注意:typeName表示转换类型,convertClass表示转换器的实现类;

6.类型转换中的错误处理

客户输入错误信息是很正常的事,因此需要对此种行为进行处理,Struts2提供了很好的错误处理机制,是由conversionError拦截器自动完成,我们只需要配置输出什么错误信息即可;

当发生类型转换错误时,conversionError拦截器拦截此错误,并封装成fieldError,将此错误信息放入ActionContext中,并返回input逻辑视图;当然在<action>元素中必须配一个类似于<result name="input">/1.jsp</result>的子元素,以应对类型转换错误;

而为了显示错误信息,则在jsp页面中使用<s:fielderror/>即可显示错误信息;

注意:

类型转换的Action在struts.xml中配置所在包需要extends="struts-default",因此在此文件中包含conversionError拦截器;

必须让Action继承Struts2的ActionSupport类,因为Struts2的ActionSupport负责收集类型转换错误,输入校验错误,并将它们封装成FieldError对象,添加到ActionContext对象中

 

这时我们需要配置显示的错误信息,错误信息配置方式有两种:

1.配置默认提示信息

在国际化资源文件中配置形如:

xwork.default.invalid.fieldvalue={0},错误;

{0}代表类型转换错误的属性名称;

 

2.配置Action特定属性错误信息

在Action范围的国际化资源文件中配置形如:

invalid.fieldvalue.attributeName= 内容

attributeName是Action中的属性名称;

例如:invalid.fieldvalue.p=person类型转换错误

意思是对p属性配置了特定的错误提示信息,当p属性类型转换错误后就会显示此信息;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值