国际化_通过超链接切换Locale
国际化概述
- 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。
- 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver),找到后使用它获取请求所对应的本地化类型信息。
- SpringMVC 还允许装配一个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
- SessionLocaleResolver & LocaleChangeInterceptor 工作原理
本地化解析器和本地化拦截器
- AcceptHeaderLocaleResolver:根据HTTP请求头的Accept-Language参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器。
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:从请求参数中获取本次请求对应的本地化类型。
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
想要了解跟多关于Java培训课程内容