Spring Boot框架開發(fā)Web項(xiàng)目之七 日期的使用和輸出日志

本系列文章主要索引詳情 點(diǎn)擊查看


Java8之前,我們一般都是使用的java.util.Data API來定義日期和時(shí)間题禀,而Java8為我們提供了一個(gè)新的Java data-time API(JSR 310)缀蹄。這個(gè)新的API比老的API要好的多,因?yàn)樗鼘?duì)人類的日期進(jìn)行了細(xì)致的區(qū)分,并使用了流暢的API和不可變的數(shù)據(jù)結(jié)構(gòu)猿妈。

在本實(shí)例中肢藐,我們將使用新API中的LocalDate類故河,LocalDate類就是一個(gè)簡(jiǎn)單的日期,沒有與其向關(guān)聯(lián)的時(shí)間吆豹。這與老API中的LocalTime是有區(qū)別的鱼的,后者代表了一天中的某個(gè)時(shí)間,而LocalDateTime能包含日期和時(shí)間兩部分信息痘煤,或者是ZonedDateTime凑阶,它還包含了一個(gè)時(shí)區(qū)。

了解 Java 8 data-time API更多信息:
????http://docs.oracle.com/javase/tutorial/datetime/TOC.html

工具

IntelliJ IDEA 16
JDK 1.8
Maven 3.5
Tomcat 1.8

使用LocalDate日期

1衷快、修改前一篇中我們新建的DTO類ProfileForm,將其中birthDate字段的類型修改為L(zhǎng)ocalDate

package com.example.dto;


import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;

import java.time.LocalDate;

public class ProfileForm {
    private String twitterHandle;
    private String email;
    private LocalDate birthDate;

    public String getTwitterHandle() {
        return twitterHandle;
    }

    public void setTwitterHandle(String twitterHandle) {
        this.twitterHandle = twitterHandle;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }

    @Override
    public String toString() {
        return "ProfileForm{" +
                "twitterHandle='" + twitterHandle + '\'' +
                ", email='" + email + '\'' +
                ", birthDate='" + birthDate + '\'' +
                '}';
    }
}

2宙橱、啟動(dòng)項(xiàng)目,訪問http://localhost:8081/profile,錄入表單數(shù)據(jù)蘸拔,并提交师郑,此時(shí)如果我們使用一個(gè)日期值(如2017/08/01),它其實(shí)不能運(yùn)行调窍,會(huì)提示一個(gè)400錯(cuò)誤

3宝冕、我們需要調(diào)試應(yīng)用來了解發(fā)生了什么錯(cuò)誤,我們可以通過輸出日志邓萨,來定位問題猬仁。我們只需要在application.properties中添加如下這行代碼:

logging.level.org.springframework.web=DEBUG

添加上述配置之后,我們就可以在控制臺(tái)中看到Spring Web所產(chǎn)生的調(diào)試信息先誉。如果想要將日志輸出到文件中湿刽,則只需要指定日志文件路徑即可:

logging.file=D:/IDEA/log/log.log

4、此時(shí)我們?cè)俅翁峤槐韱魏侄偃罩局袝?huì)看到如下的錯(cuò)誤:

Field error in object 'profileForm' on field 'birthDate': rejected value [2017-08-01]; codes [typeMismatch.profileForm.birthDate,typeMismatch.birthDate,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [profileForm.birthDate,birthDate]; arguments []; default message [birthDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'birthDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.LocalDate] for value '2017-08-01'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2017-08-01]]

此時(shí)我們需要一個(gè)Formatter诈闺,來對(duì)我們的日期進(jìn)行格式化。
在Spring 中铃芦,F(xiàn)ormatter類能夠用來print和parse對(duì)象雅镊。它可以將一個(gè)String轉(zhuǎn)碼為值,也可而已將一個(gè)值輸出為String刃滓。

5仁烹、在dto包的同級(jí)新建一個(gè)date包,然后創(chuàng)建一個(gè)簡(jiǎn)單的Formatter咧虎,命名為L(zhǎng)ocalDateFormatter卓缰,實(shí)現(xiàn)Formatter,并重寫print和parse方法:

package com.example.date;

import org.springframework.format.Formatter;

import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class LocalDateFormatter implements Formatter<LocalDate> {

    public static final String US_PATTERN = "yyyy-MM-dd";
    public static final String NORMAL_PATTERN="yyyy-MM-dd";

    @Override
    public String print(LocalDate localDate, Locale locale) {
        return DateTimeFormatter.ofPattern(getPattern(locale)).format(localDate);
    }

    @Override
    public LocalDate parse(String s, Locale locale) throws ParseException {
        return LocalDate.parse(s,DateTimeFormatter.ofPattern(getPattern(locale)));
    }

    /**
     * 獲取用戶所處地域的日期格式
     * @param locale
     * @return
     */
    public static String getPattern(Locale locale){
        return isUnitedStates(locale)?US_PATTERN : NORMAL_PATTERN;
    }

    private static boolean isUnitedStates(Locale locale){
        return Locale.US.getCountry().equals(locale.getCountry());
    }
}

這個(gè)類能夠根據(jù)用戶所在地域來解析日期。

6征唬、在date包的同級(jí)新建config包捌显,并創(chuàng)建名為WebConfiguration的新類:

package com.example.config;

import com.example.date.LocalDateFormatter;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.time.LocalDate;

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter{

    @Override
    public void addFormatters(FormatterRegistry registry) {
       registry.addFormatterForFieldType(LocalDate.class,new LocalDateFormatter());
    }
}

這個(gè)類擴(kuò)展了WebMvcConfigurerAdapter,這是對(duì)Spring MVC進(jìn)行自定義配置的一個(gè)很便利的類总寒,它提供了很多的擴(kuò)展點(diǎn)扶歪,我們可以重寫如addFormatters()這樣的方法來訪問這些擴(kuò)展點(diǎn)。

@Configuration注解:標(biāo)注在類上摄闸,相當(dāng)于把該類作為spring的xml配置文件中的<beans>善镰,作用為:配置spring容器(應(yīng)用上下文)。

7年枕、此時(shí)我們?cè)偬峤槐韱蔚脑掛牌郏筒粫?huì)產(chǎn)生錯(cuò)誤了,除非我們不按照正確的格式來進(jìn)行輸入画切。

