0061 Spring MVC的數據格式化--Formatter--FormatterRegistrar--@DateTimeFormat--@NumberFormat

来源:http://www.cnblogs.com/sonng/archive/2017/04/03/6661273.html
-Advertisement-
Play Games

Converter只完成了數據類型的轉換,卻不負責輸入輸出數據的格式化工作,日期時間、貨幣等雖都以字元串形式存在,卻有不同的格式。 Spring格式化框架要解決的問題是:從格式化的數據中獲取真正的數據,綁定數據,將處理完成的數據輸出為格式化的數據。Formatter介面就是該框架最重要的介面 Con ...


Converter只完成了數據類型的轉換,卻不負責輸入輸出數據的格式化工作,日期時間、貨幣等雖都以字元串形式存在,卻有不同的格式。

Spring格式化框架要解決的問題是:從格式化的數據中獲取真正的數據,綁定數據,將處理完成的數據輸出為格式化的數據。Formatter介面就是該框架最重要的介面

Converter主要是做Object與Object之間的類型轉換,Formatter則是要完成任意Object與String之間的類型轉換。前者適合於任何一層,而後者則主要用於web層

下麵用Formatter介面完成0060中用converter完成的功能

先寫個類實現Formatter介面

package net.sonng.mvcdemo.converter;

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

import org.springframework.format.Formatter;

public class DateFormatter implements Formatter<Date> {
    private String datePattern;
    private SimpleDateFormat dateFormat;
    public DateFormatter(String datePattern){
        this.datePattern=datePattern;
        dateFormat=new SimpleDateFormat(datePattern);
    }
    @Override
    public String print(Date date,Locale locale){
        System.out.println("Date轉String類型執行中。。。。");
        return dateFormat.format(date);
    }
    @Override
    public Date parse(String source,Locale locale) throws ParseException{
        try{
            System.out.println("字元串轉Date類型執行中。。。。");
            return dateFormat.parse(source);
        }catch(Exception ex){
            ex.printStackTrace();
            throw new IllegalArgumentException();
        }
    }
}

配置xml

    <mvc:annotation-driven conversion-service="conversionService" />
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- FormattingConversionServiceFactoryBean實現了ConversionService介面,具有類型轉換和格式化的功能,既可以配置converters又可以配置formatters -->
        <property name="formatters">
            <list>
                <bean class="net.sonng.mvcdemo.converter.DateFormatter" c:_0="dd-MM-yyyy" /> <!-- 註意日期格式日-月-年 -->
            </list>
        </property>
    </bean>

訪問index.html,輸入數據,註意生日處按日月年的格式輸入

使用FormatterRegistrar註冊Formatter

要使用Formatter,除了上面的將其配置在FormattingConversionServiceFactoryBeanformatters屬性中外,還可以像下麵這樣註冊

寫個類實現FormatterRegistrar

package net.sonng.mvcdemo.converter;

import org.springframework.format.FormatterRegistrar;
import org.springframework.format.FormatterRegistry;

public class MyFormatterRegistrar implements FormatterRegistrar {  //實現FormatterRegistrar介面
    private DateFormatter dateFormatter;
    
    public void setDateFormatter(DateFormatter dateFormatter) {    //setter
        this.dateFormatter = dateFormatter;
    }

    @Override
    public void registerFormatters(FormatterRegistry registry) {    
        registry.addFormatter(dateFormatter);                      //註冊給定的formatter
    }
}

配置xml

    <mvc:annotation-driven conversion-service="conversionService" />
    <bean id="dateFormatter" class="net.sonng.mvcdemo.converter.DateFormatter" c:_0="dd-MM-yyyy" />   <!-- 聲明formatter的bean,提供給下麵的MyFormatterRegistrar -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatterRegistrars">  <!-- 這裡可以配置converters,formatters,還可以配置formatterRegistrars -->
            <set>
                <bean class="net.sonng.mvcdemo.converter.MyFormatterRegistrar" p:dateFormatter-ref="dateFormatter"  />
            </set>
        </property>
    </bean>

Spring提供的一些Formatter實現

實際上,Spring自身已經將DateFormatter寫好了,位於org.springframework.format.datetime包下
另外在org.springframework.format.number包下麵還提供了三個用於數字對象格式化的實現類
----NumberFormatter:用於數字類型
----CurrencyFormatter:用戶貨幣類型
----PercentFormatter:用於百分數數字類型

用註解配置Formatter

先寫個index.html,分別測試日期、整數、百分數、貨幣類型

<!DOCTYPE html>
<html>
<head>
    <title>Spring MVC的數據類型轉換</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="resources/jquery-3.1.0.js"></script>
    <script type="text/javascript" src="resources/json2.js"></script>
    
</head>
    <body>
        <form action="register" method="post">
            日期類型:<input type="text" name="birthday" /> <br><br>
            整數類型:<input type="text" name="total" /> <br><br>
            百分數類型:<input type="text" name="discount" /><br><br>
            貨幣類型:<input type="text" name="money" /><br><br>
                <input type="submit" value="提交" />
        </form>
    </body>
</html>

實體類User,註解就加在該類的實例變數上

package net.sonng.mvcdemo.entity;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.annotation.NumberFormat.Style;

