国际化_通过超链接切换Locale

国际化概述

  • 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。
  • 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver),找到后使用它获取请求所对应的本地化类型信息。
  • SpringMVC 还允许装配一个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
  • SessionLocaleResolver & LocaleChangeInterceptor 工作原理

 

国际化_通过超链接切换Locale

本地化解析器和本地化拦截器

  • AcceptHeaderLocaleResolver根据HTTP请求头的Accept-Language参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器。

 

国际化_通过超链接切换Locale

 

public class AcceptHeaderLocaleResolver implements LocaleResolver {

@Override

public Locale resolveLocale(HttpServletRequest request) {

return request.getLocale();

}

@Override

public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

throw new UnsupportedOperationException(

“Cannot change HTTP accept header – use a different locale resolution strategy”);

}

}

  • CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型
  • SessionLocaleResolver:根据 Session 中特定的属性确定本地化类型
  • LocaleChangeInterceptor:从请求参数中获取本次请求对应的本地化类型。

国际化_通过超链接切换Locale

1实验代码:实现中英文语言切换

  • 配置SessionLocaleResolver替换AcceptHeaderLocaleResolver完成中英文切换

<!– 配置SessionLocaleResolver对象

id必须是”localeResolver”,否则,会报错误:

<bean id=”sessionLocaleResolver” class=”org.springframework.web.servlet.i18n.SessionLocaleResolver”></bean>

–>

<bean id=”localeResolver” class=”org.springframework.web.servlet.i18n.SessionLocaleResolver”></bean>

HTTP Status 500 –

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.UnsupportedOperationException: Cannot change HTTP accept header – use a different locale resolution strategy
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:943)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)

root cause

java.lang.UnsupportedOperationException: Cannot change HTTP accept header – use a different locale resolution strategy
……

  • 配置

<!– 配置LocaleChangeInterceptor拦截器 –>

<mvc:interceptors>

<bean id=”localeChangeInterceptor”

class=”org.springframework.web.servlet.i18n.LocaleChangeInterceptor”></bean>

</mvc:interceptors>

  • 页面链接

/views/i18n.jsp 增加页面链接

<!– 切换语言 –>

<a href=”testI18N?locale=zh_CN”>中文</a> | <a href=”testI18N?locale=en_US”>英语</a>

2切换语言的原理

切换语言的参数名称必须:locale

国际化_通过超链接切换Locale

 

想要了解跟多关于Java培训课程内容