4.4.3 局部类型转换器

实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts 2框架才可以正常使用该类型转换器。

关于类型转换器的注册方式,主要有如下三种。

注册局部类型转换器:局部类型转换器仅仅对某个Action的属性起作用。

注册全局类型转换器:全局类型转换器对所有Action的特定类型的属性都会生效。

使用JDK 1.5的Annotation来注册类型转换器。

下面介绍的是局部类型转换器的注册,要注册类型转换器只需提供文件名为如下格式的文件即可。

ActionName-conversion.properties:ActionName是需要转换器生效的Action的类名,后面的-conversion.properties字符串则是固定部分。

对于上面的 LoginAction 类,应该提供的类型转换器注册文件的文件名为:LoginAction-conversion.properties,该文件是一个典型的Properties文件,文件由key-value对组成。文件内容为:

propertyName=类型转换器类

ActionName-conversion.properties文件由多个“propertyName=类型转换器类”项组成,其中“propertyName”是Action中需要类型转换器转换的属性名,“类型转换器类”是开发者实现的类型转换器的全限定类名(需要加包前缀)。

下面是LoginAction-conversion.properties文件的内容。

# 指定LoginAction的user属性需要使用org.crazyit.struts2.action.UserConverter类来完成类型转换
user=org.crazyit.struts2.action.UserConverter

LoginAction-conversion.properties 文件应该与 LoginAction.class 放在相同位置(因为LoginAction的包为org.crazyit.struts2.action,因此该文件应该放在Web应用的WEB-INF/classes/org/crazyit/struts2/action路径下)。

至此,局部类型转换器注册成功。当浏览者提交请求时,请求中的 user 请求参数将会先被该类型转换器处理。

如果在图4.5所示页面的用户信息输入框中输入“crazyit,leegang”字符串,根据类型转换器的作用,它会将crazyit解析成User实例的name属性,leegang将被作为User实例的pass属性。提交请求,将看到如图4.7所示的页面。

图4.7 局部类型转换器转换成功

局部类型转换器只对指定 Action 的特定属性起作用,这具有很大的局限性——我们花费了大量时间完成了一个类型转换器,却只能一次使用(对一个Action有效),这太浪费了。通常我们会将类型转换器注册成全局类型转换器,让该类型转换器对该类型的所有属性起作用。

提示:

局部类型转换器只对指定 Action 的指定属性生效,全局类型转换器对指定类型的全部属性起作用。