一. 类型转换器
前端传入的值,从表单中传入的值,都是字符串或者是字符串数组的形式传入的,在后端需要进行手动的转换类型,然后才能正确的使用。 框架一般对常见的数据类型的转换进行了封装提供,如字符串转换成数字等。
SpringMVC 也提供了一些内置的转换器。
有标量的转换器,即字符串到数字,字符串到Boolean等。
(图片引用于: http://c.biancheng.net/view/4415.html)
也有集合类型的转换器, 如数组到集合, 拼接型字符器(如,) 到集合等。
(图片引用于: http://c.biancheng.net/view/4415.html)
发现,没有常用的字符串到日期 Date 的转换器。 (如,生日属性,入职日期属性等).
SpringMVC 中,如年龄 age, 转到后端时可以自动转换成 数字类型,这就是内置转换器 StringToNumberConverterFactory 的作用。
内置转换器虽然强大,基本的开发使用是够了,但无法对自定义的类型进行转换。 所以,我们可以自定义类型转换器。
类型转换器,可以用 PropertyEditor 接口, (java 提供的) 来进行相应的转换。 但这种转换有缺点: 只能 是字符串转换成其他的java 对象,不能够java 对象类型到java其他对象类型之间 进行转换。
也可以利用 SpringMVC 的 Convert 接口进行类型转换。 推荐使用第二种。
程序中所使用到的 对象类
User.java
package com.yjl.pojo; import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map; /** * 所用的员工类 * @author 12905 * */ public class User{ private Integer id; private String name; private Integer age; private String sex; private String description; //定义一个幻想的工资属性 private double salary; //定义一个点类 private Point point; //定义一个日期类 private Date birthday; 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Point getPoint() { return point; } public void setPoint(Point point) { this.point = point; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
Point.java
package com.yjl.pojo; //自定义类型转换的 坐标 Point 类 public class Point { private double x; private double y; public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } @Override public String toString() { return "Point [x=" + x + ", y=" + y + "]"; } }
二. PropertyEditor 类型转换器的使用。
二.一 编写 坐标类 类型转换器
先看一下 PropertyEditor 接口。
抽象方法太多,一般不直接实现这个接口,而去 继承它的实现类 PropertyEditorSupport 类。
PointConvert.java 转换类
package com.yjl.convert; import java.beans.PropertyEditorSupport; import com.yjl.pojo.Point; public class PointConvert extends PropertyEditorSupport{ @Override public void setAsText(String text) throws IllegalArgumentException { //不进行异常的处理,只执行正确的程序。 String arr[]=text.split(","); //分解数据 double x=Double.parseDouble(arr[0]); double y=Double.parseDouble(arr[1]); //设置对象 Point point=new Point(); point.setX(x); point.setY(y); setValue(point); } }
二.二 前端页面编写 login.jsp
<body> <h2>两个蝴蝶飞,类型转换器使用</h2> <form:form commandName="user" action="login.action" method="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/><br/> <form:label path="point">坐标:</form:label> <form:input path="point"/><br/> <form:button>提交</form:button> </form:form> </body>
一个普通名称 name, 一个需要转换的属性 point
二.三 后端处理
@Controller @RequestMapping(value="/user") public class UserAction { //类型转换器注册 初始化绑定 @InitBinder public void initBinder(WebDataBinder binder) { //Point 类 用 new PointConvert() binder.registerCustomEditor(Point.class,new PointConvert()); } //转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(User user){ System.out.println("设置名称:"+user.getName()); System.out.println("坐标点:"+user.getPoint().toString()); return "user/list"; } }
二.四 重启服务器,进行访问测试。
前端输入值,点击提交后,页面可以正确的跳转到 list.jsp 页面。
控制台打印输出