springMVC–数据格式化
基本介绍
数据格式化是我们在提交数据(比如表单时)时,SpringMVC 对提交的数据进行转换和处理。
基本数据类型可以和字符串之间自动完成转换,因为Spring MVC 上下文中内建了很多转换器,可完成大多数Java 类型的转换工作。[相互转换,这里只列出部分]。
spring MVC部分转换器
java.lang.Boolean -> java.lang.String :org.springframework.core.convert.support.ObjectToStringConverter@f874ca
java.lang.Character -> java.lang.Number : CharacterToNumberFactory@f004c9
java.lang.Character -> java.lang.String : ObjectToStringConverter@68a961
java.lang.Enum -> java.lang.String : EnumToStringConverter@12f060a
java.lang.Number -> java.lang.Character : NumberToCharacterConverter@1482ac5
java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory@126c6f
java.lang.Number -> java.lang.String : ObjectToStringConverter@14888e8
java.lang.String -> java.lang.Boolean : StringToBooleanConverter@1ca6626
java.lang.String -> java.lang.Character : StringToCharacterConverter@1143800
java.lang.String -> java.lang.Enum : StringToEnumConverterFactory@1bba86e
java.lang.String -> java.lang.Number : StringToNumberConverterFactory@18d2c12
java.lang.String -> java.util.Locale : StringToLocaleConverter@3598e1
java.lang.String -> java.util.Properties : StringToPropertiesConverter@c90828
java.lang.String -> java.util.UUID : StringToUUIDConverter@a42f23
java.util.Locale -> java.lang.String : ObjectToStringConverter@c7e20a
java.util.Properties -> java.lang.String : PropertiesToStringConverter@367a7f
java.util.UUID -> java.lang.String : ObjectToStringConverter@112b07f ……
基本数据类型和字符串自动转换
应用实例
基本数据类型可以和字符串之间自动完成转换。
代码实现
创建JavaBean:springmvc\src\com\web\datavalid\Monster.java
public class Monster { private Integer id; private String email; private Integer age; private String name; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Monster() { } public Monster(Integer id, String email, Integer age, String name) { this.id = id; this.email = email; this.age = age; this.name = name; } 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 getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Monster{" + "id=" + id + ", email='" + email + '\'' + ", age=" + age + ", name='" + name + '\'' + '}'; } }
创建springmvc\web\data_valid.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>SpringMVC[数据格式/验证等]</title> </head> <body> <h1>SpringMVC[数据格式/验证等]</h1> <hr> <a href="<%=request.getContextPath()%>/addMonsterUI">添加妖怪</a> </body> </html>
创建springmvc\src\com\web\datavalid\MonsterHandler.java
// MonsterHandler 处理器响应用户提交数据 @Controller//将其注入到容器 @Scope(value = "prototype")//表示每次请求MonsterHandler会生成一个新的对象 public class MonsterHandler { /** * 显示添加monster的界面 * 1. 这里Map<String, Object> map * 2. 当我们向map添加的数据时,会默认存放到request域 */ @RequestMapping(value = "/addMonsterUI")//设置访问路径 public String addMonsterUI(Map<String, Object> map) { /** 1. 这里的表单,我们使用springMVC的标签来完成 2. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该 bean 的属性和表单标签的字段要对应! request 中的 key 为: form 标签的 modelAttrite 属性值, 比如这里的monsters 3. SpringMVC 的 form:form 标签的 action 属性值中的 / 不代表 WEB 应用的根目录. 4. <form:form action="?" method="POST" modelAttribute="monster"> */ //这里需要给request增加一个 monster,因为jsp 页面 的modelAttribute="monster"需要存放内容 //这时是springMVC的内部的检测机制 即使是一个空的也需要,否则报错. //再次说明,如果你跳转的页面使用springmvc标签 //就需要准备一个对象,放入request域中,空的也可以,该对象的字段必须和表单标签字段对应 //假设这个对象的属性名 monster, 对于springmvc表单标签的 modelAttribute="monster" map.put("monster", new Monster()); return "datavalid/monster_addUI"; } }
创建springmvc\web\WEB-INF\pages\datavalid\monster_addUI.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>添加妖怪</title> </head> <body> <h3>添加妖怪</h3> <!-- 这里的表单,我们使用springMVC的标签来完成 特别说明几点: 1. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该 bean 的属性和表单标签的字段要对应! request 中的 key 为: form 标签的 modelAttribute 属性值, 比如这里的monsters 2. SpringMVC 的 form:form 标签的 action 属性值中的 / 不代表 WEB 应用的根目录. 3. 这里使用springmvc的标签的主要的目的是方便提示信息回显 --> <form:form action="save" method="post" modelAttribute="monster"> 妖怪名字: <form:input path="name"/> <form:errors path="name"/> <br><br> 妖怪年龄~: <form:input path="age"/> <form:errors path="age"/> <br><br> 电子邮件: <form:input path="email"/> <form:errors path="email"/> <br><br> 妖怪生日: <form:input path="birthday"/> <form:errors path="birthday"/> 要求以"9999-11-11"的形式<br><br> 妖怪薪水: <form:input path="salary"/> <form:errors path="salary"/> 要求以"123,890.12"的形式<br><br> <input type="submit" value="添加妖怪"/> </form:form> </body> </html>
创建springmvc\web\WEB-INF\pages\datavalid\success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>添加成功</title> </head> <body> <h1>恭喜, 添加成功~</h1> </body> </html>
测试
看看是否可以正确显示添加要求界面(页面测试)。浏览器: http://localhost:8080/springmvc/data_valid.jsp
修改MonsterHandler.java , 增加处理添加请求
//处理添加,更加请求的方法来确定 @RequestMapping(value = "/save", method = RequestMethod.POST) public String save(Monster monster) { //注意观察输出内容 System.out.println("monster= " + monster); return "datavalid/success"; }
测试, 浏览器: http://localhost:8080/springmvc/data_valid.jsp
如果age 输入的是数字,则通过, 说明SpringMVC 可以将提交的字符串数字,比如"28",转成Integer/int。
如果不是数字,则给出400 的页面。
- 如何给出对应的提示,在后面说明。
特殊数据类型和字符串间的转换
应用实例-页面演示方式
说明:
- 特殊数据类型和字符串之间的转换使用注解(比如日期,规定格式的小数比如货币形式等)
- 对于日期和货币可以使用@DateTimeFormat 和@NumberFormat 注解. 把这两个注解标记在字段上即可.
修改Monster.java , 增加birthday 和salary 字段
增加属性后不要忘了添加对应的get/set方法,不然后面读取不了。
@DateTimeFormat(pattern="yyyy-MM-dd")//设置日期格式 private Date birthday; @NumberFormat(pattern="###,###.##")//设置货币格式 private float salary; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } public Monster(Integer id, String email, Integer age, String name, Date birthday, float salary) { this.id = id; this.email = email; this.age = age; this.name = name; this.birthday = birthday; this.salary = salary; } @Override public String toString() { return "Monster{" + "id=" + id + ", email='" + email + '\'' + ", age=" + age + ", name='" + name + '\'' + ", birthday=" + birthday + ", salary=" + salary + '}'; }
修改monster_addUI, 增加birthday 和salary 字段
妖怪年龄~: <form:input path="age"/> <br><br> 妖怪生日: <form:input path="birthday"/> 要求以"9999-11-11"的形式<br><br> 妖怪工资: <form:input path="salary"/> 要求以"123,890.12"的形式<br><br>
测试
- 如果birthday 和salary 是按照指定格式输入,则通过, 说明SpringMVC 可以按注解指定格式转换。
- 如果没有按照注解指定格式,则给出400 的页面。