8、但是現(xiàn)在我們并不知道需要以什么樣的格式來輸入日期囱怕,我們可以在表單上添加這個(gè)信息霍弹。
在ProfileController中,添加一個(gè)dateFormat屬性:

    @ModelAttribute("dataFormat")
    public String localeFormat(Locale locale){
        return LocalDateFormatter.getPattern(locale);
    }

@ModelAttribute注解允許我們暴露一個(gè)屬性給Web頁面娃弓,完全類似于我們之前使用的mode.addAttribute()方法典格。
然后,我們可以在頁面上使用這個(gè)信息了台丛,只需要在日期輸入域中添加一個(gè)占位符(th:placeholder)即可:

            <div class="row">
                <div class="input-field col s6">
                    <input id="birthDate" type="text" th:field="${profileForm.birthDate}" th:placeholder="${dateFormat}"/>
                    <label for="birthDate">Birth Date</label>
                </div>
            </div>

現(xiàn)在再進(jìn)入頁面耍缴,我們就可以得到日期格式的提示信息了,并且此提示信息是根據(jù)我們自定義的Formatter中設(shè)置的地域日期格式和用戶所處地域決定挽霉。

上一篇Spring Boot框架開發(fā)Web項(xiàng)目之六 表單數(shù)據(jù)提交

下一篇Spring Boot框架開發(fā)Web項(xiàng)目之八 表單校驗(yàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末防嗡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侠坎,更是在濱河造成了極大的恐慌蚁趁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实胸,死亡現(xiàn)場(chǎng)離奇詭異他嫡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庐完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钢属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人门躯,你說我怎么就攤上這事淆党。” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宁否,是天一觀的道長(zhǎng)窒升。 經(jīng)常有香客問我,道長(zhǎng)慕匠,這世上最難降的妖魔是什么饱须? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮台谊,結(jié)果婚禮上蓉媳,老公的妹妹穿的比我還像新娘。我一直安慰自己锅铅,他們只是感情好酪呻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盐须,像睡著了一般玩荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贼邓,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天阶冈,我揣著相機(jī)與錄音,去河邊找鬼塑径。 笑死女坑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的统舀。 我是一名探鬼主播匆骗,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼誉简!你這毒婦竟也來了碉就?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤闷串,失蹤者是張志新(化名)和其女友劉穎铝噩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿克,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骏庸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年叮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片具被。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖只损,靈堂內(nèi)的尸體忽然破棺而出一姿,到底是詐尸還是另有隱情七咧,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布叮叹,位于F島的核電站艾栋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛉顽。R本人自食惡果不足惜蝗砾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望携冤。 院中可真熱鬧悼粮,春花似錦、人聲如沸曾棕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘地。三九已至申尤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衙耕,已是汗流浹背昧穿。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臭杰,地道東北人粤咪。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓谚中,卻偏偏與公主長(zhǎng)得像渴杆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宪塔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理磁奖,服務(wù)發(fā)現(xiàn),斷路器某筐,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評(píng)論 25 707
  • 本系列文章主要索引詳情 點(diǎn)擊查看 通常情況下比搭,我們都不希望用戶輸入非法的信息,這樣的話南誊,我們就需要對(duì)表單添加一些校...
    開心跳蚤閱讀 1,480評(píng)論 0 4
  • 四十多年前是母親把我?guī)У竭@個(gè)世界抄囚,陪我長(zhǎng)大∶股模現(xiàn)在,我想陪母親看看這個(gè)世界之外的世界幔托,陪著母親慢慢變老穴亏。 ...
    翠竹婀娜閱讀 1,242評(píng)論 49 45