微服務架構Day04-SpringBoot之web開發
阿新 • • 發佈:2021-02-14
# 引入專案
- 把**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
引數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