1. 程式人生 > >微服務架構Day04-SpringBoot之web開發

微服務架構Day04-SpringBoot之web開發

# 引入專案 - 把**html**頁面放在模板引擎資料夾**templates**下,這樣能使用模板引擎的功能。 # 登入頁面國際化 - **國際化**:編寫國際化配置檔案 1.編寫國際化配置檔案,抽取頁面需要顯示的國際化訊息 2.SpringBoot自動配置好了管理國際化資原始檔的元件 ```java @Bean @ConfigurationProperties( prefix = "spring.messages" ) public MessageSourceProperties messageSourceProperties() { return new MessageSourceProperties(); } @Bean public MessageSource messageSource(MessageSourceProperties properties) { /* * ResourceBoundleMessageSource extends AbstractResourceBasedMessageSource implements BeanClassLoaderAware * 該實現類允許使用者通過beanName指定一個資源名:包括類路徑的全限定資源名 * 或者通過beanName指定一組資源名 */ ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); if (StringUtils.hasText(properties.getBasename())) { /* * setBasenames 設定國際化資原始檔去掉語言國家程式碼的基礎名, * 國際化資原始檔可以直接放在類路徑下叫 messages.properties, * 也可以在配置檔案中指定基礎名 spring.messages.basename */ String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages"); messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename()))); } if (properties.getEncoding() != null) { messageSource.setDefaultEncoding(properties.getEncoding().name()); } /* * 如果沒有找到特定語言環境的檔案,是否返回系統區域設定 * 預設為true * 如果是關閉的,將會使用唯一的預設檔案:比如baseName的“message”的 message.properties */ messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale()); Duration cacheDuration = properties.getCacheDuration(); if (cacheDuration != null) { messageSource.setCacheMillis(cacheDuration.toMillis()); } /* * 設定是否始終應用訊息格式元件,解析沒有引數的訊息 * 比如:MessageFormat希望單引號被轉義為""", * 如果訊息文字全部使用這樣的轉義編寫,即使沒有定義引數佔位符,也需要將此標誌設為true * 否則,只有具有實際意義的引數訊息文字才會用MessageFormat的轉義來編寫 */ messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat()); /* * 是否使用訊息程式碼作為預設訊息,而不是丟擲NoSuchMessageException異常, * 適用於開發和除錯,預設值為false */ messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage()); return messageSource; } ``` > **MessageSource解析:** > - MessageSource架構圖: > ![在這裡插入圖片描述](https://upload-images.jianshu.io/upload_images/25745476-654a000246db042d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > - **MessageSource:** 抽象化的訊息介面 > - **HierarchicalMessageSource:** 分層的訊息源介面,可獲取父訊息源 > - **MessageSourceSupport:** 訊息源解析的抽象類,通過指定"訊息格式化元件MessageFormat"格式化訊息 > - **DelegatingMessageSource:** 訊息源解析委派類. 使用者未指定訊息源解析類時,SpringContext預設使用這個類. 功能比較簡單:將字串和引數陣列格式化為一個訊息字串 > - **AbstractMessageSource:** 支援"配置檔案"的方式國際化資源的抽象類. 內部提供一個與區域設定無關的公共訊息配置檔案,訊息程式碼為關鍵字 > - **StaticMessageSource:** 主要用於程式測試. 允許通過程式設計的方式提供國際化資訊 > - **ResourceBundleMessageSource:** 該實現類允許使用者通過beanName指定一個資源名,包括類的全限定資源名. 或者通過beanName指定一組資源名. 不同的區域獲取載入不同資原始檔,以達到國際化的目的 > - **ReloadableResourceBundleMessageSource:** > - ReloadableResourceBundleMessageSource和ResourceBundleMessageSource的區別: > - **載入資源型別及方式:** > - ReloadResourceBundleMessageSource依託**Spring**的**ResourceLoader**載入Resource資源,功能更加強大,支援 **.class**和 **.properties**檔案 > - ResourceBundleMessageSource依託**JDK**自帶的**ResourceBundle**載入資源,支援絕對路徑和工程路徑,支援 **.class**和 **.properties**檔案 > - **快取時間:** > - ReloadResourceBundleMessageSource每次載入都會記錄每個資源載入的時間點,在快取資源過期後會再次比較檔案的修改時間,如果不變則不需要載入,同時重新整理本次載入時間點 > - ResourceBundleMessageSource主要利用**ResourceBundle.Control**實現簡單的自動載入 > - **編碼方式:** > - ReloadResourceBundleMessageSource不僅可以指定統一的預設編碼方式,也同時支援為每個檔案單獨制定編碼方式 > > **MessageSource介面:** > | 方法| 描述 | > |:--|:--| > | String getMessage(String code, Object[] args, String defaultMessge, Locale locale) | 獲取訊息,如果沒有找到訊息,就返回預設值 | > |String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException|獲取訊息,如果無法找到訊息,則視為錯誤| > |String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException|嘗試使用傳入的{@code MessageSourceResolvable}引數中包含的所有屬性來解析訊息. 必須在此方法上丟擲{@code NoSuchMessageException}, 因為在呼叫此方法時,無法確定可解析的{@code defaultMessage}屬性是否為空| > **MessageSourceResolvable解析訊息要素的包裝介面和類:** > | 方法 | 描述 | > |:--|:--| > | String[] getCode() | 返回用於解決此訊息的程式碼,按照這些程式碼應該嘗試的順序. 因此,最後的一個程式碼將是預設程式碼 | > |Object[] getArguments()|返回要用於解析此訊息的引數陣列| > |String getDefaultMessage()|返回要用於解析此訊息的預設訊息| > **HierarchicalMessageSource訊息源分層介面:** > | 方法 | 描述 | > |:--|:--| > | void setParentMessageSource(MessageSource parent) |設定將用於解決次物件無法解析的訊息的父級
引數parent是將用於解析此物件無法解析的訊息的父MessageSource.可能是{@code null},在這種情況下不需要解決| > |MessageSource getParentMessageSource()|返回當前MessageSource的父級,否則返回{@Code null}| > **MessageSourceSupport用於支援訊息源解析的抽象類:** > | 方法 | 描述 | > |:--|:--| > |void setAlwaysUseMessageFormat(boolean alwaysUseMessageFormat) | 設定是否始終應用訊息格式元件,解析沒有引數的訊息
比如: MessageFromat希望單引號轉義為"""
如果訊息文字全部用這樣的轉義編寫,即使沒有定義引數佔位符,只需要將此標誌設為"true"
否則,只有具有實際引數的訊息文字才會用MessageFormat轉義類編寫 | > |boolean isAlwaysUseMessageFormat()|返回是否應用訊息格式元件,解析沒有引數的訊息| > |String renderDefaultMessage(String defaultMessage, Object[] args, Locale locale)|渲染給定的預設訊息字串| > |String formatMessage(String msg, Object[] args, Locale locale)|渲染給定的訊息字串| > |MessageFormat createMessageFormat(String msg, Locale locale)|為給定的訊息和區域設定建立一個MessageFormat| > **DelegatingMessageSource訊息源解析委派類:** > | 方法 | 描述 | > |:--|:--| > |String getMessage(String code, Object[] args, String defaultMessage, Locale locale)|解析訊息
父訊息解析源不為null時,則採用父訊息源解析訊息.否則使用自身訊息源解析訊息| > |String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException|解析訊息
如果父訊息解析源不為null時,則採用父訊息源解析訊息,否則丟擲異常| > |String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException|解析訊息
如果父訊息解析源不為null時,則採用父訊息源解析訊息,否則使用自身訊息源解析訊息| > **AbstractMessageSourc抽象類Spring中支援配置檔案的方式國際化資源的抽象類:** > | 方法 | 描述 | > |:--|:--| > | void setUseCodeAsDafaultMessage(boolean useCodeAsDefaultMessage) | 設定是否使用訊息程式碼作為預設訊息,而不是丟擲NoSuchMessageException.預設為false| > |String getMessageInternal(String code, Object[] args, Locale locale)|將給定的程式碼和引數解析為給定的區域中設定的訊息,如果沒有找到則返回{@code null}| > |String getMessageFromPArent(String code, Object[] args, Locale locale)|如果父MessageSource中存在訊息則嘗試從父MessageSource檢索給定的訊息| > |String getDefaultMessage(String code)|返回預設訊息| > |Object[] resolveArgements(Object[] args, Locale locale)|通過給定的引數陣列搜尋,找到MessageSourceResolve物件並解析| > |String resolveCodeWithoutArguments(String code, Locale locale)|解析不帶引數的訊息| > **StaticMessageSource是AbstractMessageSource允許通過程式設計的方式提供國際化資訊:** > | 方法 | 描述 | > |:--|:--| > | void addMessage(String code, Locale locale, String msg) | 將給定的訊息與給定的程式碼相關聯 | > |void addMes