Spring MVC之LocaleResolver详解
对于LocaleResolver,其主要作用在于根据不同的用户区域展示不同的视图,而用户的区域也称为Locale,该信息是可以由前端直接获取的。通过这种方式,可以实现一种国际化的目的,比如针对美国用户可以提供一个视图,而针对中国用户则可以提供另一个视图。本文主要讲解如果使用LocaleResolver来实现对用户不同视图切换的目的。
LocaleResolver是Spring提供的一个接口,其声明如下:
public interface LocaleResolver {
// 根据request对象根据指定的方式获取一个Locale,如果没有获取到,则使用用户指定的默认的Locale
Locale resolveLocale(HttpServletRequest request);
// 用于实现Locale的切换。比如SessionLocaleResolver获取Locale的方式是从session中读取,但如果
// 用户想要切换其展示的样式(由英文切换为中文),那么这里的setLocale()方法就提供了这样一种可能
void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response,
@Nullable Locale locale);
}
针对LocaleResolver,Spring提供了几种实现方式,分别如下:
- FixedLocaleResolver:在声明该resolver时,需要指定一个默认的Locale,在进行Locale获取时,始终返回该Locale,并且调用其setLocale()方法也无法改变其Locale;
- CookieLocaleResolver:其读取Locale的方式是在session中通过Cookie来获取其指定的Locale的,如果修改了Cookie的值,页面视图也会同步切换;
- SessionLocaleResolver:其会将Locale信息存储在session中,如果用户想要修改Locale信息,可以通过修改session中对应属性的值即可;
- AcceptHeaderLocaleResolver:其会通过用户请求中名称为Accept-Language的header来获取Locale信息,如果想要修改展示的视图,只需要修改该header信息即可。
需要说明的是,Spring虽然提供的几个不同的获取Locale的方式,但这些方式处理FixedLocaleResolver以外,其他几个也都支持在浏览器地址栏中添加locale参数来切换Locale。对于Locale的切换,Spring是通过拦截器来实现的,其提供了一个LocaleChangeInterceptor,在该拦截器中的preHandle()方法中,Spring会读取浏览器参数中的locale参数,然后调用LocaleResolver.setLocale()方法来实现对Locale的切换。
这里我们以CookieLocaleResolver为例来讲解如何通过不同的Locale展示不同的视图。首先是我们的xml文件配置:
<context:component-scan base-package="mvc"/>
<mvc:annotation-driven/>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<bean class="mvc.interceptor.MyHandlerInterceptor"/>
</mvc:interceptors>
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"/>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="zh_CN"/>
</bean>
关于上述配置有三点需要说明:
- 指定了使用的LocaleResolver为CookieLocaleResolver,并且defaultLocale指定为zh_CN,需要注意的是,Spring中LocaleResolver的bean名称必须为localeResolver,因为Spring读取该bean时是通过该名称读取的;
- 上述配置总还指定了ViewResolver为ResourceBundleViewResolver,这里不能使用InternalResourceViewResolver,因为其不支持通过不同的Locale进行不同的视图切换,而ResourceBundleViewResolver是支持的;
- 配置中添加了LocaleChangeInterceptor的拦截器,用于对Locale的切换,如果不需要Locale切换的功能,可以不指定该拦截器。
对于后台接口的声明,其与一般的接口声明是没有区别的。如下是我们声明的一个接口:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/detail", method = RequestMethod.GET)
public ModelAndView detail(@RequestParam("id") long id,
@ModelAttribute("message") String message, Locale locale) {
System.out.println(message);
ModelAndView view = new ModelAndView("user");
User user = userService.detail(id);
view.addObject("user", user);
view.addObject("locale", locale);
return view;
}
}
上述接口返回的视图为user,并且将当前用户的Locale信息返回给了前端,可以看到,这里获取Locale数据的方式就只需要简单的声明一个类型为Locale的参数即可。
关于视图的展示,由于我们需要根据不同的Locale展示不同的视图,而在上述接口中,我们暂时没发现这样的路由。实际上,这个路由是通过ResourceBundleViewResolver类实现的,在使用该ViewResovler时,其会到class路径下查找名称为views的Resource Bundle,并且通过用户指定的Locale,唯一定位到某个Resource Bundle。然后在该Resource Bundle中查找指定的视图信息,比如这里接口返回的视图为user,那么就会在获取到的Resource Bundle查找user.(class)和user.url信息,这里user.(class)指定了展示该视图所需要的View对象的,而user.url则指定了具体的视图位置。比如如下配置的就是Locale分别为zh_CN和en_US的视图:
# views_zh_CN.properties
user.(class)=org.springframework.web.servlet.view.InternalResourceView
user.url=/WEB-INF/view/user_zh_CN.jsp
# views_en_US.properties
user.(class)=org.springframework.web.servlet.view.InternalResourceView
user.url=/WEB-INF/view/user_en_US.jsp
通过这种方式,ResourceBundleViewResolver就实现了针对不同的Locale来展示不同的视图的目的。如下是我们编写的两个分别用于zh_CN和en_US视图展示的jsp页面:
<!-- user_zh_CN.jsp -->
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User Jsp-zh CN</title>
</head>
<body>
${user.id} ${user.name} ${user.age} ${locale}
</body>
</html>
<!-- user_en_US.jsp -->
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User Jsp-en US</title>
</head>
<body>
${user.id} ${user.name} ${user.age} ${locale}
</body>
</html>
启动上述程序,我们在浏览器中键入http://localhost:8080/user/detail?id=1,可以看到其展示了如下视图:
1 Bob 27 zh_CN
如果我们添加名称为org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE,值为en_US的cookie,那么其展示的页面切换如下:
1 Bob 27 en_US
这说明我们成功使用Cookie对Locale进行了切换。如果我们在浏览器地址栏中添加locale=zh_CN的参数,可以看到,页面展示又切换为了前面那种情况。
本文主要对LocaleResolver进行了讲解,并且演示了如何通过配置不同的LocaleResolver来达到实现展示不同的视图的目的。需要注意的是,我们的LocaleResolver的bean名称必须为localeResolver,并且需要指定的ViewResolver辅以支持,否则切换的视图可能无法正常工作。
转载于:https://my.oschina.net/zhangxufeng/blog/2222918
Spring MVC之LocaleResolver详解的更多相关文章
- Spring MVC测试框架详解——服务端测试
随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...
- spring mvc+myBatis配置详解
一.spring mvc Spring框架(框架即:编程注解+xml配置的方式)MVC是Spring框架的一大特征,Spring框架有三大特征(IOC(依赖注入),AOP(面向切面),MVC(建模M- ...
- Spring MVC @RequestMapping注解详解
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- spring集成spring mvc 和hibernate详解
1.配置IOC容器 <!-- 配置IOC容器 --> <context-param> <param-name>contextConfigLocation</p ...
- Spring mvc请求处理流程详解(一)之视图解析
本文链接:https://blog.csdn.net/lchpersonal521/article/details/53112728 前言 Spring mvc框架相信很多人都很熟悉了,关于这方面 ...
- Spring MVC @RequestMapping注解详解(2)
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- Spring mvc整合freemarker详解
1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式 ...
- Spring mvc中DispatcherServlet详解
简介 DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势 ...
- Spring MVC之@ControllerAdvice详解
本文链接:https://blog.csdn.net/zxfryp909012366/article/details/82955259 对于@ControllerAdvice,我们比较熟知的用法是 ...
随机推荐
- 1062 Talent and Virtue (25分)(水)
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- 1049 Counting Ones (30分)
The task is simple: given any positive integer N, you are supposed to count the total number of 1's ...
- 1040 Longest Symmetric String (25分)(dp)
Given a string, you are supposed to output the length of the longest symmetric sub-string. For examp ...
- PTA数据结构与算法题目集(中文) 7-5
PTA数据结构与算法题目集(中文) 7-5 堆中的路径 7-5 堆中的路径 (25 分) 将一系列给定数字插入一个初始为空的小顶堆H[].随后对任意给定的下标i,打印从H[i]到根结点的路径. ...
- Java中如何通过try优雅地释放资源?
时间紧迫,长话短说,今天,小明给大家同步一个知识点,使用try-with-resources来优雅地关闭资源. 1. 背景 其实,在JDK 7就已经引入了对try-with-resources的支持, ...
- 大O表示法是什么?
1.什么是大O表示法: 1.在算法描述中,我们用这种方式来描述计算机算法的效率. 2.在计算机中,这种粗略的量度叫做 "大O" 表示法. 3.在具体的情境中,利用大O表示法来描述具 ...
- 小猪佩奇C代码实现
// ASCII Peppa Pig by Milo Yip #include <stdio.h> #include <math.h> #include <stdlib. ...
- 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序
优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...
- AJ学IOS(47)之网易彩票帮助界面UIWebView的运用
AJ分享,必须精品 效果: 制作过程 首先是帮助按钮那个地方的点击. 这里是用点击跳转的用的是 NJSettingArrowItem,前面的设置的,从字典通过模型转过来的. // 分享 NJSetti ...
- Docker系列-文章汇总
本篇汇总docker系列的文章目录: 01. 准备Docker环境 02. CentOS安装Docker 03. Bridge Network 01 容器间通信 持续更新中…… 本人微信公众号同步更新 ...
