• Spring MVC 对locale和theme的支持


    Locale 
    Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 Accept-Language 来确定访客的local。对于前端jsp页面上,spring提供了标签<spring:message>来提供从resource文件中获取的文字的动态加载功能。 
    例如 
    修改servlet context xml文件中的messageSource部分,增加对多国语言message的code resource的引入。 
    Xml代码  收藏代码
    1. <bean id="messageSource"  
    2.     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"  
    3.     p:fallbackToSystemLocale="true" p:useCodeAsDefaultMessage="false"  
    4.     p:defaultEncoding="UTF-8">  
    5.     <description>Base message source to handle internationalization  
    6.     </description>  
    7.     <property name="basenames">  
    8.         <list>  
    9.             <!-- main resources -->  
    10.             <value>classpath:valid/validation</value>  
    11.             [color=red]<value>classpath:local/message</value>[/color]  
    12.         </list>  
    13.     </property>  
    14. </bean>  


    在 src/main/resources目录下增加local目录,并在其下增加messpage_zh_CN.properties文件,内容为 hello=\u6b22\u8fce,并增加message_en.properties文件内容为hello=welcome。 

    修改hellworld.jsp,增加如下代码 

    Jsp代码  收藏代码
    1. <h1>[color=red]<spring:message code='hello'/>[/color]</h1>  


    此时访问http://localhost:8080/mvc,根据你的客户端的不同,将分别显示中文和英文的欢迎语。 

    除缺省的AcceptHeaderLocaleResolver外,spring mvc还提供了CookieLocaleResolver和SessionLocaleResolver两个localResolver来提供在运行时由客户端强行指定local的功能。 
    分别使用cookie和session中存储的locale值来指定当前系统所使用的locale. 

    以SessionLocaleResolver为例,在servlet context xml配置文件中增加如下配置 
    Xml代码  收藏代码
    1. <bean id="localeResolver"  
    2.     class="org.springframework.web.servlet.i18n.SessionLocaleResolver">  
    3. </bean>     


    新增一个controller,来提供更换locale功能。 
    Java代码  收藏代码
    1. @Controller  
    2. public class LocalChange {  
    3.   
    4.     @Autowired  
    5.     private LocaleResolver localeResolver;  
    6.       
    7.     @RequestMapping("/changeLocale")  
    8.     public String changeLocal(String locale,  
    9.             HttpServletRequest request,  
    10.             HttpServletResponse response){  
    11.         Locale l = new Locale(locale);  
    12.         localeResolver.setLocale(request, response, l);  
    13.         return "redirect:helloworld";  
    14.     }   
    15. }  


    可分别访问http://localhost:8080/springmvc/changeLocale?locale=en 
    http://localhost:8080/springmvc/changeLocale?locale=zh_CN 
    来查看更换语言后的结果。 

    除以以上方式来变更样式外,spring mvc还提供了一个 LocaleChangeInterceptor拦截器来在request时根据request 参数中的locale参数的内容来实时变更Locale。 
    示例代码如下 
    在servlet context xml配置文件中新增拦截器, 
    Xml代码  收藏代码
    1. <mvc:interceptor>  
    2.   <mvc:mapping path="/*" />  
    3.   <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  
    4. </mvc:interceptor>  


    此时访问 http://localhost:8080/springmvc/helloworld?locale=en ,可以查看动态更换locale后的效果。 



    Theme 
    Spring MVC中通过ThemeSource接口来提供对动态更换样式的支持,并提供了ResourceBundleThemeSource这个具体实现类来提供通过properties配置文件对theme中的样式的配置 
    例如配置文件中 内容为 helloworld=theme/default/css/helloworld.css 
    而jsp文件中使用 
    <link rel="stylesheet" type="text/css" 
    href="<spring:theme code='helloworld'/>" /> 
    来引用对helloworld这个样式文件的引入。由此来实现样式文件的动态引用,从而使spring mvc中可以实现换肤功能。 
    如果说ThemeSource接口是提供了如何去取当前的theme的code与实际内容的mapping关系,那么spring mvc提供的另外一个interface ThemeResolver则是提供了如何去设置当前使用的theme的手段。 
      Spring MVC提供了三个ThemeReslover的实现类,分别是 
    FixedThemeResolver:固定格式的theme,不能在系统运行时动态更改theme. 
    SessionThemeResolver:theme name存放在session中key值为 org.springframework.web.servlet.theme.SessionThemeResolver.THEME 的session attribute中。可在运行中通过更改session中的相应的key值来动态调整theme的值。 
    CookieThemeResolver:theme name存放在cookie中key值为 org.springframework.web.servlet.theme.CookieThemeResolver.THEME 中。可在运行中通过更改cookie中的相应的key值来动态调整theme的值。 
    以上Themesource和ThemeResolver在servlet context xml中的配置示例如下 

    Xml代码  收藏代码
    1. <bean  
    2.     class="org.springframework.ui.context.support.ResourceBundleThemeSource"  
    3.     id="themeSource">  
    4.     <property name="basenamePrefix" value="theme."></property>  
    5. </bean>  
    6.   
    7.     <bean id="themeResolver"  
    8.     class="org.springframework.web.servlet.theme.SessionThemeResolver">  
    9.     <property name="defaultThemeName" value="grey" />  
    10. </bean>  

    从以上配置可以看出,我们使用了一个sessionThemeReslover(bean name 必须为themeReslover,因为这个值是hardcode在DispatcherServlet中的),缺省的themeName为grey。 
    而ThemeSource中我们的配置的basenamePrefix为”theme.”,这里表示spring mvc将从classes/theme/目录下对应的themename.properties中读取配置,例如我们这里配置的是grey,则将从classes/theme/grey.properties中读取theme code的配置。 
    下面我们将新建3个theme,分别为default,red和blue,存放目录如下。 
     

    并修改helloworld.jsp,按前面所介绍的,增加对换肤功能的支持。 

    Jsp代码  收藏代码
    1. <link rel="stylesheet" type="text/css"  
    2.     href="<spring:theme code='helloworld'/>" />  
    3. </head>  
    4. <body>  
    5.     <h1>Hello World!</h1>  
    6.     [color=red]<div id="divTheme"></div>[/color]  

    这里新增一个div来展示换肤前后的效果 

    新增一个controller,来提供换肤功能。 

    Java代码  收藏代码
    1. @Controller  
    2. public class ThemeChange {  
    3.     private final Log logger = LogFactory.getLog(getClass());  
    4.       
    5.     @Autowired  
    6.     private ThemeResolver themeResolver;  
    7.   
    8.     @RequestMapping("/changeTheme")  
    9.     public void changeTheme(HttpServletRequest request,  
    10.             HttpServletResponse response, String themeName) {  
    11.         logger.info("current theme is " + themeResolver.resolveThemeName(request));  
    12.         themeResolver.setThemeName(request, response, themeName);  
    13.         logger.info("current theme change to " + themeResolver.resolveThemeName(request));  
    14.     }  
    15. }  


    可访问 http://localhost:8080/springmvc/ 看到一个缺省的灰色的div层, 
    访问 localhost:8080/springmvc/changeTheme?themeName=red 后,刷新页面,div的样式将发生变化 

    除以以上方式来变更样式外,spring mvc还提供了一个 ThemeChangeInterceptor 拦截器来在request时根据request 参数中的theme的内容来动态变更样式。 
    实例代码如下 
    在servlet context xml配置文件中新增拦截器, 
    Xml代码  收藏代码
    1. <mvc:interceptor>  
    2.   <mvc:mapping path="/*" />  
    3.   <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />  
    4. </mvc:interceptor>  


    此时访问 http://localhost:8080/springmvc/?theme=blue ,可以查看动态换肤后的效果。 
  • 相关阅读:
    今年暑假不AC
    亲和数
    改革春风吹满地
    hdu人见人爱A^B
    男人必看的10部电影
    富人和穷人之间的经典差异
    今日十句英文
    看透一个人起码要看的。
    人生经典20句
    解决ubuntu中mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/chenying99/p/2505646.html
Copyright © 2020-2023  润新知