Spring MVC數據轉換
樣例:把一個字符串封裝而一個對象。
如:username:password格式的數據ZhangSan:1234。我們把這個數據封裝成一個User對象。以下分別使用屬性編輯器與轉換器來實現。
1、自己定義屬性編輯器
A、寫一個屬性編輯器繼承PropertyEditorSupport
package cn.framelife.mvc.converter;
import java.beans.PropertyEditorSupport;
import cn.framelife.mvc.entity.User;
public class UserEditor extends PropertyEditorSupport {
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("setAsText");
User user = new User();
if(text != null){
String[] items = text.split(":");
user.setUsername(items[0]);
user.setPassword(items[1 ]);
}
setValue(user);
}
}
B、Controller範圍的編輯器
在Controller中註冊及使用編輯器:
/**
* @InitBinder註解把編輯器綁定到當前Controller中
*/
@InitBinder
public void initBinder(WebDataBinder binder){
//註冊自己定義的編輯器
binder.registerCustomEditor(User.class, new UserEditor());
}
/**
* 第一個參數user是一個模型數據,接收頁面的username用password
* [email protected]
C、 全局範圍的編輯器
實現WebBindingInitializer接口,並在實現類中註冊屬性編輯器:
package cn.framelife.mvc.converter;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
import cn.framelife.mvc.entity.User;
public class MyBindingInitializer implements WebBindingInitializer {
public void initBinder(WebDataBinder binder, WebRequest request) {
//註冊自己定義的屬性編輯器。這裏能夠註冊多個屬性編輯器
binder.registerCustomEditor(User.class, new UserEditor());
}
}
配置WebBindingInitializer實現類:
<!-- 配置全局範圍的屬性編輯器 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="cn.framelife.mvc.converter.MyBindingInitializer"></bean>
</property>
</bean>
使用屬性編輯器:
和Controller範圍內的使用一樣
/**
* 第一個參數user是一個模型數據,接收頁面的username用password
* [email protected],把頁面的other參數交由UserEditor轉成一個User對象
*/
@RequestMapping("create")
public ModelAndView createUser(User user,@RequestParam("other")User converterUser){
System.out.println(user.getUsername()+"--"+user.getPassword());
System.out.println(converterUser.getUsername()+"--"+converterUser.getPassword());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
2、轉換器
A、寫一個轉換器類繼承Converter
package cn.framelife.mvc.converter;
import org.springframework.core.convert.converter.Converter;
import cn.framelife.mvc.entity.User;
/**
* Converter<S源類型/T目標類型>
*
*/
public class StringToUserConverter implements Converter<String, User> {
public User convert(String source) {
User user = new User();
if(source != null){
String[] items = source.split(":");
user.setUsername(items[0]);
user.setPassword(items[1]);
}
return user;
}
}
B、配置(mvc-servlet.xml)
<!-- 裝配轉換器 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 這裏能夠配置多個自己定義的轉換器 -->
<bean class="cn.framelife.mvc.converter.StringToUserConverter"></bean>
</list>
</property>
</bean>
<!-- 裝配自己定義的轉換器 -->
<mvc:annotation-driven conversion-service="conversionService"/>
C、 Controller的處理方法中接收頁面數據
/**
* 第一個參數user是一個模型數據,接收頁面的username用password
* [email protected],[email protected]一個User對象
*/
@RequestMapping("create")
public ModelAndView createUser(User user,@RequestParam("other")User converterUser){
System.out.println(user.getUsername()+"--"+user.getPassword());
System.out.println(converterUser.getUsername()+"--"+converterUser.getPassword());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
3、註意
假設Controller範圍的屬性編輯器、全局範圍的屬性編輯器、轉換器同一時候存在,那麽Spring MVC將按以下的優先順序查找相應類型的編輯器來處理:
查詢Controller範圍的屬性編輯器
查詢轉換器
查詢全局範圍的屬性編輯器
4、數據格式化
4.1 Spring內建的格式化轉換器
4.2 註解驅動格式化的使用
A、啟動註解驅動格式化功能
之前我們配置自己定義轉換器的時候。使用的是BeanConversionServiceFactoryBean。
org.springframework.context.support.ConversionServiceFactoryBean
改成
org.springframework.format.support.FormattingConversionServiceFactoryBean
FormattingConversionServiceFactoryBean即能夠註冊自己定義的轉換器。還能夠註冊自己定義的註解驅動的格式轉換器,使項目支持註解驅動格式化功能。
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 這是之前配置自己定義的轉換器 -->
<bean class="cn.framelife.mvc.converter.StringToUserConverter"></bean>
</list>
</property>
</bean>
B、頁面
<form action="user/create.abc" method="post">
用戶名:<input type="text" name="username"><br/>
密 碼:<input type="text" name="password"><br/>
生日:<input type="text" name="birthday"><br/>
工資:<input type="text" name="salary"><br/>
其他:<input type="text" name="other"><br/>
<input type="submit">
</form>
C、實體類中使用格式化註解
public class User implements java.io.Serializable {
private Integer id;
private String username;
private String password;
// 將如1999-09-09這種字符串轉換成Date對象
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
// 把如5,500.00這個的字符串轉換成long類型的數據
@NumberFormat(pattern = "#,###.##")
private long salary;
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
D、Controler中處理
@RequestMapping("create")
public ModelAndView createUser(User user){
System.out.println(user.getBirthday()+"=="+user.getSalary());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
Spring MVC數據轉換