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
     * 第二個參數converterUser通過@RequestParam註解,把頁面的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;
    }

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
     * 第二個參數converterUser通過@RequestParam註解,把頁面的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
     * 第二個參數converterUser通過@RequestParam註解,把頁面的other參數交由轉換器StringTouserConverter轉成一個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;
    }
發佈了146 篇原創文章 · 獲贊 130 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章