在系列(6)中我們介紹瞭如何驗證提交的資料的正確性,當資料驗證通過後就會被我們保存起來。保存的資料會用於以後的展示,這才是保存的價值。那麼在展示的時候如何依照要求顯示呢? (例如:小數保留一定的位數,日期依指定的格式等)。這就是本篇要說的內容—>格式化顯示。
從SpringSpringMVC學習系列(7) 之 格式化顯示的圖文詳解.X開始,Spring提供了Converter SPI類型轉換和Formatter SPI欄位解析/格式化服務,其中Converter SPI實作物件與物件之間的相互轉換,Formatter SPI實作String與物件之間的轉換,Formatter SPI是對Converter SPI的封裝並添加了對國際化的支持,其內部轉換還是由Converter SPI完成。
下面是一個簡單的請求與模型物件的轉換流程:
Spring提供了FormattingConversionService和DefaultFormattingConversionService來完成物件的解析和格式化。 Spring內建的幾種Formatter SPI如下:
名稱 | #功能 |
NumberFormatter | 實作Number與String之間的解析與格式化 |
CurrencyFormatter | 實作Number與String之間的解析與格式化(帶貨幣符號) |
PercentFormatter | 實作Number與String之間的解析與格式化(帶百分數符號) |
DateFormatter | #實作Date與String之間的解析與格式化 |
NumberFormatAnnotationFormatterFactory | #@NumberFormat註解,實作Number與String之間的解析與格式化,可以透過指定style來指示要轉換的格式(Style.Number/Style.Currency/Style.Percent),當然也可以指定pattern(如pattern=“#.##”(保留SpringMVC學習系列(7) 之 格式化顯示的圖文詳解位小數) ),這樣pattern指定的格式會覆寫Style指定的格式 |
JodaDateTimeFormatAnnotationFormatterFactory | @DateTimeFormat註解,實作日期類型與String之間的解析與格式化這裡的日期類型包括Date、Calendar、 Long以及Joda的日期類型。必須在專案中加入Joda-Time套件 |
下面就開始示範:
先把Joda-Time套件加入到之前的專案中,這裡用的是joda-time-SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.jar,在views資料夾下新增一個formattest.jsp視圖,內容如下:
nbsp;html PUBLIC "-//WSpringMVC學習系列(7) 之 格式化顯示的圖文詳解C//DTD HTML SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.0SpringMVC學習系列(7) 之 格式化顯示的圖文詳解 Transitional//EN" "http://www.wSpringMVC學習系列(7) 之 格式化顯示的圖文詳解.org/TR/htmlSpringMVC學習系列(7) 之 格式化顯示的圖文詳解/loose.dtd"><meta><title>Insert title here</title>
money:<br>${contentModel.money}<br> date:<br>${contentModel.date}<br>
SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.首先我們直接用Formatter來做演示,在com.demo.web.models套件中加入FormatModel.java內容如下:
package com.demo.web.models;public class FormatModel{ private String money; private String date; public String getMoney(){ return money; } public String getDate(){ return date; } public void setMoney(String money){ this.money=money; } public void setDate(String date){ this.date=date; } }
在com.demo.web.controllers套件中加入FormatController.java內容如下:
package com.demo.web.controllers;import java.math.RoundingMode;import java.util.Date;import java.util.Locale;import org.springframework.context.iSpringMVC學習系列(7) 之 格式化顯示的圖文詳解8n.LocaleContextHolder;import org.springframework.format.datetime.DateFormatter;import org.springframework.format.number.CurrencyFormatter;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.demo.web.models.FormatModel; @Controller @RequestMapping(value = "/format")public class FormatController { @RequestMapping(value="/test", method = {RequestMethod.GET}) public String test(Model model) throws NoSuchFieldException, SecurityException{ if(!model.containsAttribute("contentModel")){ FormatModel formatModel=new FormatModel(); CurrencyFormatter currencyFormatter = new CurrencyFormatter(); currencyFormatter.setFractionDigits(SpringMVC學習系列(7) 之 格式化顯示的圖文詳解);//保留SpringMVC學習系列(7) 之 格式化顯示的圖文詳解位小数 currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);//向(距离)最近的一边舍入,如果两边(的距离)是相等的则向上舍入(四舍五入) DateFormatter dateFormatter=new DateFormatter(); dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss"); Locale locale=LocaleContextHolder.getLocale(); formatModel.setMoney(currencyFormatter.print(SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解5.678, locale)); formatModel.setDate(dateFormatter.print(new Date(), locale)); model.addAttribute("contentModel", formatModel); } return "formattest"; } }
執行測試:
更改瀏覽器首選語言:
#刷新頁面:
SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.這次用DefaultFormattingConversionService來做演示,把FormatController.java改為如下內容:
package com.demo.web.controllers;import java.math.RoundingMode;import java.util.Date;import org.springframework.format.datetime.DateFormatter;import org.springframework.format.number.CurrencyFormatter;import org.springframework.format.support.DefaultFormattingConversionService;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.demo.web.models.FormatModel; @Controller @RequestMapping(value = "/format")public class FormatController { @RequestMapping(value="/test", method = {RequestMethod.GET}) public String test(Model model) throws NoSuchFieldException, SecurityException{ if(!model.containsAttribute("contentModel")){ FormatModel formatModel=new FormatModel(); CurrencyFormatter currencyFormatter = new CurrencyFormatter(); currencyFormatter.setFractionDigits(SpringMVC學習系列(7) 之 格式化顯示的圖文詳解);//保留SpringMVC學習系列(7) 之 格式化顯示的圖文詳解位小数 currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);//向(距离)最近的一边舍入,如果两边(的距离)是相等的则向上舍入(四舍五入) DateFormatter dateFormatter=new DateFormatter(); dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss"); DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); conversionService.addFormatter(currencyFormatter); conversionService.addFormatter(dateFormatter); formatModel.setMoney(conversionService.convert(SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解5.678, String.class)); formatModel.setDate(conversionService.convert(new Date(), String.class)); model.addAttribute("contentModel", formatModel); } return "formattest"; } }
這次沒有了Locale locale=LocaleContextHolder.getLocale( );再次執行測試並更改語言後刷新,可以看到與第一種方法截圖相同的效果,說明DefaultFormattingConversionService會自動根據瀏覽器請求的資訊返回相應的格式。
SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.估計有人會覺得,啊…我只是想要格式化顯示而已,還要這麼麻煩,寫程式碼一個欄位一個欄位的轉換? ? ?別急,上面只是對內建的格式化轉換器做一下演示,實際專案中肯定不會這麼用的,下面就介紹一下基於註解的格式化。首先把FormatModel.java改為如下內容:
package com.demo.web.models;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 FormatModel{ @NumberFormat(style=Style.CURRENCY) private double money; @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date; public double getMoney(){ return money; } public Date getDate(){ return date; } public void setMoney(double money){ this.money=money; } public void setDate(Date date){ this.date=date; } }
注意:這裡的money和date不再是String類型,而是它們自己原本的類型。
把FormatController.java改為如下內容:
package com.demo.web.controllers;import java.util.Date;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.demo.web.models.FormatModel; @Controller @RequestMapping(value = "/format")public class FormatController { @RequestMapping(value="/test", method = {RequestMethod.GET}) public String test(Model model) throws NoSuchFieldException, SecurityException{ if(!model.containsAttribute("contentModel")){ FormatModel formatModel=new FormatModel(); formatModel.setMoney(SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解5.678); formatModel.setDate(new Date()); model.addAttribute("contentModel", formatModel); } return "formattest"; } }
#注意:這裡程式碼裡面只有賦值已經沒有格式化的內容了。
更改視圖formattest.jsp的內容如下:
nbsp;html PUBLIC "-//WSpringMVC學習系列(7) 之 格式化顯示的圖文詳解C//DTD HTML SpringMVC學習系列(7) 之 格式化顯示的圖文詳解.0SpringMVC學習系列(7) 之 格式化顯示的圖文詳解 Transitional//EN" "http://www.wSpringMVC學習系列(7) 之 格式化顯示的圖文詳解.org/TR/htmlSpringMVC學習系列(7) 之 格式化顯示的圖文詳解/loose.dtd">
<meta><title>Insert title here</title> money:<br> <eval></eval><br> date:<br> <eval></eval><br>
注意:這裡需要加入引用@taglib prefix="spring" uri="#http://www.php.cn/" %>,並用spring:eval綁定要顯示的值。
執行測試更改瀏覽器語言然後刷新頁面依然可以看到以第一種方法截圖相同的效果,證明註解有效。
格式化顯示的內容到此結束。
註: 之前沒注意前SpringMVC學習系列(7) 之 格式化顯示的圖文詳解SpringMVC學習系列(7) 之 格式化顯示的圖文詳解篇的範例程式碼,不知道為什麼當時打包上傳上去的是沒有.project專案檔的,導致下載後不能直接匯入eclipse運行,虛擬機又被我刪掉了,這些範例程式碼也沒有備份,但是程式碼檔案還在的,所以可以新建一個Dynamic Web Project把對應的設定檔和controller還有view導入就可以了,給大家造成的不便說聲抱歉。
以上就是SpringMVC學習系列(7) 之格式化顯示的圖文詳解的內容,更多相關內容請關注PHP中文網( www.php.cn)!