Spring MVC + Velocity实现国际化配置
本示例已升级到Spring Boot 2.x
源码地址:https://github.com/smltq/spring-boot-demo/tree/master/template-thymeleaf
国际化介绍
web开发中,国际化是需要考虑的一个问题,而且这个问题一般是越早敲定越好(不然等到系统大了,翻译是个问题).下面是结合实际项目(Spring MVC+Velocity)对实现国际化的一些总结.github地址
Spring国际化
I18N:作为"国际化"的简称,其来源是英文单词internationalization的首末字符i和n,18为中间的字符数.
Spring做国际化的配置主要有3个关键点:
- ResourceBundleMessageSource:实现国际化资源的定义.
- LocaleResolver:实现本地化信息的解析.
- LocaleChangeInterceptor:实现本地化信息的监听(来实现url参数动态指定locale).
LocaleResolver
LocaleResolver是指用什么策略来检测请求是哪一种locale,Spring MVC提供了一下几种策略:
AcceptHeaderLocaleResolver
根据浏览器Http Header中的accept-language域判定浏览器的语言环境,可以通过HttpServletRequest.getLocale获得域的内容,但是无法调用LocaleResolver接口的setLocale设置locale.基于这个策略,在后面的demo中可以实现基于浏览器的国际化案例.
SessionLocaleResolver
根据用户本次会话过程中的语言设定决定语言种类,session级别的,在此session周期内可以修改语言种类,但是session失效后,语言设定失效.基于这个策略,在后面的demo中可以实现基于session的国际化案例.
CookiedLocaleResolver
根据Cookie判定用于的语言设定(Cookie中保存着用户前一次的语言设定参数).
FixedLocaleResolver
一直使用固定的Locale,改变locale是不支持的.
如果需要使用哪一种策略,只需要在DispatcherServlet制定的Spring配置文件中配置就行,DispatchServlet将在初始化的时候调用initLocaleResolver(context)方法去配置文件中找名字为localeResolver的bean,如果有就使用配置文件的,没有就使用默认的AcceptHeaderLocaleResovler
通过上面,了解了Spring实现国际化的相关概念,下面结合demo实例,看看Spring MVC是如何实现国际化的
- 配置文件
<!--国际化配置 start-->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
<!--语言选择-->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en"/>
</bean>
<!--国际化配置 end-->
- demo里准备两份语言文件分别是messages_cn.properties和messages_en.properties,内容分别如下:
Hello=Hello
HelloWorld=Hello World
SpringMvcBootstrap=Spring MVC Bootstrap
Greetings=I deeply greet you!
Hello=你好,现在是中文版
HelloWorld=你好,现在是中文版
SpringMvcBootstrap=中文版头部
Greetings=中文版欢迎你
- 前端界面通过使用spring针对不同view视图提供的标记处理国际化信息.velocity标记,比如demo中的hello.vm文件
#define($content)
#springMessage("Hello")
#end
最后运行结果会根据defaultLocale的配置显示英语版本或中文版本,显示效果如下:
以上配置示例是基于Cookie的国际化实现,国际化根据实际需求,实现方式有很多比如:
- 基于浏览器请求的国际化
- 基于Session的国际化实现
- 基于ULR请求的国际化实现
Velocity简单使用
- pom.xml增加Velocity 依赖
<!-- Velocity 依赖 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
- xml增加模板引擎配置
<!--模板引擎配置 start-->
<bean id="velocityConfig"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="configLocation">
<value>/WEB-INF/velocity/velocity.properties</value>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
<property name="cache" value="false"/>
<property name="layoutUrl" value="/layout/main.vm"/>
<property name="prefix" value="/templates/"/>
<property name="suffix" value=".vm"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="viewClass" value="org.springframework.web.servlet.view.velocity.VelocityLayoutView"/>
</bean>
<!--模板引擎配置 end-->
- controller代码,hello方法会显示hello.vm内容,helloWorld方法显示hello-world.vm内容,入口是main.vm
@Controller
public class HelloWorldController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello";
}
@RequestMapping(value = "/hello-world", method = RequestMethod.GET)
public String helloWorld() {
return "hello-world";
}
@RequestMapping(value = "/hello-redirect", method = RequestMethod.GET)
public String helloRedirect() {
return "redirect:/hello-world";
}
}
- 我们看看main.vm代码
<!doctype html>
<html>
<head>
<title>$!page_title</title>
<link href="#springUrl('/resources/css/reset.css')" rel="stylesheet" type="text/css"/>
<link href="#springUrl('/resources/css/style.css')" rel="stylesheet" type="text/css"/>
</head>
<body>
<article>
<header>#parse('/layout/header.vm')</header>
<section>$!content</section>
<footer>#parse('/layout/footer.vm')</footer>
</article>
</body>
</html>
SpringMVC和REST服务API的基本用法示例
- pom.xml增加json和xml依赖
<!-- JSON 转换器 -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.3</version>
</dependency>
<!-- XML 转换器 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.0</version>
</dependency>
- controller代码
@Controller
public class UserServiceController {
@RequestMapping(value = "/user/{name}/{surname}.json", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
User getUserJson(@PathVariable String name, @PathVariable String surname) {
User user = new User(name, surname);
return user;
}
@RequestMapping(value = "/user/{name}/{surname}.xml", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
public @ResponseBody
User getUserXml(@PathVariable String name, @PathVariable String surname) {
User user = new User(name, surname);
return user;
}
}
@XmlRootElement(name = "user")
public class User {
private String name;
private String surname;
public User() {
}
public User(String name, String surname) {
super();
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
- json数据结果
浏览器输入http://localhost:9080/testweb/user/tq/lin.json,结果显示如下:
{
name: "tq",
surname: "lin"
}
- xml数据结果
浏览器输入http://localhost:9080/testweb/user/tq/lin.xml,结果显示如下:
<user>
<name>tq</name>
<surname>lin</surname>
</user>
Spring MVC + Velocity实现国际化配置的更多相关文章
- Spring MVC 使用tomcat中配置的数据源
Spring MVC 使用tomcat中配置的数据源 配置tomcat数据源 打开tomcat目录下的conf目录,编辑sever.xml目录.在<GlobalNamingResources&g ...
- Spring MVC与easyui国际化
1.建立资源文件 在webapp下建立文件夹language,在其中再添加file,命名分别为language.properties,language_en.properties,language_z ...
- spring mvc velocity多视图
1.ViewResolverUrlBasedViewResolver 这个东西是根据url 进行路由的.网上搜了 1.order 排序,同名出现各种问题 2.XmlViewResolver,BeanN ...
- Spring MVC 学习总结(八)——Spring MVC概要与环境配置(IDEA+Maven+Tomcat7+JDK8、示例与视频)
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- spring mvc + velocity 搭建实例程序maven版本并且使用的是tomcat容器而不是jetty(step by step)
笔者最近在学习spring mvc 查了很多资料,但用jsp的居多,但项目中需要用velocity,所以说就学习了一下,现将所查资料以及搭建过程陈述如下,供需要的人参考 1.楼主用的是eclipse+ ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- Spring mvc的web.xml配置详解
1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLoaderListener(l ...
- Spring MVC 的xml一些配置
1.可以自动加载注解驱动,通过注解找到对应Controller <!-- spring MVC 注解驱动 --> <mvc:annotation-driven></mvc ...
- spring mvc:练习:javaConfig配置和注解
Spring4 MVC HelloWorld 注释/JavaConfig为示例,一步一步以简单的方式学习Spring4 MVC 的注解,项目设置,代码,部署和运行. 我们已经使用XML配置开发了一个H ...
随机推荐
- 关于IE9 table显示错位的问题
首先,win10无法安装IE9,所以需要用IE11模拟IE9,这样:http://www.w10zj.com/Win10xy/Win10yh_638.html: 其次,table显示错位的可能原因:h ...
- MariaDB 数据库索引详解(9)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- Codeforces Round #425 (Div. 2) B. Petya and Exam(字符串模拟 水)
题目链接:http://codeforces.com/contest/832/problem/B B. Petya and Exam time limit per test 2 seconds mem ...
- 设计模式《JAVA与模式》之迭代子模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- Smart/400开发上手5: Cobol开发标准
ENVIRONMENT DIVISION. CONFIGURATION SECTION.SOURCE-COMPUTER. IBM-AS400.OBJECT-COMPUTER. IBM-AS400. 这 ...
- idea安装破解永久有效
首先先在下面地址下载好idea安装包 链接:https://pan.baidu.com/s/1gVl3WAjC_H6jrH2cjK1paw提取码:i2t5 再下载好破解所需的jar包 链接:https ...
- elasticsearch+logstash+redis+kibana 实时分析nginx日志
1. 部署环境 2. 架构拓扑 3. nginx安装 安装在192.168.176.128服务器上 这里安装就简单粗暴了直接yum安装nginx [root@manager ~]# yum -y in ...
- 轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器
项目源代码下载地址:轮播图 以下为项目实现效果:(由于gif太大,所以只上传一张图片,但效果完全能实现,经测试,在ie各版本浏览器及chrome,firefox等浏览器中均能实现效果,可以实现点击切换 ...
- MVC3学习:Sql Server2005中时间类型DateTime的显示
在Sql Server2005中,如果将某字段定义成日期时间类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日形式,不要时 ...
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
从头讲讲编码的故事.那么就让我们找个草堆坐下,先抽口烟,看看夜晚天空上的银河,然后想一想要从哪里开始讲起.嗯,也许这样开始比较好…… 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...