开发人员建议收藏SpringBoot架构

北京白癜风医院哪家好 http://www.bdfyy999.com/

SpringBoot主要通过Maven或Gradle这样的构建系统以继承方式添加依赖,同时继承了Spring框架中的优秀元素,减少了SpringMVC架构中的复杂配置,内置Tomcat,Jetty容器,使用Javaapplication运行程序,而不是传统地把WAR包置于Tomcat等容器中运行,从而简化加速开发流程。此外,SpringBoot学习简单、轻量级、容易扩展。基于这些优秀的特点,SpringBoot成为了蓬勃发展的快速应用开发领域的领导者。

在互联网日益发展的当今时代,一个应用程序需要在全球范围内使用势在必然。传统的程序设计方法将可翻译信息如菜单按钮的标签、提示信息、帮助文档等文字信息硬编码在程序代码中,但这些已经不能很好的适应全球化发展,而且程序的扩展性差,维护成本高。一个能支持全球化的应用程序,必须实现单一可执行的程序,动态地使用资源(SingleSourceSingleExecutable)。

对于一个能支持全球化的应用程序来说,需要考虑下面三方面的设计,如图1所示。

图1.多语言应用程序模型

区域模型的定制化(LocaleModel):Locale模型是一个多语言应用程序的基础,用来确定界面语言以及日期时间等的格式化方式,通常包括语言环境(LanguageLocale)和文化环境(CulturalLocale)。一个应用程序的Locale获取有下面几种常见的方式:Locale.getDefault();一个应用程序具体选择哪种方式获取区域信息(Locale),这需要取决于该应用程序的用户需求。

资源文件的外部化:这里主要指界面语言,根据用户选择的Locale模型,自动地显示与之对应的界面语言,让客户感觉这个产品是为他们而设计的。

日期时间等多元文化的支持:包括货币、日历、时间、日期、排序、界面方向性(Bi-directional)等符合各个国家自己习惯的显示方式。

下面主要从上述三方面分别介绍基于SpringBoot应用程序如何支持多语言的,包括RESTful消息和内容的国际化支持。

SpringBoot中的区域模型介绍

在自定义应用程序区域模型(Locale)之前,需要了解一下SpringBoot中区域解析器的原理。基于Spring框架的应用程序中,用户的区域信息是通过区域解析器LocaleResolver来识别的,LocaleResolver是Spring框架基于Web提供的区域解析器接口,允许通过HTP请求和响应修改区域设置,如清单1所示。

清单1.Spring框架中的区域解析器

publicinterfaceLocaleResolver{LocaleresolveLocale(HtpServletRequestrequest);voidsetLocale(HtpServletRequestrequest,

NullableHtpServletResponseresponse,

NullableLocalelocale);}

LocaleResolver在Spring框架中有四种具体的实现:

按HTP请求头部解析区域(AcceptHeaderLocaleResolver):Spring采用的默认区域解析器就是基于请求头部,它通过检验HTP请求的accept-language头部来解析区域,这个头部是由用户的Web浏览器设定决定的。

按会话属性解析区域(SessionLocaleResolver):它通过检验用户会话中预置的属性来解析区域。如果该会话属性不存在,它会根据accept-languageHTP头部确定默认区域。

按Cookie解析区域(CookieLocaleResolver):如果Cookie存在,它会根据accept-languageHTP头部确定默认区域。

FixedLocaleResolver:此解析器始终返回固定的默认区域设置,通常取自JVM的默认区域设置。

除了Spring框架中提供的四种实现外,还可以创建自定义的区域解析器。在SpringBoot自动配置中可以看到清单2的代码。

清单2.自定义Spring框架中的区域解析器

//向容器中加入了LocaleResolver对象

Bean

ConditionalOnMissingBean

