1. 程式人生 > 其它 >Spring MVC資料格式化(Formatter)

Spring MVC資料格式化(Formatter)

Spring MVC 框架的 Formatter<T> 與 Converter<S, T> 一樣,也是一個可以將一種資料型別轉換成另一種資料型別的介面。不同的是,Formatter 的源型別必須是 String 型別,而 Converter 的源型別可以是任意資料型別。Formatter 更適合 Web 層,而 Converter 可以在任意層中。所以對於需要轉換表單中的使用者輸入的情況,應該選擇 Formatter,而不是 Converter。

在 Web 應用中由 HTTP 傳送的請求資料到控制器中都是以 String 型別獲取,因此在 Web 應用中選擇 Formatter<T> 比選擇 Converter<S, T> 更加合理。

內建的格式化轉換器

Spring MVC 提供了幾個內建的格式化轉換器,具體如下。
  • NumberFormatter:實現 Number 與 String 之間的解析與格式化。
  • CurrencyFormatter:實現 Number 與 String 之間的解析與格式化(帶貨幣符號)。
  • PercentFormatter:實現 Number 與 String 之間的解析與格式化(帶百分數符號)。
  • DateFormatter:實現 Date 與 String 之間的解析與格式化。

自定義格式化轉換器

自定義格式化轉換器就是編寫一個實現 org.springframework.format.Formatter 介面的 Java 類。該介面宣告如下。
  • public interface Formatter<T>
這裡的 T 表示由字串轉換的目標資料型別。該介面有 parse 和 print 兩個介面方法,自定義格式化轉換器類必須覆蓋它們。
  • public T parse(String s, java.util.Locale locale)
  • public String print(T object, java.util.Locale locale)
parse 方法的功能是利用指定的 Locale 將一個 String 型別轉換成目標型別,print 方法與之相反,用於返回目標物件的字串表示。

示例

下面通過具體應用講解自定義格式化轉換器的用法,本節示例基於《@Controller和@RequestMapping註解》一節中的 springmvcDemo2 程式。

1. 建立實體類

建立 net.biancheng.po 包,並在該包中建立 User 實體類,程式碼如下。
package net.biancheng.po;

import java.util.Date;

public class User {
    private String name;
    private Integer age;
    private Double height;
    private Date createDate;
    /**省略setter和getter方法*/
}

2. 建立控制器類

建立 net.biancheng.controller 包,並在該包中建立 FormatterController 控制器類,程式碼如下。
package net.biancheng.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import net.biancheng.po.User;

@Controller
public class FormatterController {
    @RequestMapping("/formatter")
    public String myFormatter(User us, Model model) {
        model.addAttribute("user", us);
        return "showUser";
    }
}

3. 建立自定義格式化轉換器類

建立 net.biancheng.formatter 包,並在該包中建立 MyFormatter 的自定義格式化轉換器類,程式碼如下。
package net.biancheng.formatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.format.Formatter;
import org.springframework.stereotype.Component;

@Component
public class MyFormatter implements Formatter<Date> {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    public String print(Date object, Locale arg1) {
        return dateFormat.format(object);
    }

    public Date parse(String source, Locale arg1) throws ParseException {
        return dateFormat.parse(source); // Formatter只能對字串轉換
    }
}

4. 註冊格式化轉換器

在 springmvc-servlet.xml 配置檔案中註冊格式化轉換器,具體程式碼如下:
<!--註冊MyFormatter -->
<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <bean class="net.biancheng.formatter.MyFormatter" />
        </set>
    </property>
</bean>

<mvc:annotation-driven conversion-service="conversionService" />

5. 建立相關檢視

建立新增使用者頁面 addUser.jsp,程式碼如下。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新增使用者</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/formatter" method="post">
        使用者名稱:<input type="text" name="name" />
        <br>
        年齡:<input type="text" name="age" />
        <br>
        身高:<input type="text" name="height" />
        <br>
        建立日期:<input type="text" name="createDate" />
        <br>
        <input type="submit" value="提交" />
    </form>
</body>
</html>
建立資訊顯示頁面 showUser.jsp,程式碼如下。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用者資訊</title>
</head>
<body>

    您建立的使用者資訊如下:
    <br />
    <!-- 使用EL表示式取出model中的user資訊 -->
    使用者名稱:${user.name }
    <br />
    年齡:${user.age }
    <br />
    身高:${user.height }
    <br />
    建立日期:${user.createDate }

</body>
</html>

6. 測試執行

訪問地址:http://localhost:8080/springmvcDemo2/addUser。


addUser.jsp

showUser.jsp from
http://c.biancheng.net/spring_mvc/formatter.html