首页 Spring3 MVC下国际化实现

Spring3 MVC下国际化实现

举报
开通vip

Spring3 MVC下国际化实现Spring3MVC下国际化实现Spring国际化在web开发中经常会遇到国际化的问题,那么在springmvc中如何实现动态国际化。Spring使用ResourceBundleMessageSource实现国际化资源的定义。使用LocaleResolver实现本地化信息的解析,使用LocaleChangeInterceptor实现本地化信息的监听(来实现url参数动态指定locale)。I18N人们常把I18N作为“国际化”的简称,其来源是英文单词internationalization的首末字符i和n。18为中...

Spring3 MVC下国际化实现
Spring3MVC下国际化实现Spring国际化在web开发中经常会遇到国际化的问题,那么在springmvc中如何实现动态国际化。Spring使用ResourceBundleMessageSource实现国际化资源的定义。使用LocaleResolver实现本地化信息的解析,使用LocaleChangeInterceptor实现本地化信息的监听(来实现url参数动态指定locale)。I18N人们常把I18N作为“国际化”的简称,其来源是英文单词internationalization的首末字符i和n。18为中间的字符数。A、LocaleResolver(本地化解析器)org.springframework.web.servlet.LocaleResolverpublicinterfaceLocaleResolverDispatcherServlet允许使用客户端本地化信息自动解析消息。这个工作由实现LocaleResolver的对象来完成。但收到请求时,DispatcherServlet查找LocaleResolver,若找到就是用它来设置Locale信息。A.1、LocaleResolver的实现类A.1.1、AcceptHeaderLocaleResolverorg.springframework.web.servlet.i18n.AcceptHeaderLocaleResolverpublicclassAcceptHeaderLocaleResolverextendsObjectimplementsLocaleResolver这个本地化解析器检查请求中客户端浏览器发送的accept-language头信息,这里包含客户端操作系统的本地化信息。A.1.2、CookieLocaleResolverorg.springframework.web.servlet.i18n.CookieLocaleResolverjava.lang.Objectorg.springframework.web.util.CookieGeneratororg.springframework.web.servlet.i18n.CookieLocaleResolverpublicclassCookieLocaleResolverextendsCookieGeneratorimplementsLocaleResolver这个本地化解析器检查客户端中的cookie是否包含本地化信息。若有就使用。A.1.3、SessionLocaleResolverorg.springframework.web.servlet.i18n.SessionLocaleResolverjava.lang.Objectorg.springframework.web.servlet.i18n.AbstractLocaleResolverorg.springframework.web.servlet.i18n.SessionLocaleResolverpublicclassSessionLocaleResolverextendsAbstractLocaleResolver这个本地化解析器检查客户端中的session是否包含本地化信息。若有就使用。A.1.4、FixedLocaleResolverorg.springframework.web.servlet.i18n.FixedLocaleResolverjava.lang.Objectorg.springframework.web.servlet.i18n.AbstractLocaleResolverorg.springframework.web.servlet.i18n.FixedLocaleResolverpublicclassFixedLocaleResolverextendsAbstractLocaleResolver这个本地化解析器返回一个固定的本地化信息。默认值为当前JVM的locale。A.2、如何获得客户端的locale通过RequestContext.getLocale()方法来获取由本地化解析器解析的客户端的本地化信息。A.2.1、RequestContextorg.springframework.web.servlet.support.RequestContextpublicclassRequestContextextendsObjectContextholderforrequest-specificstate,likecurrentwebapplicationcontext,currentlocale,currenttheme,andpotentialbindingerrors.ProvideseasyaccesstolocalizedmessagesandErrorsinstances.Request特殊状态的上下文持有者,如:当前web的applicationcontext,当前locale,当前主题和可能捆绑的错误。使访问本地化的信息和错误实例。A.2.2、RequestContext取得locale的例子publicModelAndViewhandleRequest(HttpServletRequestreq,HttpServletResponseres)throwsException{RequestContextrequestContext=newRequestContext(req);LocalemyLocale=requestContext.getLocale();System.out.println(myLocale);}B、MessageSourceorg.springframework.context.MessageSourcepublicinterfaceMessageSourcespring通过实现MessageSource接口,来支持国际化。MessageSource来定义国际化需要资源的接口。MessageSource有很多实现方法,ResourceBundleMessageSource是一个常用的实现。它按照ResourceBundle标准实施。B.1、ResourceBundleMessageSourceorg.springframework.context.support.ResourceBundleMessageSourcepublicclassResourceBundleMessageSourceextendsAbstractMessageSourceimplementsBeanClassLoaderAwareorg.springframework.context.support.MessageSourceSupportorg.springframework.context.support.AbstractMessageSourceorg.springframework.context.support.ResourceBundleMessageSourceMessageSourceimplementationthataccessesresourcebundlesusingspecifiedbasenames.ThisclassreliesontheunderlyingJDK'sResourceBundleimplementation,incombinationwiththeJDK'sstandardmessageparsingprovidedbyMessageFormat.它是MessageSource的一个实现,它访问资源束,资源束的路径由的basenames属性来指定。这个类依赖于JDK的底层类java.util.ResourceBundle。并结合由java.text.MessageFormat类提供的JDK标准message解析。set方法void  setBasename(Stringbasename)Setasinglebasename,followingResourceBundleconventions:essentially,afully-qualifiedclasspathlocation.Ifitdoesn'tcontainapackagequalifier(suchasorg.mypackage),itwillberesolvedfromtheclasspathroot.Messageswillnormallybeheldinthe"/lib"or"/classes"directoryofawebapplication'sWARstructure.Theycanalsobeheldinjarfilesontheclasspath.NotethatResourceBundlenamesareeffectivelyclasspathlocations:Asaconsequence,theJDK'sstandardResourceBundletreatsdotsaspackageseparators.Thismeansthat"test.theme"iseffectivelyequivalentto"test/theme",justlikeitisforprogrammaticjava.util.ResourceBundleusage.设置单个basename,遵照ResourceBundle协定:一个合格的classpath路径。若它没有包含包路径(如:org.mypackage),它将被解析classpath的根目录。信息一般被放在WAR结构的web项目的/lib或/classes目录下。你也可以放在对应的jar文件中。要注意的是:JDK中使用“.”作为路径的分隔符。也就是说“test.theme”实际 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示为根目录下的“test/theme”目录。B.1.1、ResourceBundleMessageSource的配置其中,message-info是你的properties文件的通用名。如:我的配置文件叫messages.properties,messages_zh_CN.properties等等。B.1.2、范例说明范例11.配置messagesSource的beanspring.chapter13.demo2.messages关于basename的命名方式曾困扰我好久,特别是要加上包的名称,指定properties存放位置。一定要注意不然会报org.springframework.context.NoSuchMessageException的错2.资源文件messages_zh_CN.propertiescustomer.name=david,age\:{0},URL\:{1}ABC=sdsd3.测试类packagespring.chapter13.demo2;importjava.util.Locale;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclasstest{publicstaticvoidmain(String[]args){    StringfileName="src/spring/chapter13/demo2/bean.xml";ApplicationContextcontext=newFileSystemXmlApplicationContext(fileName);Stringname="";name=context.getMessage("ABC",null,Locale.CHINA);System.out.println(name);Stringnamechinese=context.getMessage("customer.name",newObject[]{28,""},Locale.SIMPLIFIED_CHINESE);System.out.println("Customername(Chinese):"namechinese);}}因为ApplicationContext也是MessageSource接口的实现,故可以直接调用getMessage()方法。C、HandlerInterceptor(处理拦截器接口)org.springframework.web.servlet.HandlerInterceptorpublicinterfaceHandlerInterceptorC.1、LocaleChangeInterceptor(处理拦截器实现)org.springframework.web.servlet.i18n.LocaleChangeInterceptorjava.lang.Objectorg.springframework.web.servlet.handler.HandlerInterceptorAdapterorg.springframework.web.servlet.i18n.LocaleChangeInterceptorpublicclassLocaleChangeInterceptorextendsHandlerInterceptorAdapter前面LocaleResolver是自动解析用户的本地化信息locale,除了这个方法外,还可以把一个Interceptor拦截器放到处理器controller中,以便在某种情况下改变locale。(例如:基于请求中参数变更locale)。C.1.1、基于拦截器的范例我们再回到《[spring]8初识MVC和SpringMVC框架》中的范例上,让我们在这个范例的基础上增加动态国际化支持,基于请求参数的动态国际。范例21.Spring配置文件helloWorldActionHelloSpringWorld!sayHello.jsp我们定义了locale解析器(localeResolver)用于解析locale,还定义了一个处理拦截器(HandlerInterceptor)用于拦截url中locale参数。并在处理映射(handlerMapping)中增加了拦截器(Interceptor)。2.自定义的locale解析器packagespring.chapter13.demo1;importjava.util.Locale;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;publicclassMyAcceptHeaderLocaleResolverextendsAcceptHeaderLocaleResolver{privateLocalemyLocal;publicLocaleresolveLocale(HttpServletRequestrequest){returnmyLocal;}publicvoidsetLocale(HttpServletRequestrequest,HttpServletResponseresponse,Localelocale){myLocal=locale;}}若使用AcceptHeaderLocaleResolver类,程序运行会抛出异常"CannotchangeHTTPacceptheader-useadifferentlocaleresolutionstrategy",根本原因是springsource做了限制,请注意上面的类,该类允许继承,所以需要改写setLocale方法。3.资源文件的定义messages4.Controller处理器的处理方法publicModelAndViewhandleRequest(HttpServletRequestreq,HttpServletResponseres)throwsException{    RequestContextrequestContext=newRequestContext(req);LocalemyLocale=requestContext.getLocale();StringfileName="../src/spring/chapter13/demo2/bean.xml";ApplicationContextcontext=newFileSystemXmlApplicationContext(fileName);Stringname="";name=context.getMessage("ABC",null,myLocale);//在该方法中处理用户请求Mapmodel=newHashMap();model.put("helloWorld",getHelloWorld());//将helloWorld属性存入model中returnnewModelAndView(getViewPage(),model);//调用getViewPage获取要返回的页面}D、用Spring标签实现国际化Spring标签中实现国际化的标签为spring:message。详细细节见《[spring]14使用Spring标签库》。范例31.在web.xml中加载spring配置文件contextConfigLocation/WEB-INF/bean.xmlorg.springframework.web.context.ContextLoaderListener2.配置Spring配置文件spring.chapter13.demo2.messages3.定义资源文件customer.name=davidchina,age\:{0},URL\:{1}ABC=sdsdx4.JSP文件中使用标签<%@tagliburi=""prefix="spring"%><%@tagliburi=""prefix="from"%>
本文档为【Spring3 MVC下国际化实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_686908
暂无简介~
格式:doc
大小:44KB
软件:Word
页数:21
分类:
上传时间:2022-08-04
浏览量:1