Struts2 类型转换
类型转换的意义
对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构应用的请求参数是通过浏览器发送到服务器的,这些参数不可能有丰富的数据类型,因此必须在服务器端完成数据类型的转换
MVC框架是一个表现层解决方案,理应提供类型转换的支持,Struts2提供了功能非常强大的类型转换支持.
表现层数据的处理
对于web应用而言,表现层主要用于与用户交互,包括收集用户输入数据,向用户呈现服务器的状态。因此表现层的数据的流向主要有两个方向:输入数据和输出数据。
对于输入数据:则需要完成由字符串数据向多种类型数据的转化。程序通常无法自动完成,需要在代码中手动转化
对于输出数据:不管是java或是jsp都支持多种数据类型的直接输出。
表现层另外一个数据处理是:数据校验,分为客户校验和服务器端校验.后边会重点讲解
类型转换
HTTP参数都是字符串类型。 保存的数据可能是字符串、数字、布尔、日期时间等或者JavaBean类型。 手工的类型转换,比如将字符串转换为日期,通过: 通过request.getParameter方法获取字符串; 检查是否为空; 通过DateFormat.parse方法将字符串转换为Date对象
Struts2 的内置类型转换
String和boolean 完成字符串与布尔值之间的转换
String和char 往常字符串与字符之间的转换
String和int、Integer 完成字符串与整型之间的转换
String和Long 完成字符串与长整型值之间的转换
String和double、Double 完成字符串与双精度浮点值的转换
String和Float 完成字符串和单精度浮点之间的转换
String和Date 完成字符串和日期类型之间的转换,日期格式使用格式用户请求所在Locale的SHORT格式
String和数组 在默认的情况,数组元素是字符串,如果用户定义类型转换器,也可以是其它复合数据类型
String和Map、List
下面进行实例,首先来看用ognl.DefaultTypeConverter 来实现的局部的类型转换
自定义的转换器 MyTypeConverter
public class MyTypeConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
System.out.println("类型转化器方法的......................start");
//判断转化的方向
if(toType == User.class){
//请求的参数是一个字符串的数组
String params[] = (String [])value;
//创建一个实例对象
User user = new User();
user.setName(params[0]);
user.setPass(params[1]);
user.setSal(Double.valueOf(params[2]));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
try {
user.setBirth(dateFormat.parse(params[3]));
} catch (ParseException e) {
e.printStackTrace();
}
user.setIsmarry(Boolean.valueOf(params[4]));
return user;
}else if(toType == String.class){
}
return super.convertValue(context, value, toType);
}
}
然后我们创建一个properties文件名字为UserAction-conversion 并在其配置如下键值
user=cn.csdn.struts2.typeconverter.MyTypeConverter//键为你要转换的实体,值为你对应的转换器,这连文件必须要和上面的anction在同一路径下
第二种局部的类型转换方法,我们用struts2中自带的org.apache.struts2.util.StrutsTypeConverter进行配置
自定义转换器 MyDateTypeConverter 继承 org.apache.struts2.util.StrutsTypeConverter
public class MyDateTypeConverter extends StrutsTypeConverter {
/** 用于String类型数据转成自定义类型的处理方法 */
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("struts2-----------------------start");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = dateFormat.parse(values[0]);
return date;
} catch (ParseException e) {
System.out.println("你输入的日期格式有误.....");
e.printStackTrace();
}
return new Date();
}
/** 用于自定义类型转换成String */
public String convertToString(Map context, Object obj) {
System.out.println("struts2-----------------------end");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
String str = dateFormat.format(obj);
return str;
}
}
在这之前我们要创建相应的user bean
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String pass;
private Date birth;
private Double sal;
private Boolean ismarry;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer id, String name, String pass, Date birth, Double sal,
Boolean ismarry) {
super();
this.id = id;
this.name = name;
this.pass = pass;
this.birth = birth;
this.sal = sal;
this.ismarry = ismarry;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public Boolean getIsmarry() {
return ismarry;
}
public void setIsmarry(Boolean ismarry) {
this.ismarry = ismarry;
}
}
然后我们创建一个properties文件名字为User-conversion 并在其配置如下键值
birth=cn.csdn.struts2.typeconverter.MyDateTypeConverter//键为你要转化的字符串,值为你对应的转换器,这连文件必须要和上面的user bean在同一路径下
如果我们要定义全局的我们就要在class路径下创建一个xwork-conversion.properties的属性文件
cn.csdn.struts2.domain.User=cn.csdn.struts2.typeconverter.MyTypeConverter
java.util.Date=cn.csdn.struts2.typeconverter.MyDateTypeConverter
注册页面
<div align="center">
<h1>
用户注册页面
</h1>
<div>
<form action="./csdn/insert.action" method="post">
用户名:
<input type="text" name="user" />
<br />
密码:
<input type="password" name="user" />
<br />
薪资:
<input type="text" name="user" />
<br />
出生日期:
<input type="text" name="user" />
<br />
婚否:
<input type="radio" name="user" value="true"/>
是
<input type="radio" name="user" value="false"/>
否
<br/>
<input type="submit" value="注册"/>
</form>
</div>
</div>