SpringMVC第四天
Spring MVC 使用快閃記憶體屬性
Flash屬性(flash attributes)提供了一個請求為另一個請求儲存有用屬性的方法。
這在重定向的時候最常使用,比如常見的 POST/REDIRECT/GET 模式。
Flash屬性會在重定向前被暫時地儲存起來(通常是儲存在session中),
重定向後會重新被下一個請求取用並立即從原儲存地移除。
為支援flash屬性,Spring MVC提供了兩個抽象。
FlashMap被用來儲存flash屬性,而用FlashMapManager來儲存、取回、管理FlashMap的例項。
對flash屬性的支援預設是啟用的,並不需要顯式宣告,
不過沒用到它時它絕不會主動地去建立HTTP會話(session)。
對於每個請求,框架都會“傳進”一個FlashMap,裡面儲存了從上個請求(如果有)儲存下來的屬性;
同時,每個請求也會“輸出”一個FlashMap,裡面儲存了要給下個請求使用的屬性。
兩個FlashMap例項在Spring MVC應用中的任何地點都可以通過RequestContextUtils工具類的靜態方法取得。
控制器通常不需要直接接觸FlashMap。
一般是通過@RequestMapping方法去接受一個RedirectAttributes型別的引數,
然後直接地往其中新增flash屬性。
通過RedirectAttributes物件新增進去的flash屬性會自動被填充到請求的“輸出”FlashMap物件中去。
類似地,重定向後“傳進”的FlashMap屬性也會自動被新增到服務重定向URL的控制器引數Model中去。
·····
public interface RedirectAttributes extends Model {
@Override
RedirectAttributes addAttribute(String attributeName, @Nullable Object attributeValue);
@Override
RedirectAttributes addAttribute(Object attributeValue);
@Override
RedirectAttributes addAllAttributes(Collection<?> attributeValues);
@Override
RedirectAttributes mergeAttributes(Map<String, ?> attributes);
/**
* Add the given flash attribute.
* @param attributeName the attribute name; never {@code null}
* @param attributeValue the attribute value; may be {@code null}
*/
RedirectAttributes addFlashAttribute(String attributeName, @Nullable Object attributeValue);
/**
* Add the given flash storage using a
* {@link org.springframework.core.Conventions#getVariableName generated name}.
* @param attributeValue the flash attribute value; never {@code null}
*/
RedirectAttributes addFlashAttribute(Object attributeValue);
/**
* Return the attributes candidate for flash storage or an empty Map.
*/
Map<String, ?> getFlashAttributes();
@RequiresPermissions("lifeCycle:" + PermissionConstants.ADD_PERMISSION)
@RequestMapping(value = "EquipmentSave")
public String EquipmentSave(DdpBase ddpBase, RedirectAttributes redirectAttributes) {
equipmentBasicService.cascadeDynamicsSaveDdpBaseAndDdpNameplate(ddpBase, ddpBase.getDdpNameplate());
String id = ddpBase.getDigitalPowerPlantId();
addMessage(redirectAttributes, "flash--應用over");
return redirect("redirect:listEquipment?digitalPowerPlantId=" + id, redirectAttributes);
}
匹配請求所使用的flash屬性:
flash屬性的概念在其他許多的Web框架中也存在,
並且實踐證明有時可能會導致併發上的問題。這是因為從定義上講,
flash屬性儲存的時間是到下個請求接收到之前。問題在於,“下一個”請求不一定剛好就是你要重定向到的那個請求,
它有可能是其他的非同步請求(比如polling請求或者資源請求等)。這會導致flash屬性在到達真正的目標請求前就被移除了。
為了減少這個問題發生的可能性,
重定向檢視RedirectView會自動為一個FlashMap例項記錄其目標重定向URL的路徑和查詢引數。
然後,預設的FlashMapManager會在為請求查詢其該“傳進”的FlashMap時,匹配這些資訊。
這並不能完全解決重定向的併發問題,但極大程度地減少了這種可能性,
因為它可以從重定向URL已有的資訊中來做匹配。
因此,一般只有在重定向的場景下,我們才推薦使用flash屬性。
Spring MVC 構造URI
1 在Spring MVC中,使用了UriComponentsBuilder和UriComponents兩個類來提供URI的加密解密。
UriComponents uriComponents = UriComponentsBuilder.fromUriString(
“http://example.com/hotels/{hotel}/bookings/{booking}”).build();
URI uri = uriComponents.expand(“42”, “21”).encode().toUri();
UriComponents是不可變物件。因此expand()與encode()操作在必要的時候會返回一個新的例項。
2 也可以使用一個URI元件例項物件來實現URI的填充與加密:
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.scheme(“http”).host(“example.com”).path("/hotels/{hotel}/bookings/{booking}").build()
.expand(“42”, “21”)
.encode();
3 在servlet開發中,可以使用ServletUriComponentsBuilder類 提供一個靜態工廠方法 可以從請求獲取URI
ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromContextPath(request)
.path("/accounts").build()
4 如果DispatchServlet是通過名字請求對映的,還可以通過DispatchServlet獲取請求
ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromServletMapping(request)
.path("/accounts").build(),也是基於父類Servlet的靜態工廠方法
Spring MVC 提供地區資訊
DispatcherServlet為你提供了自動使用使用者的地區資訊來解析訊息的能力。而這,是通過LocaleResolver物件來完成的。
一個請求進入處理時,DispatcherServlet會查詢一個地區解析器。如果找到,就嘗試使用它來設定地區相關的資訊。
通過呼叫RequestContext.getLocale()都能取到地區解析器所解析到的地區資訊。
此外,如果你需要自動解析地區資訊,你可以在處理器對映前加一個攔截器
Spring MVC 獲取時區資訊
除了獲取客戶端的地區資訊外,有時他們所在的時區資訊也非常有用。
LocaleContextResolver介面為LocaleResolver提供了擴充點,
允許解析器在LocaleContext中提供更多的資訊,這裡面就可以包含時區資訊。
如果使用者的時區資訊能被解析到,那麼你總可以通過RequestContext.getTimeZone()方法獲得。
時區資訊會自動被SpringConversionService下注冊的日期/時間轉換器Converter及格式化物件Formatter所使用。
SpringMVC Accept請求頭解析器
AcceptHeaderLocaleResolver解析器會檢查客戶端(比如,瀏覽器,等)
所傳送的請求中是否攜帶accept-language請求頭。通常,該請求頭欄位中包含了客戶端作業系統的地區資訊。
不過請注意,該解析器不支援時區資訊的解析。()
SpringMVC Cookie解析器
CookieLocaleResolver解析會檢查客戶端是否有Cookie,裡面可能存放了地區Locale或時區TimeZone資訊。
如果檢查到相應的值,解析器就使用它們。通過該解析器的屬性,你可以指定cookie的名稱和其最大的存活時間。
定義一個CookieLocaleResolver:
CookieLocaleResolver的屬性
(cookie名)cookieName: 預設值classname + LOCALE
cookieMaxAge:預設值 Integer.MAX_INT
(cookie被儲存在客戶端的最長時間。如果該值為-1,
那麼cookie將不會被持久化,在客戶端瀏覽器關閉之後就失效了)
cookiePath:存放位置 預設為/
SpringMVC Session解析器
SessionLocaleResolver允許你從session中取得可能與使用者請求相關聯的地區Locale和時區TimeZone資訊。
與CookieLocaleResolver不同,這種存取策略僅將Servlet容器的HttpSession中相關的地區資訊存取到本地。
因此,這些設定僅會為該會話(session)臨時儲存,session結束後,這些設定就會失效。
但該解析器與其他外部session管理機制,比如Spring的Session專案等,並沒有直接聯絡。
該SessionLocaleResolver僅會簡單地從與當前請求HttpServletRequest相關的HttpSession物件中,
取出對應的屬性,並修改其值,僅此而已
SpringMVC地區更改攔截器
你可以在處理器對映前新增一個LocaleChangeInterceptor攔截器來更改地區資訊。
它能檢測請求中的引數,並根據其值相應地更新地區資訊。
它通過呼叫LocaleResolver的setLocale()方法來更改地區。
.view路徑並且攜帶了siteLanguage引數的資源請求更改地區。
一個URL為http://www.sf.net/home.view?siteLanguage=nl的請求將會將站點語言更改為荷蘭語。
/**/.view=someController
相關文章
- 第四天
- sql第四天SQL
- css第四天CSS
- grep 第四天
- 暑假第四天
- 第四天工作
- 日誌第四天
- 第四天隨筆
- 衝刺第四天
- Scurm衝刺第四天
- python爬蟲第四天Python爬蟲
- 第四天-程式碼練習
- Python第四天學習Python
- MySQL第四天——集合運算MySql
- JAVA SE 學習第四天Java
- 團隊專案第四天
- 第七週第四天7.4
- 第六週第四天6.4
- 【SpringMVC】SpringMVC搭建框架SpringMVC框架
- java學習第四天7/9Java
- Java學習筆記 第四天Java筆記
- 團隊作業sprint第四天
- 第十週第四天10.4
- SpringMvc - SpringMvc的執行流程SpringMVC
- [SpringMVC]SpringMVC
- SpringMVCSpringMVC
- 深入研究 Laravel 原始碼第四天Laravel原始碼
- 淘淘商城專案 第四天總結
- python學習第四天(函式)Python函式
- SpringMVC原始碼分析1:SpringMVC概述SpringMVC原始碼
- SpringMVC-01 什麼是SpringMVCSpringMVC
- SpringMVC---IDEA 搭建SpringMVC工程SpringMVCIdea
- SpringMVC-08-SpringMVC層編寫SpringMVC
- springMVC學習筆記(一)-----springMVC原理SpringMVC筆記
- Android基礎第四天易忘部分Android
- SpringMVC 流程SpringMVC
- SpringMVC IOCSpringMVC
- SpringMVC——HelloWorldSpringMVC