zoukankan      html  css  js  c++  java
  • SpringMVC学习系列(8) 之 国际化

    一.基于浏览器请求的国际化实现:

    1)在 spring的配置文件中添加

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!-- 国际化信息所在的文件名 -->                     
        <property name="basename" value="locale/message" />   
        <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  -->               
        <property name="useCodeAsDefaultMessage" value="true" />           
    </bean>
    

    2)在resources 下 建立文件夹 locale ,在locale下添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件

    比如 resources/locale/messages_zh_CN.properties  下的内容

    message.login.fail=登录失败
    message.login.success=登录成功
    

    比如 resources/locale/messages_en_US.properties  下的内容

    message.login.fail=Login Fail
    message.login.success=Login Success
    

    3)在后台中读取资源化文件中的内容,并返回给前台

    在Controller 文件添加一个方法

        @RequestMapping(value = "/testMessage.do")
        public String testMessage(HttpServletRequest request,Model model)
        {
            logger.debug("enter MainController.testMessage()");
            
            //从后台代码获取国际化信息
            RequestContext requestContext = new RequestContext(request);
            model.addAttribute("message", requestContext.getMessage("message.login.success"));
            return "testmessage";
        }
    

    4)前台显示

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        下面展示的是后台获取的国际化信息:<br/>
    ${message}

    在前台上直接显示国际化文件中的内容
    <spring:message code="message.login.fail" ></spring:message> </body> </html>

      

    二.基于Session的国际化实现:

    1)在 spring的配置文件中添加

    <mvc:interceptors>  
        <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> 
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  
    </mvc:interceptors>  
    
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
    

    2)在后台中

    @RequestMapping(value = "/sessiontest", method = {RequestMethod.GET})
    public String seesionTest(HttpServletRequest request, Model model,
    @RequestParam(value = "langType", defaultValue = "zh") String langType)
    {

    if (langType.equals("zh"))
    {
    Locale locale = new Locale("zh", "CN");
    request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
    }
    else if (langType.equals("en"))
    {
    Locale locale = new Locale("en", "US");
    request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
    }
    else
    request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
    LocaleContextHolder.getLocale());

    // 从后台代码获取国际化信息
    RequestContext requestContext = new RequestContext(request);
    model.addAttribute("message", requestContext.getMessage("message.login.success"));
    return "testmessage";
    }

     3) 同上

      4) 在jsp 页面上加入

    使用session 切换
    <a href="${ctx }/sessiontest?langType=zh">中文</a> | <a href="${ctx }/sessiontest?langType=en">英文</a><br/>
    ${message}<br>

    三.基于Cookie的国际化实现:

    同session 类似,不与session方式同时存在

    1)在 spring的配置文件中添加

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
    

    2)后台

    @RequestMapping(value = "/cookietest", method = {RequestMethod.GET})
        public String cookietest(HttpServletRequest request, HttpServletResponse response, Model model,
            @RequestParam(value = "langType", defaultValue = "zh") String langType)
        {
            if (langType.equals("zh"))
            {
                Locale locale = new Locale("zh", "CN");
                (new CookieLocaleResolver()).setLocale(request, response, locale);
            }
            else if (langType.equals("en"))
            {
                Locale locale = new Locale("en", "US");
                (new CookieLocaleResolver()).setLocale(request, response, locale);
            }
            else
                (new CookieLocaleResolver()).setLocale(request, response, LocaleContextHolder.getLocale());
            
            // 从后台代码获取国际化信息
            RequestContext requestContext = new RequestContext(request);
            model.addAttribute("message", requestContext.getMessage("message.login.success"));
            return "testmessage";
        }
    

     

     3) 同上

      4) 在jsp 页面上加入

    使用cookie 切换
    <a href="${ctx }/cookietest?langType=zh">中文</a> | <a href="${ctx }/cookietest?langType=en">英文</a><br/>
    ${message}<br>

    四.基于URL请求的国际化的实现:

    1)自定义一个类

    import java.util.Locale;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.DispatcherServlet;
    import org.springframework.web.servlet.LocaleResolver;
    
    public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {
    
        private Locale myLocal;
    
        public Locale resolveLocale(HttpServletRequest request) {
            return myLocal;
        } 
    
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
            myLocal = locale;
        }
      
    }
    

      2)在 spring的配置文件中添加

    <bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>
    

      “xx.xxx.xxx”是刚才添加的MyAcceptHeaderLocaleResolver 类所在的包名。

    保存之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 

     

    参考:http://www.cnblogs.com/liukemng/p/3750117.html

  • 相关阅读:
    Mysql字符串字段判断是否包含某个字符串的方法
    mysql中用group_concat把selct中的数据列表转换成逗号分隔的字符串
    iview中对列标题头进行格式渲染render
    iview中父组件的数据通过props属性传值给子组件
    iview分页问题
    iview实现国际化
    MySQL查询优化:GROUP BY
    使用@ContextConfiguration替换@SpringBootTest
    WebAppConfiguration in Spring Tests
    使用@ContextConfiguration或者@ContextWebConfiguration注解调用resource文件夹下面的yml文件
  • 原文地址:https://www.cnblogs.com/panie2015/p/5855645.html
Copyright © 2011-2022 走看看