ConditionalOnProperty(prefix="spring.mvc",name={"locale"})publicLocaleResolverlocaleResolver(){if(this.mvcProperties.getLocaleResolver()==org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED){returnnewFixedLocaleResolver(this.mvcProperties.getLocale());}else{AcceptHeaderLocaleResolverlocaleResolver=new();localeResolver.setDefaultLocale(this.mvcProperties.getLocale());returnlocaleResolver;}}

当我们的应用程序需要自定义区域解析器(LocaleResovler)的时候,可以通过下面几个步骤实现。

第一步:自定义区域解析器

自定义区域解析器是对Spring中LocaleResolver接口的实现,可以基于应用程序的实际需求,取自于用户自定义的语言选择界面、用户操作系统或者浏览器的语言设定。清单3是一个示例,首先判断用户请求中是否含有lang这个参数,如果有,就使用这个参数所带的区域信息;如果没有,就取自浏览器请求头部中的accept-language信息。

清单3.自定义区域解析器

publicclassCustomLocaleResolverimplementsLocaleResolver{

OverridepublicLocaleresolveLocale(HtpServletRequestrequest){StringparamLanguage=request.getParameter("lang");if(!StringUtils.isEmpty(paramLanguage)){String[]splits=paramLanguage.split("-");returnnewLocale(splits[0],splits[1]);}else{StringacceptLanguage=request.getHeader("Accept-Language").split(",")[0];String[]splits=acceptLanguage.split();returnnewLocale(splits[0],splits[1]);}//如果想使用当前系统的语言,则使用Locale.getDefault()}

OverridepublicvoidsetLocale(HtpServletRequestrequest,HtpServletResponseresponse,Localelocale){}}

第二步:将自定义的区域解析器添加到IOC容器中

通常添加在自定义的config文件中,下面的例子将自定义的CustomLocaleResolver通过

Bean

注添加到IOC容器,如清单4所示。

清单4.自定义区域解析器添加到IOC

ConfigurationpublicclassCustomMvcConfigureextendsWebMvcConfigurationSupport{

BeanpublicLocaleResolverlocaleResolver(){returnnewCustomLocaleResolver();}}

如此,在程序中就可以调用我们自定义的区域解析器。

Thymeleaf模板引擎对多语言的支持

Thymeleaf是一个基于ApacheLicense2.0许可,支持XML、XHTML、HTML5的开源模板引擎,主要用于Web或者非Web环境中的应用开发,在有网络和无网络的环境下皆可运行,它既可以在浏览器端查看静态页面,也可以显示动态页面。这是由于它支持HTML原型,然后在HTML标签里增加额外的属性来达到模板+数据的展示方式。浏览器解析HTML时会忽略未定义的标签属性,所以Thymeleaf模板可以静态地运行;当有数据返回到页面时,Thymeleaf标签会动态地替换掉静态内容,使页面动态显示。

在SpringMVC框架中,通常我们用JSP来展示Web前端,JSP本质上也是模板引擎,然而SpringBoot官方推荐使用Thymeleaf模板引擎,Thymeleaf完全可以替代JSP或者其他模板引擎如Velocity、FreeMarker等。虽然Spring官方推荐使用Thymeleaf,但是并不是说SpringBoot不支持JSP。

在SpringBoot项目中使用Thymeleaf模板支持多语言的步骤如下:

第一步:封装用户语言环境

在我们的实验中,设计一个简单的登录页面,登录页面有个语言选择下拉列表,将使用用户选的语言来显示登录页面上的标签,如图2所示。

图2.资源文件组织结构

为了使我们的程序能够使用指定的Locale,首先需要添加LocaleResolverBean。在我们的示例中,使用了用户选择的Locale,所以需要配置LocaleChangeInterceptor拦截器,主要用来检查传入的请求,如果请求中有lang的参数(可配置),如localhost:/login?lang=zh_CN,那么该Interceptor将使用localResolver改变当前用户的默认Locale。清单5为示例代码,根据用户选择的语言显示对应的界面。

清单5.自定义LocaleResolver

ComponentScan(basePackages="


转载请注明:http://www.aierlanlan.com/rzgz/2087.html