📅  最后修改于: 2023-12-03 15:35:10.405000             🧑  作者: Mango
在Struts2中,类型转换器负责将表单提交的字符串转换成Action类中对应的属性类型,使得系统能够正确的将请求参数注入到Action类中。本文将对Struts2中的类型转换器进行详细介绍。
在Action类中,需要使用@com.opensymphony.xwork2.ActionSupport支持注解,同时定义一个与表单中参数名称相同的属性。
public class DemoAction extends ActionSupport {
private int age;
// getter and setter methods
}
在表单中需要提交一个名为age的字符串,Struts2中的类型转换器会将其转换成整型数据。
<s:form action="demo.action" method="post">
<s:textfield name="age" label="Age" />
<s:submit value="Submit" />
</s:form>
Struts2中的类型转换器有两种配置方式,一种是在struts.xml文件中进行配置,另一种是自定义类型转换器。
在struts.xml中默认已经配置好了常用的类型转换器,包括:
| 类型 | 配置关键字 | | ------------ | -------- | | 字符串(String) | string | | 整形(int) | integer | | 长整形(long) | long | | 短整型(short) | short | | 布尔型(boolean) | boolean | | 双浮点型(double) | double | | 单浮点型(float) | float | | 日期格式(Date) | date |
在Action类中添加set方法,使用自定义的类型转换器类。例如:
public class DemoAction extends ActionSupport {
private Date dateOfBirth;
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
// getter method
}
在struts.xml中定义转换器类:
<bean type="org.apache.struts2.util.StrutsTypeConverter" name="dateTypeConverter" class="com.example.DateTypeConverter" />
<constant name="struts.conversion.properties" value="conversion.properties" />
其中,conversion.properties文件用来定义自定义类型转换器,例如:
java.util.Date=com.example.DateTypeConverter
在Struts2中,类型转换器支持继承关系,当无法找到指定类型的转换器时,Struts2会在转换器继承链上寻找相关转换器。例如:
public class DemoAction extends ActionSupport {
private List<Goods> goodsList;
public void setGoodsList(List<Goods> goodsList) {
this.goodsList = goodsList;
}
// getter method
}
在struts.xml中定义Goods转换器,并继承PropertyEditorBridge类:
<bean type="org.apache.struts2.util.StrutsTypeConverter" name="goodsTypeConverter" class="com.example.GoodsTypeConverter" extends="com.opensymphony.xwork2.util.reflection.StrutsTypeConverter" />
<constant name="struts.conversion.properties" value="conversion.properties" />
在conversion.properties中定义Goods类型的转换器:
com.example.Goods=com.example.GoodsTypeConverter
下面是一个完整的示例,包括Action类、配置文件及JSP页面。
DemoAction.java
public class DemoAction extends ActionSupport {
private Date dateOfBirth;
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
// getter method
}
DateTypeConverter.java
public class DateTypeConverter extends StrutsTypeConverter {
private DateFormat dateFormat;
public DateTypeConverter() {
this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
}
@Override
public Object convertFromString(Map context, String[] values, Class toType) {
String dateString = values[0];
try {
return this.dateFormat.parse(dateString);
} catch (ParseException e) {
throw new TypeConversionException(e);
}
}
@Override
public String convertToString(Map context, Object object) {
Date dateValue = (Date) object;
return this.dateFormat.format(dateValue);
}
}
struts.xml
<package name="demo" namespace="/" extends="struts-default">
<action name="demo" class="com.example.DemoAction" method="execute">
<result name="success">/WEB-INF/views/demo/success.jsp</result>
</action>
<bean type="org.apache.struts2.util.StrutsTypeConverter" name="dateTypeConverter" class="com.example.DateTypeConverter" />
<constant name="struts.conversion.properties" value="conversion.properties" />
</package>
conversion.properties
java.util.Date=com.example.DateTypeConverter
success.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<title>示例</title>
</head>
<body>
<s:form action="demo" method="post">
<s:textfield name="dateOfBirth" label="Date of Birth" value="%{#request.dateOfBirth}" />
<s:submit value="Submit" />
</s:form>
</body>
</html>
在浏览器中访问http://localhost:8080/demo,输入"1990-01-01",提交成功后,将重定向到success.jsp页面,并显示输入的日期。