看了很多博客说的都是springBoot与thymeleaf的国际化实现,springBoot已经完成了大部分的mvc web配置,而这里只需要用到Spring MVC+thymeleaf的模版框架,完成一个非前后端分离的后台管理
- 目录结构
后台模版的静态文件、国际化语言、WEB-INF放在webapp模块录下,HTML文件放在WEB-INF/templates。
更正!!!国际化语言只能放在java项目的resource!!!!,懒得改图了,测试了一下放在webapp不能识别到配置内容 - 配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/appconfiguration.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>kin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>kin</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
kin-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.kin.dao"/>
<context:component-scan base-package="com.kin.domain"/>
<context:component-scan base-package="com.kin.web"/>
<context:component-scan base-package="com.kin.service"/>
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/lib/**" location="/lib/"/>
<!--这里没有使用jsp文件,所以不需要配置-->
<!--
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="order" value="2"/>
<property name="suffix" value=".jsp"/>
</bean>
-->
<!-- 模版解析器-->
<bean id="servletContextTemplateResolverId" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 指定文件夹-->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 指定文件后缀-->
<property name="suffix" value=".html"/>
<!-- 指定模版样式-->
<property name="templateMode" value="HTML5"/>
<!-- 关闭缓存-->
<property name="cacheable" value="false"/>
<property name="characterEncoding" value="utf-8"/>
</bean>
<bean id="templateEngineId" class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver" ref="servletContextTemplateResolverId"/>
<!--国际化必须加上这个-->
<property name="templateEngineMessageSource" ref="messageSourceId"/>
</bean>
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngineId"/>
<property name="characterEncoding" value="utf-8"/>
<property name="viewNames" value="*.html"/>
<property name="order" value="1"/>
</bean>
<!--解析文本消息,实现国际化-->
<bean id="messageSourceId" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<!-- 可以实现多个语言配置-->
<value>/login</value>
</list>
</property>
</bean>
<!-- 注入自定义实现的LocalResolver-->
<bean id="resolverId" class="com.kin.config.MyLocalResolver"/>
</beans>
- MyLocaleResolver.java
这个文件是定义在页面上点击语言切换时,截取参数中的"l=cn_zh或l=en_us",从而生成新的locale
package com.kin.config;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* @author pandas
* @ClassName MyLocalResolver
* @Description 实现LocaleResolver,达到拦截中英文的链接参数
* @create 2019/10/14 11:50
*/
public class MyLocalResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String lang=httpServletRequest.getParameter("l");
Locale locale=Locale.getDefault();
if (!StringUtils.isEmpty(lang)){
String[] split = lang.split("_");
locale=new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
}
- 国际化文件
login.properties
login.forgot=Forgot password?
login.password=Password
login.rememberme=Remember me
login.signin=Sign In
login.tip=Please sign in
login.username=Username
login_zh_cn.properties
login.forgot=忘记密码?
login.password=密码
login.rememberme=记住我
login.signin=登录
login.tip=请登录
login.username=用户名
login_cn_us.properties
login.forgot=Forgot password?
login.password=Password
login.rememberme=Remember me
login.signin=Sign In
login.tip=Please sign in
login.username=Username
5.html文件
<form class="form-login" action="index.html">
<h2 class="form-login-heading" th:text="#{login.tip}">sign in now</h2>
<div class="login-wrap">
<input type="text" th:name="userName" class="form-control" th:placeholder="#{login.username}" placeholder="User ID" autofocus>
<br>
<input type="password" th:name="password" class="form-control" th:placeholder="#{login.password}" placeholder="Password">
<label class="checkbox">
<input type="checkbox" value="remember-me"> [[#{login.rememberme}]]
<span class="pull-right">
<a data-toggle="modal" href="login.html#myModal" th:text="#{login.forgot}"> Forgot Password?</a>
</span>
</label>
<button class="btn btn-theme btn-block" href="index.html" type="submit" th:text="#{login.signin}"><i class="fa fa-lock"></i> SIGN IN</button>
<br>
<div class="languge">
<a class="" href="#" th:href="@{/index.html(l='zh_CN')}">chinese</a>
<a class="" th:href="@{/index.html(l='en_us')}">English</a>
</div>
<hr>
<p class="login-p-error" th:type="text" th:text="#{msg}" ></p>
</div>
<!-- Modal -->
<div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" id="myModal" class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Forgot Password ?</h4>
</div>
<div class="modal-body">
<p>Enter your e-mail address below to reset your password.</p>
<input type="text" name="email" placeholder="Email" autocomplete="off" class="form-control placeholder-no-fix">
</div>
<div class="modal-footer">
<button data-dismiss="modal" class="btn btn-default" type="button">Cancel</button>
<button class="btn btn-theme" type="button">Submit</button>
</div>
</div>
</div>
</div>
<!-- modal -->
</form>
6.效果