国际化 | 拦截器
Locale对象,更改Locale对象,改变文字显示的信息 放在session作用域当中
动态设置语言信息
1、配置
注意:id不可更改,不然获取不到值
<!-- 资源文件 id -->
<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
<property name="basename" value="i18n"></property>
</bean>
<!-- 放置在session作用域中-->
<bean class="org.springframework.web.servlet.i18n.SessionLocaleResolver" id="localeResolver"></bean>
<!-- 拦截器-->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
创建资源文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9koKs4MH-1632906653825)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210927171555503.png)]
文件名前缀必须相同,后面的语言和国家缩写(en_US)可以通过测试得到
@Test
public void test01(){
Locale locale=Locale.US;
System.out.println(locale.getLanguage()+"\t"+locale.getCountry());
}
idea中可以将中文自动转译成对应的文字自动转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LaDAMUEY-1632906653827)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210926103203463.png)]
或者创建个文件(eg.D盘下面创建个a.txt)输入在DOS窗口,,切换到D盘,执行下面这个方法
native2ascii a.txt b.txt
a.txt
english:英语
chinese:汉语
转译为b.txt(转为Unicode编码)
english:\u947b\u8fab\ue1e2
chinese:\u59f9\u590e\ue1e2
这样就可以拿来写入文件中了
然后在前端页面同过fmt标签来拿取值
<a href="${pageContext.request.contextPath}/loginjsp?locale=en_US"><fmt:message key="i18n.english"/> </a>
<a href="${pageContext.request.contextPath}/loginjsp?locale=zh_CN"><fmt:message key="i18n.chinese"/> </a>
链接地址为当前页面的映射字段,传参locale=(文件名的后缀),就会自动切换到指定的语言。切记:locale不能写错,初级进入时的语言为浏览器默认的语言类型。
拦截器
自己创建类,实现接口HandlerInterceptor,再重写三个默认的方法
public class firstInterceptors implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行了");
if(request.getSession().getAttribute("name")!=null){
return true;
}else {
request.getRequestDispatcher("WEB-INF/views/login.jsp").forward(request,response);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法执行了");
}
}
preHandle方法在执行 controller方法之前, 如果返回false,下面就不继续走了
postHandle controller方法之后
afterCompletion 视图界面渲染完成之后执行
配置注册
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/logins"/>
<mvc:exclude-mapping path="/index"/>
<bean class="com.ljh.interceptors.firstInterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
其中: /** 指多级路径
exclude-mapping 指不包含,通过改地址不进入拦截器
自定义的拦截器的bean对象需写在
mvc:interceptor
</mvc:interceptor>
多个拦截器,进入的顺序是根据配置的拦截器顺序执行,返回时顺序刚好相反(和filter相同)
-reverse:将Unicode编码转为本地或者指定编码,不指定编码情况下,将转为本地编码。
-encoding encoding_name:转换为指定编码,encoding_name为编码名称。
自动类型转换
日期类型转换:
1、添加注解@DateTimeFormat,后面的pattern是类型
public class Student {
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date1;
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date date2;
}
测试
<form action="${pageContext.request.contextPath}/date" method="post">
姓名<input type="text" name="name">
日期一<input type="text" name="date1">
日期二<input type="text" name="date2">
<p><input type="submit" value="提交"></p>
</form>
@PostMapping(value = "/date")
public void date( Student stu){
System.out.println(stu.getName()+"\t"+stu.getDate1()+"\t"+stu.getDate2());
}
输出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yK1FNjJR-1632906653828)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210929093617028.png)]
日期自动转字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTrIp1UH-1632906653829)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210926161648025.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSCBvfXU-1632906653830)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210926161828632.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POQHhklf-1632906653831)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210926162318480.png)]
1.创建类,实现接口
2、配置conversition…
期自动转字符串
[外链图片转存中…(img-dTrIp1UH-1632906653829)]
[外链图片转存中…(img-bSCBvfXU-1632906653830)]
[外链图片转存中…(img-POQHhklf-1632906653831)]
1.创建类,实现接口
2、配置conversition…
3、配置之后,注解就失效了