Spring MVC 多语言化的实践和学习
一、主要参考:
SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
二、总结:
实际操作和原文有出入,以自己的实操为主。实操主要内容都可以参考对应的GtHub的提交记录: https://github.com/NullTommy/hello/commit/13cbaa23f61d5a83845c4030e1bfe877d06864b4
- 对于项目的整体构建不做过多描述,只说多语言部分;
- 配置Spring MVC 相关的多语言配置:
- messageSource主要用于配置多语言资源化文件的路径
- localeResolver好像是必须的,不然会出错
- interceptors,拦截器,用于拦截请求中的语言相关信息,
<!-- 配置国际化资源文件路径 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n/messages" />
<property name="useCodeAsDefaultMessage" value="true"/>
</bean>
<!-- 本地化资源处理器 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
</bean>
<!-- 国际化拦截器 -->
<mvc:interceptors>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>
3.项目中构建多语言相关文件,并保存不同语言的信息;
4.页面中使用多语言,页面中的文字部分,全部使用多语言文件中的资源代码 key,而不是写死。
5.页面切换多语言:在请求中携带对应的语言字段即可,和拦截器中的配置保持一致。
三、实操中的问题及注意事项:
- 多语言文件的路径问题:实际路径是文件路径+文件名前面的公共部分(除后面的语言信息)
- useCodeAsDefaultMessage 的配置是当页面无法加载多语言信息时,使用页面上配置的Code。
- id="messageSource" 的具体类,原教程中是:ReloadableResourceBundleMessageSource 但我使用有问题,后来改为ResourceBundleMessageSource,问题解决;
- interceptors中的配置和请求中的语言字段key需要对应
- JSP页面中需要引入spring标签,然后才能在JSP页面中使用多语言的标签,页面才可以自动切换。
- 实操中遇到如下报错:
Cannot change HTTP accept header - use a different locale resolution strategy
主要原因是多语言化配置的beanId名称有问题,具体解决可以参考如下两文:
6.1 java - Cannot change HTTP accept header - use a different locale resolution strategy - Stack Overflow https://stackoverflow.com/questions/23766446/cannot-change-http-accept-header-use-a-different-locale-resolution-strategy
6.2 Spring 的MVC I18N-国际化相关配置出现的问题 - CSDN博客 https://blog.csdn.net/shenzhen_mydream/article/details/2514405
四、扩展:
Cannot change HTTP accept header - use a different locale resolution strategy 主要原因是多语言化配置的beanId名称有问题,具体解决可以参考如下两文:
6.1 java - Cannot change HTTP accept header - use a different locale resolution strategy - Stack Overflow https://stackoverflow.com/questions/23766446/cannot-change-http-accept-header-use-a-different-locale-resolution-strategy
6.2 Spring 的MVC I18N-国际化相关配置出现的问题 - CSDN博客 https://blog.csdn.net/shenzhen_mydream/article/details/2514405
自行测试的原因是因为项目中需要多语言化,这只是一个小 Demo ,项目实际中遇到如下问题,做对应记录;
- 该Demo是基于请求中的语言信息来实现语言切换,而实际项目中大多是基于Cookie来保存语言信息。所以在后台,需要从Cookie中获取语言信息,同时注意实现获取不到的情况。
主要实现就是自行继承拦截器,然后拦截器中做自己需要的逻辑处理即可。 - 实际项目使用的 FreeMaker ,页面是ftl后缀文件。在FreeMaker中使用多语言的化需要额外的一个配置,即将对应的宏进行配置
可参考教程: spring+freemarker 国际化i18n - CSDN博客 https://blog.csdn.net/rongku/article/details/12844473
同时页面使用多语言标签Demo如下:
<@spring.message "common.problem" />
五、附录:
- SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
注:本文参考的主要教程,所有一切都始于这篇教程。
- SpringMVC 资源国际化实现以及常见问题 - LionheartCGJ - 博客园 https://www.cnblogs.com/LionheartCGJ/p/7819688.html
注:这也是一个很重要的文件,对于配置中的内容以及使用做了很详细的解释说明。上面的教程只是如何做,这篇是告诉你为什么要这么做,以及这么做有什么用。
- 其他不做详细描述了,可参考原文。
Spring MVC 多语言化的实践和学习的更多相关文章
- JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...
- 搭建Spring4+Spring MVC web工程的最佳实践
Spring是个非常非常非常优秀的java框架,主要是用它的IOC容器帮我们依赖注入和管理一些程序中的Bean组件,实现低耦合关联,最终提高系统可扩展性和可维护性,用它来辅助我们构建web工程将会感觉 ...
- 看透Spring MVC:源代码分析与实践 (Web开发技术丛书)
第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 1 ...
- Spring MVC 中急速集成 Shiro 实践
相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...
- Spring mvc,uploadifive 文件上传实践(转自:https://segmentfault.com/a/1190000004503262)
1.前台页面: 引入js和css 全选复制放进笔记 <link type="text/css" rel="stylesheet" href=&quo ...
- 从原理层面掌握HandlerMethod、InvocableHandlerMethod、ServletInvocableHandlerMethod的使用【一起学Spring MVC】
每篇一句 想当火影的人没有近道可寻,当上火影的人同样无路可退 前言 HandlerMethod它作为Spring MVC的非公开API,可能绝大多数小伙伴都对它比较陌生,但我相信你对它又不是那么的生疏 ...
- spring mvc(2) spring mvc初体验
前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...
- Spring企业级程序设计 • 【第5章 Spring MVC快速入门】
全部章节 >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2 S ...
- maven配置spring mvc+hibernate+spring框架
作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...
随机推荐
- js中keydown和keypress的区别
keydown和keypress这些事件是当一个对象具有焦点时进行按下或松开一个键时发生的. keydown在按下的时候返回键盘上的代码值,然后由TranslateMessage函数翻译成字符,并且由 ...
- 事件轮询 event loop
Understanding the node.js event loop The first basic thesis of node.js is that I/O is expensive: So ...
- EMQ学习笔记---Clean Session和Retained Message
MQTT会话(Clean Session)MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话.‘Clean Session’设置为0,表示创建一个持久会 ...
- C语言 (内存) 四道经典题目
void GetMemory(char *p) { p = (); "没有释放内存" } void Test(void) { char *str = NULL; GetMemory ...
- ubuntu 13.10使用fcitx输入法
ubuntu 13.10使用fcitx输入法 2013-10-19 20:15:57 标签:fcitx ubuntu 13.10 五笔拼音输入法 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
- datatables 相关文章
http://blog.csdn.net/zhu_xiao_yuan/article/details/51252300 datatables参数配置详解 http://blog.csdn.net/j ...
- [待解决]ColumnPrefixFilter 不能过滤出全部满足条件的,
Scan scan = new Scan(); ColumnPrefixFilter columnPrefixFilter = new hbase(main)::> scan 't4' ROW ...
- 理解Callable 和 Spring DeferredResult(翻译)
1-介绍 Servlet 3中的异步支持为在另一个线程中处理HTTP请求提供了可能性.当有一个长时间运行的任务时,这是特别有趣的,因为当另一个线程处理这个请求时,容器线程被释放,并且可以继续为其他请求 ...
- DNSPod--国内最早提供免费智能DNS产品的网站,致力于为各类网站提供高质量的多线智能DNS免费解析
DNSPod 建立于2006年3月份,是一款免费智能DNS产品. DNSPod 可以为同时有电信.网通.教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网 ...
- 【Java】对文件或文件夹进行重命名
在Java中,对文件或文件夹进行重命名是很简单的,因为Java的File类已经封装好renameTo的方法. 修改文件或者文件夹的名字都使用这个方法.例如如下的程序: import java.io.* ...
- SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
注:本文参考的主要教程,所有一切都始于这篇教程。 - SpringMVC 资源国际化实现以及常见问题 - LionheartCGJ - 博客园 https://www.cnblogs.com/LionheartCGJ/p/7819688.html
注:这也是一个很重要的文件,对于配置中的内容以及使用做了很详细的解释说明。上面的教程只是如何做,这篇是告诉你为什么要这么做,以及这么做有什么用。 - 其他不做详细描述了,可参考原文。
任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...
Spring是个非常非常非常优秀的java框架,主要是用它的IOC容器帮我们依赖注入和管理一些程序中的Bean组件,实现低耦合关联,最终提高系统可扩展性和可维护性,用它来辅助我们构建web工程将会感觉 ...
第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 1 ...
相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...
1.前台页面: 引入js和css 全选复制放进笔记 <link type="text/css" rel="stylesheet" href=&quo ...
每篇一句 想当火影的人没有近道可寻,当上火影的人同样无路可退 前言 HandlerMethod它作为Spring MVC的非公开API,可能绝大多数小伙伴都对它比较陌生,但我相信你对它又不是那么的生疏 ...
前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...
全部章节 >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2 S ...
作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...
keydown和keypress这些事件是当一个对象具有焦点时进行按下或松开一个键时发生的. keydown在按下的时候返回键盘上的代码值,然后由TranslateMessage函数翻译成字符,并且由 ...
Understanding the node.js event loop The first basic thesis of node.js is that I/O is expensive: So ...
MQTT会话(Clean Session)MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话.‘Clean Session’设置为0,表示创建一个持久会 ...
void GetMemory(char *p) { p = (); "没有释放内存" } void Test(void) { char *str = NULL; GetMemory ...
ubuntu 13.10使用fcitx输入法 2013-10-19 20:15:57 标签:fcitx ubuntu 13.10 五笔拼音输入法 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
http://blog.csdn.net/zhu_xiao_yuan/article/details/51252300 datatables参数配置详解 http://blog.csdn.net/j ...
Scan scan = new Scan(); ColumnPrefixFilter columnPrefixFilter = new hbase(main)::> scan 't4' ROW ...
1-介绍 Servlet 3中的异步支持为在另一个线程中处理HTTP请求提供了可能性.当有一个长时间运行的任务时,这是特别有趣的,因为当另一个线程处理这个请求时,容器线程被释放,并且可以继续为其他请求 ...
DNSPod 建立于2006年3月份,是一款免费智能DNS产品. DNSPod 可以为同时有电信.网通.教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网 ...
在Java中,对文件或文件夹进行重命名是很简单的,因为Java的File类已经封装好renameTo的方法. 修改文件或者文件夹的名字都使用这个方法.例如如下的程序: import java.io.* ...