Struts2类型转换
一、传统的数据类型转换方法
- 手工编写代码
//第一步:只能在request数据区中获得字符串类型的数据
String name = request.getParameter("name");
String password = request.getParameter("password");
String iAge = request.getParameter("age");
String sBirthday = request.getParameter("birthday");
//第二步:将字符串类型的数据转换为User对象所需的类型
int age = Integer.parseInt(iAge);
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
Date birthday = null;
birthday = df.parse(sBirthday);
//第三步:根据新数据构建User对象
User user = new User(name,password,age,birthday);
缺点:手工编写大量代码;代码复用性差
二、Struts中数据类型转换
- 在 struts2 中, 把请求参数映射到 action 属性的工作由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Parameters 拦截器可以自动完成字符串和基本数据类型之间转换.
- Struts提供的内建类型转换器
转换类型 |
说明 |
boolean/Boolean |
将字符串转换成布尔值 |
char和Character |
字符串和字符之间的转换 |
int和Integer |
字符串和整型值之间的转换 |
long和Long |
字符串和长整型值之间的转换 |
float和Float |
字符串和单精度浮点值之间的转换 |
double和Double |
字符串和双精度浮点值之间的转换 |
Date |
字符串和日期类型之间的转换 |
数组 |
字符串首先转换成数组元素的类型,然后再存放到新的数组中 |
集合 |
在默认情况下集合元素的数据类型是字符串,并创建一个新的ArrayList存放所有的字符串 |
- 案例:在这个案例过程中,我们本身并没有干预页面到Action和Action到页面的数据类型转换,但是数据正确实现了数据类型的转换,这就是struts的类型转换功能。
Login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <form action="userAction"> <table> <tr><td>编号:<input type="text" name="id" value="1"></td></tr> <tr><td>姓名:<input type="text" name="userName" value="ross"></td></tr> <tr><td>创建日期:<input type="text" name="createTime" value="1986-09-09 12:12:12"></td></tr> <tr><td><input type="submit" value="submit"></td></tr> </table> </form> </body> </html> |
Struts.xml
<package name="struts2" extends="struts-default"> <action name="userAction" class="com.silvan.action.UserAction"> <result>/show.jsp</result> </action> </package> |
UserAction.java
package com.silvan.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private Integer id; private String userName; private Date createTime; public String execute(){ System.out.println("id:"+id); System.out.println("userName:" +userName); System.out.println("createTime" + createTime); return SUCCESS; } Get/set…… } |
show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <form action=""> <table> <tr><td>编号:<s:property value="id" /></td></tr> <tr><td>姓名:<s:property value="userName" /></td></tr> <tr><td>创建日期:<s:property value="createTime" /></td></tr> </table> </form> </body> </html> |
三、自定义类型转换器
众所周知,java有八大基本的类型,struts2能对这八大基本类型以及String、Date等常用类型提供自动转换。但是,仅仅这些远远不能满足我们的需要。
原因:因为页面中的类型都是属于字符串类型的,而java是一种强类型语言,这时候我们需要把输入的字符串转型成为相应的类型。
在类型转换器的定义中也分为两种:
局部类型转换器:对某个action转换类型起作用。
全局类型转换器:对所有action转换类型起作用。
自定义类型转换器步骤:
- 首先通过实现TypeCoverter接口或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口)来实现自己的类型转换器(重写convertValue方法即可)。
package com.silvan.convert;
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;
import ognl.DefaultTypeConverter;
/** * 继承DefaultTypeConverter * @author Administrator * */ public class DateConverter extends DefaultTypeConverter { //再重写convertValue方法 //其中,context是类型转换环境的上下文,value是需要转换的参数,toType 是转换后的目标类型。 @Override public Object convertValue(Map context, Object value, Class toType) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); // 当字符串向Date类型转换时 // 这时value的来源是从url或者表单提交 try { if (toType == Date.class) { // Request.getParameterValues() , // 转换为string数组是因为像复选框之类的组件可以提交的值是一个数组 String[] params = (String[]) value; // 解析成日期格式(注意:这里的日期一定要是util包下的日期) return dateFormat.parse(params[0]); // 当Date转换成字符串时,这时value的来源是 // action类,因此value不要强转为数组形式 //(注意:使用EL表达式向页面输出是该if不会被 // 执行,只有使用OGNL表达式向页面输出时才会进入此if语句) } else if (toType == String.class) { Date date = (Date) value; return dateFormat.format(date);// 转换为字符串 } } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } |
- 其他页面代码和Action代码与上面案例一样
- 配置
将该转换器注册在WEB应用中,这样 Struts 2 框架才能使用该类型的转换器。
类型转换器的注册有两种:
- 注册局部类型转换器:仅仅对某个Action的属性起作用。
- 注册全局类型的转换器:对所有Action 都有效。
局部类型转换器:
在需要生效的Action类的包下新建ActionName-conversion.properties该文件,其中 ActionName是需要转换生效的Action的类名,后面的-conversion固定。
内容: 待转换的action中的属性名=类型转换器的全类名。 注意:类型转换器是需要加包名,而且最后不能加标点符号
如:
文件名:UserAction-conversion.properties
注册内容:createTime=com.silvan.convert.DateConverter
全局类型转换器:
在WEB-INF/classes或者src目录下新建xwork-conversion.properties文件。文件名是固定的。【注】xwork表示全局
内容:待转换的类型 = 类型转换器的全类名
xwork-conversion.properties: java.util.Date= com.silvan.convert.DateConverter