public class User {
    @DateTimeFormat(pattern="dd-MM-yyyy")                           //註解加在實例變數上
    private Date birthday;
    @NumberFormat(style=Style.NUMBER,pattern="#,###")               //說是這兩個屬性互斥,怎麼可以同時出現呢?
    private int total;
    @NumberFormat(style=Style.PERCENT)
    private double discount;
    @NumberFormat(style=Style.CURRENCY)
    private double money;
    //。。。。。。。
}

controller

package net.sonng.mvcdemo.controller;

import net.sonng.mvcdemo.entity.User;

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

@Controller
public class UserController {
    
    @RequestMapping("/register")
    public String register(User user,Model model){
        model.addAttribute("user", user);
        return "result";
    }
}

result.jsp

<%@page pageEncoding="utf-8" 
        contentType="text/html;charset=utf-8" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試AnnotationFormatterFactory</title>
</head>
<body>
<h3>測試表單數據格式化</h3>
<form:form modelAttribute="user" method="post" action="" >
<table>
    <tr>
        <td>日期類型:</td>
        <td><form:input path="birthday"/></td>
    </tr>
    <tr>
        <td>整數類型:</td>
        <td><form:input path="total"/></td>
    </tr>
    <tr>
        <td>百分數類型:</td>
        <td><form:input path="discount"/></td>
    </tr>
    <tr>
        <td>貨幣類型:</td>
        <td><form:input path="money"/></td>
    </tr>
</table>
</form:form>
</body>
</html>

輸入:

輸出:

org.springframework.format.annotation包下有兩個註解:@DateTimeForamt和@NumberFormat

@DateTimeFormat
可以註釋java.util.Date, java.util.Calendar, java.lang.Long等時間類型的變數,擁有以下三個互斥屬性
----iso:類型為DateTimeFormat.ISO,常用值:
--------DateTimeFormat.ISO.DATE: 格式為yyyy-MM-dd
--------DateTimeFormat.ISO.DATE_TIME: 格式為yyyy-MM-dd hh:mm:ss .SSSZ
--------DateTimeFormat.ISO.TIME: 格式為hh:mm:ss .SSSZ
--------DateTimeFormat.ISO.NONE: 不使用ISO格式的時間
----pattern:類型為String,使用自定義的時間格式化字元串,如yyyy-MM-dd hh:mm:ss
----style:類型為String,通過樣式指定日期時間的格式,由兩位字元組成,第一位表示日期,第二為表示時間
--------S:短日期時間樣式
--------M:中日期時間樣式
--------L:長日期時間樣式
--------F:完整日期時間樣式
---------:(短橫線)忽略日期時間樣式

@NumberFormat
可註釋類似數字類型的實例變數,擁有兩個互斥屬性
----pattern:類型String,使用自定義的數字格式化串,如##,###表示50,000
----style:類型NumberFormat.Style,幾個常用值:
--------Style.CURRENCY: 貨幣類型
--------Style.NUMBER: 正常數字類型
--------Style.PERCENT: 百分比類型

總結

數據格式化也包含了部分數據轉換的內容

實現Formatter介面,重寫print()與parse()方法,實現自定義的數據格式化

Spring MVC提供了幾個格式化類:DateFormatter、NumberFormatter、CurrencyFormatter、PercentFormatter

利用註解@NumberFormat和@DateTimeFormat,註釋在實體類的實例變數上,也可以實現日期、時間、數字的格式化


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • comment on column 表名.欄位名 is '註釋內容'; comment on table 表名 is '註釋內容'; ...
  • public class SqlHelper { public static string connstr= ConfigurationManager.ConnectionStrings["Connstr"].ConnectionString; /// <summary> /// 執行增刪改 /// ...
  • 二進位日誌簡單介紹 MySQL的二進位日誌(binary log)是一個二進位文件,主要用於記錄修改數據或有可能引起數據變更的MySQL語句。二進位日誌(binary log)中記錄了對MySQL資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作數據等其它額外信息,但是它不記錄SELE... ...
  • 一.索引的作用 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。 在數據量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當數據量和訪問量劇增 ...
  • 本文來源於轉載:http://www.cnblogs.com/zhangq723/archive/2012/03/13/2394102.html 前提:在使用下麵的備份方式之前需要確保你的Sqlserver Agent服務啟動,切設置為自動啟動。否則當你伺服器重啟了但是Agent服務沒有啟動,那麼自 ...
  • 好久沒更新博客了,上周在x64位的操作系統中安裝好了32位或64位的oracle 11g客戶端,但用SSIS或Microsoft SQL Server 2012報表生成器3.0去連接oracle 11g死活都連接不上,報各類錯誤,百度了網上給出的解決方案也沒解決,這個問題困擾了兩天,但用同事的電腦去 ...
  • 本文介紹binlog的作用以及幾個重要參數的使用方法,同時通過實驗來描述binlog內部記錄內容:row 、statement跟mixed的設置下,記錄了哪些東西,最後會簡單介紹下binlog server的搭建以及一些關於binlog使用的小Tips。 理解跟熟悉binlog相關內容,對複製原理及 ...
  • 讀書筆記,待補充完善 MySQL緩存分類 InnoDB緩衝池 InnoDB日誌文件和MyIsAM數據的操作系統緩存 MyIsAM鍵緩存 查詢緩存 無法手工配置的緩存,二進位日誌,表定義文件的操作系統緩存 其它緩存,通常不需要太多記憶體 InnoDB緩衝池 作用: 1.緩存的對象包括:數據行,索引,插入 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...