springMVC國際化配置和使用


下面是基於session的,springMVC國際花的一個例子:    

需求是

輸入url:展示中文界面

http://localhost:8080/MySSM/user?lang=zh

輸入url:  展示英文界面

http://localhost:8080/MySSM/user?lang=en

下面是我demo項目的例子使用:

1.工程結構:

2.springMVC配置文件中 國際化相關的配置:

    <!-- 存儲區域設置信息
         SessionLocaleResolver類通過一個預定義會話名將區域化信息存儲在會話中。
     -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
    
    <!-- 國際化資源文件 -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <!-- 如果在國際化資源文件中找不到對應代碼的信息,就用這個代碼作為名稱  -->               
        <property name="useCodeAsDefaultMessage" value="true" />  
    </bean>
    
    <mvc:interceptors>
        <!-- 該攔截器通過名為”lang”的參數來攔截HTTP請求,使其重新設置頁面的區域化信息 -->
        <!-- <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  -->
        <bean class="com.cy.interceptor.LanguageInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors>
View Code

注意我重新使用了自己的攔截器:com.cy.interceptor.LanguageInterceptor

因為原來的攔截器org.springframework.web.servlet.i18n.LocaleChangeInterceptor,瀏覽器必須要輸入lang=en_US,lang=zh_CN,才能改變語言。但是覺得輸入這么多麻煩,因為一般就認為zh中文,en英文了。

 

3.語言LanguageInterceptor.java:

我只是把LocaleChangeInterceptor源代碼拷貝了一部分過來;做些修改,主要是:

localeResolver.setLocale(request, response, newLocale)設置語言了;

package com.cy.interceptor;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.support.RequestContextUtils;

/**
 * 語言攔截器
 * @author CY
 *
 */
public class LanguageInterceptor extends HandlerInterceptorAdapter{
    
    /**
     * Default name of the locale specification parameter: "locale".
     */
    public static final String DEFAULT_PARAM_NAME = "locale";
    private String paramName = DEFAULT_PARAM_NAME;
    
    public void setParamName(String paramName) {
        this.paramName = paramName;
    }
    public String getParamName() {
        return this.paramName;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Locale newLocale = getLocale(request.getParameter(getParamName()));
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
        
        if (localeResolver == null) {
            throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
        }
        
        localeResolver.setLocale(request, response, newLocale); return true;
    }
    

    //根據language 獲取Locale
    public static Locale getLocale(String language){
        Locale locale = new Locale("zh", "CN"); if(language!=null && language.equals("en")){
            locale = new Locale("en", "US");
        }
        
        return locale;
    }
    
}

4.如果想在controller中獲取messages配置文件中的值怎么做呢?

下面是一部分代碼:

import org.springframework.web.servlet.support.RequestContext;
import org.springframework.web.servlet.support.RequestContextUtils;
import java.util.ResourceBundle;

@Controller
public class UserController {
    private static Logger logger = Logger.getLogger(UserController.class);
    
    @Autowired
    private UserService userService;
    
    
    /**
     * 從國際化資源配置文件中根據key獲取value 方法一
     * @param request
     * @param key
     * @return
     */
    public static String getMessage(HttpServletRequest request, String key){
        Locale currentLocale = RequestContextUtils.getLocale(request);
        String lang = currentLocale.getLanguage();
        ResourceBundle bundle = ResourceBundle.getBundle("messages_"+lang, currentLocale);
        return bundle.getString(key);
    }
    /**
     * 從國際化資源配置文件中根據key獲取value 方法二
     * @param request
     * @param key
     * @return
     */
    public static String getMessage2(HttpServletRequest request, String key){
        RequestContext requestContext = new RequestContext(request);
        String value = requestContext.getMessage(key);
        return value;
    }
    
    
    @RequestMapping("/user")
    public ModelAndView getUsers(HttpServletRequest request){
        List<VoUser> userList = userService.getUsers();
        
         ModelAndView mv =  new ModelAndView();
         
         //從message中獲取文字
         //String showUserInfo = getMessage(request, "showUserInfo");
         String showUserInfo = getMessage2(request, "showUserInfo");
         
         mv.addObject("showUserInfo", showUserInfo);
         mv.addObject("userList", userList);
         mv.setViewName("user");
         return mv;
    }
    
}

5.jsp中使用spring:message code:主要是:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<spring:message code="userName"/>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="resources/bootstrap/bootstrap.min.css">
<title><spring:message code="userManage"/></title>
<style type="text/css">
.container{
    margin-top: 30px;
}
.imgclass{
    height: 100px;
}
</style>
</head>
<body>

<div class="container">
    <p class="text-center bg-success">${showUserInfo}</p>
    <div class="form-horizontal">
        <c:forEach var="user" items="${userList }">
          <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label"><spring:message code="userName"/></label>
            <div class="col-sm-10">
              <input class="form-control" placeholder="Email" value="${user.name }">
            </div>
          </div>
          <div class="form-group">
            <label for="inputPassword3" class="col-sm-2 control-label"><spring:message code="age"/></label>
            <div class="col-sm-10">
              <input class="form-control" placeholder="Password" value="${user.age }">
            </div>
          </div>
          <div class="form-group">
            <label for="inputPassword3" class="col-sm-2 control-label"><spring:message code="photoName"/></label>
            <div class="col-sm-10">
              <input class="form-control" value="${user.photoName }">
            </div>
          </div>
          <div class="form-group">
            <label for="inputPassword3" class="col-sm-2 control-label"><spring:message code="photo"/></label>
            <div class="col-sm-10">
                <img class="imgclass" src="getImg?username=${user.name }&photoName=${user.photoName}"/>
            </div>
          </div>
        </c:forEach>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
              <a href="toAddUser" class="btn btn-default"><spring:message code="addUser"/></a>
            </div>
         </div>
    </div>    

</div>
</body>
<script src="resources/js/jquery.min.js"></script>
<script src="resources/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript">
$(function(){
    
});
</script>
</html>
View Code

6.messages_zh.properties和messages_en.properties配置:

userManage=userManagement
userName=username
age=age
photoName=photo name
photo=photo
addUser=add user
showUserInfo=this is display user information
userManage=\u7528\u6237\u7BA1\u7406
userName=\u59D3\u540D
age=\u5E74\u9F84
photoName=\u7167\u7247\u540D\u79F0
photo=\u7167\u7247
addUser=\u589E\u52A0\u7528\u6237
showUserInfo=\u8FD9\u91CC\u662F\u5C55\u73B0\u7528\u6237\u4FE1\u606F

 

效果:

 

 

 

 

 

 

-------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM