1. 程式人生 > >spring mvc+cookie,實現網站前後臺語言切換

spring mvc+cookie,實現網站前後臺語言切換

一、spring mvc 靜態資源國際化

1.配置spring mvc 國際化攔截器 <property name="paramName" value="lang" />攔截引數名

       <mvc:interceptors>  
                <!-- 國際化操作攔截器 如果採用基於(請求/Session/Cookie)則必需配置 --> 
                <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  
        </mvc:interceptors>
    <mvc:interceptors>
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors> 

 

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

2.配置國際化資原始檔

    <!-- 國際化資原始檔 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages" />
    </bean>

3.加入spring mvc國際化需要的資原始檔,將資原始檔放到根目錄下面,檔名開頭要和spring mvc配置中的一致<property name="basename" value="messages

" />,messages.properties為spring預設的資原始檔,檔案內可以不寫任何程式碼,但是必須要有。

4、後臺配置完成後,開始在前臺jsp頁面使用。在需要使用國際化的頁面加入spring國際化的標籤:

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

  使用spring國際化標籤,code中對應的值要在spring mvc 國際化資原始檔中配置,沒有的話會報錯。

<spring:message code="INDEX2"/>  //messages資原始檔中配置的INDEX的值將在這裡展示。

 

語言切換的按鈕

到此spring mvc 配置的靜態資源國際化結束。

二、配置資料庫切換。

1.配置spring資料來源切換事物切面

        <!-- 事務切面 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

2.配置資料來源,這裡底層框架使用的是 Mybatis。

    <!--中英切換資料來源配置——————————————————————————start  -->
    <!--資料來源 A-->
    <bean id="dataSourceCn" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <!-- 使用properties來配置 -->
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://xxx.xxx.x.x:xxx/xxx?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
        </property>
        <property name="username">
            <value>xxx</value>
        </property>
        <property name="password">
            <value>xxxxx</value>
        </property>
    </bean>
    <!--資料來源 B-->
    <bean id="dataSourceEn" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <!-- 使用properties來配置 -->
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>${jdbcURL}</value>
        </property>
        <property name="username">
            <value>${jdbcUserName}</value>
        </property>
        <property name="password">
            <value>${jdbcPassword}</value>
        </property>
                
    </bean>
     <!--      資料來源路由 -->
     <bean id="dataSource" class="com.jintuo.bean.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="dataSourceCn" value-ref="dataSourceCn"/>
                <entry key="dataSourceEn" value-ref="dataSourceEn"/>
            </map>
        </property>
         <!-- 預設資料來源 -->
        <property name="defaultTargetDataSource" ref="dataSourceCn"/>
    </bean>
    <!-- 自動掃描了所有的XxxxMapper.xml對應的mapper介面檔案,這樣就不用一個一個手動配置Mpper的映射了,只要Mapper介面類和Mapper對映檔案對應起來就可以了。 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage">
            <!-- <value>com.xide.dao.iface</value> -->
            <value>com.jintuo.dao.iface</value>
        </property>
     </bean>
    <!-- 配置Mybatis的檔案 ,mapperLocations配置**Mapper.xml檔案位置,configLocation配置mybatis-config檔案位置-->
     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
         <property name="mapperLocations" value="classpath:com/jintuo/dao/mapper/*.xml"/>
       <!--  <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> -->
       <!--  <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model"/> -->  
           
    </bean>  
<!--中英切換資料來源————————————————————end! -->

還有一種是使用c3p0配置資料來源

    <!-- 使用C3P0資料來源 -->
    <!--  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://xxx.xxx.x.xx:xxxx/xxxx?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
        </property>
        <property name="user">
            <value>xxx</value>
        </property>
        <property name="password">
            <value>xxx</value>
        </property>
        <property name="maxPoolSize" value="100"></property>
        <property name="maxIdleTime" value="60"></property>  
        <property name="minPoolSize" value="10"></property>
        <property name="maxStatements" value="0"></property>
    </bean>  -->

 

3.spring 資料來源配置好了,開始配置資料來源切換程式碼

  需要切換的資料來源名稱:DataSourceName

