spring mvc+cookie,實現網站前後臺語言切換
阿新 • • 發佈:2019-01-10
一、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
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&useUnicode=true&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&useUnicode=true&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(); }
到此配置完成後,我們的資料來源也可以隨靜態資源一起切換了!