天天看點

LocaleResolver講解

SpringMVC國際化繞不開的話題是LocaleResolver。第一次接觸LocaleResolver時,對這個類的作用不是很清楚。是以,這次特别寫篇文章,記錄下學習心得。

SpringMVC預設提供了四種實作了接口的類:CookieLocaleResolver, AcceptHeaderLocalResolver,FixdLocaleResolver,SessionLocaleResolver。結構圖如下所示:

LocaleResolver講解

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);