SpringMVC國際化繞不開的話題是LocaleResolver。第一次接觸LocaleResolver時,對這個類的作用不是很清楚。是以,這次特别寫篇文章,記錄下學習心得。
SpringMVC預設提供了四種實作了接口的類:CookieLocaleResolver, AcceptHeaderLocalResolver,FixdLocaleResolver,SessionLocaleResolver。結構圖如下所示:
LocaleResolver的主要作用: 解析Request中的語言标志參數或者head中的Accept-Language參數, 并将解析後的參數儲存到指定的域中。
LocaleResolver一般配合LocaleChangeInterceptor攔截器一起使用。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(this.paramName);
if (newLocale != null) {
**LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);**
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
**localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));**
}
// Proceed in any case.
return true;
}
在LocaleChangeInterceptor的代碼中, 通過
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request)
擷取系統中執行個體化的解析器,然後調用setLocale方法儲存locale對象。
在開發過程中, 擷取Locale對象, 一般通過
LocaleContextHolder.getLocale()
或者
Locale locale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
this.localeResolver.resolveLocale(request);
RequestContextUtils.getLocale(request);