类型转换器
1、引入
在Struts2中,请求参数类型不仅可以是String,还可以是其它类型。
如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,
则birthday接收到的不是字符串“1949-10-1”,而是日期类型。
但,需注意的是,对于基本数据类型,需将其定义为包装类型。
实例:请求参数值的类型-- typeconverter
Step1:编写index.jsp与show.jsp
Step2:编写Birthday_Action
Step3:编写web.xml与struts.xml
新建web项目工程源码文档目录如下:
Birthday_Action.java源码如下:
package actions; import java.util.Date; public class Birthday_Action {
private Date birthday; public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String execute(){
System.out.println("--------birthday------"+birthday);
return "success";
}
}
index.jsp源码如下:
<%@ page pageEncoding="utf-8"%> <html>
<head> <title>login.jsp</title> </head> <body>
<form action="birthday.action"> 中华人名*的建国日期是:
<input type="text" name="birthday"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
show.jsp源码如下:
<%@ page pageEncoding="utf-8" isELIgnored="false"%> <html>
<head> <title>show page</title> </head> <body>
中国人民*的建国日期是:${birthday} </body>
</html>
web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="one" extends="struts-default"> <action name="birthday" class="actions.Birthday_Action">
<result>/show.jsp</result>
</action> </package>
</struts>
部署发布,启动tomcat,输入地址:
http://127.0.0.1:8080/typeconverter/
说明,Struts2将1949-10-1作为Date类型接收了。
http://127.0.0.1:8080/typeconverter/
那么,如何能够让Struts2将19491001当作Date类型?
类型转换器自定义类型转换器类,是继承自com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的。在使用时,一般需要覆盖其父类的方法public Object convertValue(
Map<String, Object> context, //OGNL表达式上下文
Object value, //待转换的值
Class toType //要转换为的类型
)注意:定义convertValue方法时需要注意,其转换一般是定义为双向的。
实例步骤:在上例中定义类型转换器类:typeconverters.Date_String_Converter需要注意第二个参数value,若转换方向为从请求到action,则value为字符串数组。因为请求中是允许携带多个同名参数的,而这时的这个同名参数,其实就是数组。Struts2为了兼顾到这种多个同名参数的情况,就将从请求到action方向的转换的value指定为了String[],而非String。在定义好类型转换器后,需要注册该转换器,用于通知Struts2框架在遇到指定类型变量时,需调用类型转换器。
具体解决方法:
在原有代码基础上新建继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的String_Date_Converter.java。
String_Date_Converter.java完成源码如下:
package typeconverters; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class String_Date_Converter extends DefaultTypeConverter { @Override
public Object convertValue(Map<String, Object> context, Object value,Class toType) {
//MM代表两位数的月,不可以小写,小写mm就成了两位数的分
SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
try {
if(toType==Date.class){
String[] params=(String[]) value;
//将字符串解析为日期类型
return sf.parseObject(params[0]);
}else if(toType==String.class){ //注意这里导入import java.util.Date;
Date date=(Date)value; //将日期类型格式化为指定格式的字符串
return sf.format(date);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }
根据注册方式的不同及其应用范围的不同,可以将类型转换器分为两类:1.局部类型转换器2.全局类型转换器局部类型转换器局部类型转换器,仅仅对指定Action的指定属性起作用。注册方式:在Action类所在的包下放置名称为如下格式的属性文件:ActionClassName-conversion.properties文件。其中ActionClassName是Action类名,-conversion.properties是固定写法。就本例而言,该注册文件的名称应为BirthdayAction-conversion.properties 。此文件的内容也遵循一种格式:属性名称=类型转换器的全类名对于本例而言,文件中的内容为:birthday=typeconverters.Date_String_Converter注册方式:在actions包中新建属性文件BirthdayAction-conversion.properties。全局类型转换器全局类型转换器,会对所有Action的指定类型的属性生效。注册方式:在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。该文件的内容格式为:待转换的类型=类型转换器的全类名。
重新部署发布,启动tomcat,输入地址:
http://127.0.0.1:8080/typeconverter/
注意:这时候1949-10-01提交就会错误,要想实现19491001和1949-10-01都可用,只需多定义几个转换器即可。
全局类型转换器:
重新部署发布,启动tomcat,输入地址:
http://127.0.0.1:8080/typeconverter/