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 的页面。