數據格式化 1.基本介紹 說明:在我們提交數據(比如表單時),SpringMVC 是怎樣對提交的數據進行轉換和處理的 基本數據類型可以和字元串之間自動進行轉換,比如:SpringMVC 上下文中內建了很多轉換器,可以完成大多數 java 類型的轉換工作。[相互轉換,這裡只列出部分] Conversi ...
數據格式化
1.基本介紹
說明:在我們提交數據(比如表單時),SpringMVC 是怎樣對提交的數據進行轉換和處理的
基本數據類型可以和字元串之間自動進行轉換,比如:SpringMVC 上下文中內建了很多轉換器,可以完成大多數 java 類型的轉換工作。[相互轉換,這裡只列出部分]
ConversionService converters =
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
……
2.基本數據類型和字元串自動轉換
應用實例:基本數據類型可以和字元串之間自動地完成轉換
(1)Monster.java
package com.li.web.datavalid.entity;
/**
* @author 李
* @version 1.0
*/
public class Monster {
private Integer id;
private String email;
private Integer age;
private String name;
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Monster{" +
"id=" + id +
", email='" + email + '\'' +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
(2)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>
(3)MonsterHandler.java
package com.li.web.datavalid;
import com.li.web.datavalid.entity.Monster;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
/**
* @author 李
* @version 1.0
* MonsterHandler 處理器響應用戶提交數據
* @Scope(value = "prototype")表示每次請求MonsterHandler都會生成一個新的對象
*/
@Controller
@Scope(value = "prototype")
public class MonsterHandler {
/**
* 顯示添加monster的頁面
* 這裡的 map,當我們向 map添加數據時,會預設存放到 request域中
* @param map
* @return
*/
@RequestMapping(value = "/addMonsterUI")
public String addMonsterUI(Map<String, Object> map) {
//如果你跳轉的頁面使用了SpringMVC標簽,就需要準備一個對象放入到request域中,
//該對象的屬性名要對應SpringMVC的form標簽的modelAttribute的屬性名,否則報錯
map.put("monster", new Monster());
return "datavalid/monster_addUI";
}
/**
* SpringMVC可以將提交的數據,按照參數名和形參對象的屬性名匹配,
* 然後直接封裝到對象中[模型數據]
* @param monster
* @return
*/
@RequestMapping(value = "/save")
public String save(Monster monster) {
System.out.println("monster---" + monster);
return "datavalid/success";
}
}
(4)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>
<%--
1. 這裡的表單,我們使用SpringMVC的標簽來完成,目的是方便提示信息的回顯
2. SpringMVC表單標簽在顯示之前,必須在request域中有一個 bean(java對象),
該 bean的屬性名和表單標簽的欄位要對應!
3. request 域中的 key 為 form 標簽的 modelAttribute的屬性值,比如這裡的 monsters
4.SpringMVC 的 form:form 標簽的 action 屬性值中的 / 不代表 WEB應用的根目錄。
--%>
<form:form action="save" method="post" modelAttribute="monster">
妖怪id:<form:input path="id"/><br/><br/>
妖怪名字:<form:input path="name"/><br/><br/>
妖怪年齡:<form:input path="age"/><br/><br/>
電子郵件:<form:input path="email"/><br/><br/>
<input type="submit" value="添加妖怪"/>
</form:form>
</body>
</html>
(5)success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加成功</title>
</head>
<body>
<h1>恭喜你,添加成功</h1>
</body>
</html>
(6)測試
後臺成功拿到了數據,並將 String 類型的字元串轉化為相應的數據類型,賦給 Monster 對象屬性。說明 SpringMVC 底層可以自動進行基本數據類型轉換。
3.特殊數據類型和字元串間的轉換
- 特殊數據類型和字元串之間的轉換可以使用註解來完成(比如日期,規定格式的小數比如貨幣形式)
- 對於日期和貨幣可以使用 @DataTimeFormat 和 @NumberFormat 註解。
應用實例
(1)修改Monster.java,增加 birthday 和 salary 欄位。修改相應的構造器,getter 和 setter 等。
(2)data_valid.jsp 不變
(3)MonsterHandler.java 不變
(4)修改 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>
<%--
1. 這裡的表單,我們使用SpringMVC的標簽來完成,目的是方便提示信息的回顯
2. SpringMVC表單標簽在顯示之前,必須在request域中有一個 bean(java對象),
該 bean的屬性名和表單標簽的欄位要對應!
3. request 域中的 key 為 form 標簽的 modelAttribute的屬性值,比如這裡的 monsters
4.SpringMVC 的 form:form 標簽的 action 屬性值中的 / 不代表 WEB應用的根目錄。
--%>
<form:form action="save" method="post" modelAttribute="monster">
妖怪id:<form:input path="id"/><br/><br/>
妖怪名字:<form:input path="name"/><br/><br/>
妖怪年齡:<form:input path="age"/><br/><br/>
妖怪生日:<form:input path="birthday"/><br/><br/>
妖怪工資:<form:input path="salary"/><br/><br/>
電子郵件:<form:input path="email"/><br/><br/>
<input type="submit" value="添加妖怪"/>
</form:form>
</body>
</html>
(5)success.jsp 不變
(6)redeployTomcat,進行測試
提交的數據:
後臺輸出:
monster---Monster{id=22, email='[email protected]', age=99, name='king', birthday=Tue Jan 01 00:00:00 CST 1924, salary=124567.22}
如果轉換失敗,將會提示:
Field error in object 'monster' on field 'birthday': rejected value [192401-01]; codes [typeMismatch.monster.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [monster.birthday,birthday]; arguments []; default message [birthday]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '192401-01'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [192401-01]]]