SpringMVC的国际化
国际化的概述
默认情况下,SpringMVC根据Accept-Language参数判断客户端的本地化类型。
国际化运行流程:
当接收到请求的时候,SpringMVC会在上下文中查找一个本地化解析器(LocalResolver),找到它之后,使用它获取请求的本地化类型信息。
SpringMVC还允许装配一个洞更改本地化类型的拦截器,这样通过一个请求参数就可以控制单个请求的本地化类型。
SessionLocalReslover和LocalChangeInterceptor
例子:1
在程序代码中得到配置的语言文件代码如下:
@Autowired
//在mvc容器中已经配置,让其自助注入
private ResourceBundleMessageSource messageSource;
@RequestMapping("/i18n")
//输入国际化的参数对象locale
public String i18ntest(Locale locale){
//参数一输入想得到的对象key
String val = messageSource.getMessage("i18n.user", null, locale);
System.out.println(val);
return "i18n";
}
例子:2实现页面语言的选切换:
(1)首先SpringMVC.xml配置
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 国际化配置 -->
<bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value = "i18n"> </property>
</bean>
<!-- 配置sessionLocaleResolver -->
<bean id = "localeResolver" class= "org.springframework.web.servlet.i18n.SessionLocaleResolver">
</bean>
<!-- 配置mvc的过滤器 -->
<mvc:interceptors>
<!-- 配置语言改变的过滤器 -->
<bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
<mvc:view-controller path="/i18n2" view-name="i18n2"/>
(2)在handler写入处理方法:
@Autowired
//在mvc容器中已经配置,让其自助注入
private ResourceBundleMessageSource messageSource;
@RequestMapping("/i18n")
//输入国际化的参数对象locale
public String i18ntest(Locale locale){
//参数一输入想得到的对象key
String val = messageSource.getMessage("i18n.user", null, locale);
System.out.println(val);
return "i18n";
}
(3)选项界面简答的超链接
<a href = "i18n?locale=zh_CN"> 中文</a>
<a href = "i18n?locale=en_US"> ENGLISH</a>
注:传入的参数是改变的语言,
zh_CN:中国大陆
en_US:美式英语
(4)语言界面简单的超链接:
<fmt:message key="i18n.user"></fmt:message>
配置文件如下:
i18n_zh_CN
i18n.user=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801
i18n_en_US
i18n.user=user
i18n.password=password
文件上传:
SpringMVC为文件上传提供了直接的支持,这种支持就是通过即插即用MultipartResolver实现的。Spring用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver
SpringMVC上下中默认没有装配MultipartResolver,因此默认的情况下不能处理文件的上传工作,如果想要使用Spring的文件上传功能,需要在上下文中配置MultipartResolver
配置MultipartResolver
defaultEncoding:必须与用户的JSP的pageEncoding属性是一致的,以便正确的解析表单的内容
为了让CommonsMultipartResolver正确工作,必须先将Jakarta Commons FileUpload以及Jakarta Commons io的包添加到工程路径中。
例子:
(1)导入所需要的jar包
Jakarta Commons io ,mvc已经自动配置了commons.FileUpload包,我们只需要导入commons.io包即可。
(2)配置springmvc.xml文件:
<!-- 配置 CommonsMultipartResolver-->
<bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置字符集需要与jsp的字符集相同 -->
<property name="defaultEncoding" value = "UTF-8"></property>
<!-- 配置最大上传文件大小 -->
<property name="maxUploadSize" value = "102400"></property>
</bean>
(3)书写上传的form表单
<form action="loadup" method = "post" enctype="multipart/form-data">
<input type = "file" name ="file">
<input type= "text" name = "desc">
<input type= "submit" value= "loadon">
</form>
(4)书写handler处理方法:
public String loadup(@RequestParam("file") MultipartFile file , @RequestParam("desc") String desc) throws Exception{
System.out.println("文件描述"+desc);
String filename = file.getOriginalFilename();
System.out.println("文件名:"+filename);
InputStream in = file.getInputStream();
byte[] b = new byte[in.available()];
in.read(b);
System.out.println(new String(b));
return "../index";
}
自定义拦截器
SpringMVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器类实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
1.preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序猿决定该拦截器对请求进行拦截并且在拦截后还要调用其他的拦截器或者是业务处理器进行处理,则返回true;如果程序猿决定不需要在调用其他的组件进行处理,则返回false
2.postHandle():这个方法在业务处理器处理请求后,但是DispatcherServlet向客户端返回向前调用,在该方法中对用户请求request进行处理。
3.afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在这个方法中编写资源销毁的代码。
例子
(1)第一个拦截器的代码
package com.oracle.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("FirstInterceptor afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("FirstInterceptor postHandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("FirstInterceptor preHandle");
return true;
}
}
(2)第二个拦截器的代码
package com.oracle.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Secondinterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("Secondinterceptor afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("Secondinterceptor afterCompletion");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println(" Secondinterceptor preHandle");
return true;
}
}
(3)SpringMVC.xml的配置文件
<!-- 配置mvc的过滤器 -->
<mvc:interceptors>
<bean class = "com.oracle.handler.FirstInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class = "com.oracle.handler.Secondinterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器运行流程: