一篇文章搞定Struts2的类型转换
什么是类型转换
在Struts2中,类型转换是指将字符串类型的参数转换为控制器方法中所需要的具体类型,比如将字符串"100"转换为整数类型 int 100。
在Struts2中,参数的类型转换是由类型转换器完成的。
Struts2中的类型转换器
Struts2中属性值的类型转换是由类型转换器完成的,类型转换器实现了TypeConverter接口,其中常用的类型转换器有以下几种:
- StringTypeConverter:将String类型参数转换为字符串。
- BooleanTypeConverter:将String类型参数转换为boolean类型。
- IntegerTypeConverter:将String类型参数转换为Integer类型。
- DateTypeConverter:将String类型参数转换为Date类型。
通常情况下,Struts2中会自动匹配相应的类型转换器进行类型转换,但是有些情况下,我们需要自定义类型转换器。
自定义类型转换器
Struts2的类型转换器是基于ognl表达式引擎的,因此自定义类型转换器只需实现org.apache.struts2.util.StrutsTypeConverter接口,并在struts.xml中进行配置即可。
下面是一个示例,将字符串中的小写字母转换为大写字母:
public class UpperTypeConvertor implements StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// 将字符串转换为大写字母
if (String.class == toClass) {
String str = values[0];
return str.toUpperCase();
}
return null;
}
@Override
public String convertToString(Map context, Object object) {
// 将对象转换为字符串
if (object instanceof String) {
return String.valueOf(object);
}
return null;
}
}
在struts.xml中配置自定义类型转换器
在struts.xml中,我们需要配置自定义类型转换器,以在Struts2应用程序中进行注册,示例如下:
<struts>
<bean type="com.test.UpperTypeConvertor" name="upper"/>
<constant name="struts.convention.action.fileProtocols" value="jar,vfsfile"/>
<constant name="struts.convention.action.disableScanning" value="true"/>
<package name="default" extends="struts-default">
<action name="user" class="com.test.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="upperInterceptor"/>
<allowed-methods>login</allowed-methods>
<conversion>
<converter converter="upper" type="java.lang.String"/>
</conversion>
</action>
</package>
</struts>
其中<bean type="com.test.UpperTypeConvertor" name="upper"/>
用于声明并注册自定义类型转换器,name
属性指定转换器名称。
<conversion>
元素用于在Struts2中指定类型转换器,<converter>
元素用于指定转换器名称及需要转换的类型。
示例一
下面是一个UserAction类,其中包含一个String类型的属性userName,我们需要将这个字符串属性转换为大写字母,具体代码如下:
public class UserAction extends ActionSupport {
private String userName;
// setter和getter方法省略
}
为了将字符串属性userName转换为大写字母,在struts.xml中需要进行如下配置:
<struts>
<bean type="com.test.UpperTypeConvertor" name="upper"/>
<constant name="struts.convention.action.fileProtocols" value="jar,vfsfile"/>
<constant name="struts.convention.action.disableScanning" value="true"/>
<package name="default" extends="struts-default">
<action name="user" class="com.test.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="upperInterceptor"/>
<allowed-methods>login</allowed-methods>
<conversion>
<converter converter="upper" type="java.lang.String"/>
</conversion>
<param name="userName">Tom</param>
</action>
</package>
</struts>
在这个配置中,我们通过<param>
元素将属性userName的初始值设为"Tom",然后通过自定义类型转换器UpperTypeConvertor将这个字符串转换为大写字母。
示例二
下面是另一个UserAction类,其中包含一个Calendar类型的属性birthday,我们需要将字符串类型的参数转换为Calendar类型,具体代码如下:
public class UserAction extends ActionSupport {
private Calendar birthday;
// setter和getter方法省略
}
为了将字符串类型的参数转换为Calendar类型,在struts.xml中需要进行如下配置:
<struts>
<constant name="struts.convention.action.disableScanning" value="true"/>
<constant name="struts.date.format" value="yyyy-MM-dd"/>
<package name="default" extends="struts-default">
<action name="user" class="com.test.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="defaultStack"/>
<allowed-methods>login</allowed-methods>
<conversion>
<converter class="org.apache.struts2.util.StrutsTypeConverter" type="java.util.Calendar"/>
</conversion>
<param name="birthday">2021-12-12</param>
</action>
</package>
</struts>
在这个配置中,我们使用默认的类型转换器StringToCalendarConverter,它会将字符串类型转换为Calendar类型,通过<param>
元素将属性birthday的初始值设为"2021-12-12"。此时,如果出现字符串格式不正确的情况,将会抛出类型转换异常。
以上就是一篇文章搞定Struts2的类型转换的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章搞定Struts2的类型转换 - Python技术站