public interface  DataSourceName {
       static final String DATA_EN="dataSourceEn";
       static final String DATA_CN="dataSourceCn";
}

  DataSourceContextHolder:

public class DataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
      
    public static void setDbType(String dbType) {  
           contextHolder.set(dbType);  
    }  
 
    public static String getDbType() {  
           return ((String) contextHolder.get());
    }  
 
    public static void clearDbType() {  
           contextHolder.remove();  
    }

}

 

資料來源切換:DynamicDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import util.DataSourceContextHolder;

public class DynamicDataSource extends AbstractRoutingDataSource {
     
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }
 
}

資料來源切換的攔截器:CommonInterceptor

  

public class CommonInterceptor extends HandlerInterceptorAdapter {
    
    private final Log log = LogFactory.getLog(CommonInterceptor.class);  

    /**  
     * 在業務處理器處理請求之前被呼叫  
     * 如果返回false  
     *     從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈 
     * 如果返回true  
     *    執行下一個攔截器,直到所有的攔截器都執行完畢  
     *    再執行被攔截的Controller  
     *    然後進入攔截器鏈,  
     *    從最後一個攔截器往回執行所有的postHandle()  
     *    接著再從最後一個攔截器往回執行所有的afterCompletion()  
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
          log.info("==============登陸攔截開始==================");
          String sessionId = request.getSession().getId();
          String Lang_code = request.getParameter("lang");
          System.out.println("lang_code!!!!!:"+request.getParameter("lang"));
          log.info("==============sessionID:"+sessionId+"==============");
         /* PersonnelVo user=UserUtils.findUserByCache(sessionId);
          if(user==null){
              log.info("====未登陸跳轉到登陸頁面===");
              response.addHeader("t", "111");
//              request.getRequestDispatcher("/upload.jsp").forward(request, response);
              response.sendRedirect("http://localhost/ssm_test/upload.jsp");
              return false;
          }*/
          log.info("==============登陸攔截結束==================");
          log.info("============資料來源選擇開始========");
         Cookie[] cooks=request.getCookies();  //獲取cookie
          String lang="";
          if(cooks!=null){
          for (Cookie cookie : cooks) {  //從cookie中拿到標識
              System.out.println(cookie.getValue());
              if(cookie.getValue().equals("en")||cookie.getValue().equals("cn")){
                  lang=cookie.getValue();
                  //通過標識切換資料來源
              }else{
                  lang="cn";
              }
           }
          }
          DataSourceContextHolder.setDbType(lang.equals("cn")?DataSourceName.DATA_CN:DataSourceName.DATA_EN);

        
          return true;
    }
}

 

 前臺頁面將語言切換時將標識存入cookie中

獲取cookie的工具類:cookies.js

var cookie={   //cookie工具類
    setCookie:function(c_name,value,expiredays){  //設值
        var exdate=new Date()
        exdate.setDate(exdate.getDate()+expiredays)
        document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
    },
    getCookie:function(c_name){   //取值
        if (document.cookie.length>0)
          {
          c_start=document.cookie.indexOf(c_name + "=")
          if (c_start!=-1)
            { 
            c_start=c_start + c_name.length+1 
            c_end=document.cookie.indexOf(";",c_start)
            if (c_end==-1) c_end=document.cookie.length
            return unescape(document.cookie.substring(c_start,c_end))
            } 
          }
        return "";
    },
    checkCookie:function(){   //驗證
        username=getCookie('username')
        if (username!=null && username!="")
          {alert('Welcome again '+username+'!')}
        else 
          {
          username=prompt('Please enter your name:',"")
          if (username!=null && username!="")
            {
            setCookie('username',username,365)
            }
          }
    }
}

 

將切換語言的標誌存入cookie中

var lang = cookie.getCookie("lang");
function changeZh(){  //中文切換
    cookie.setCookie("lang", "cn", 1);
    location.reload();

    
}
function changeEn(){  //英文切換
    cookie.setCookie("lang", "en", 1);
    location.reload();
}

 

到此配置完成後,我們的資料來源也可以隨靜態資源一起切換了!