SpringMVC
类型转化器
介绍:
1.web开发中,网页中的数据类型十分贫乏,通常只有字符串和字符串数组,但是后台数据处理中需要丰富的数据类型,因此必须进行数据类型转换.
2.SpringMVC上下文中内建了许多类型转换器,可以实现大多数Java类型转换的功能.例如: 基本类型与String的转换,数字与字符的转换.
类型转换分类:
页面数据类型 转为 后台数据类型
后台数据类型 转为 页面数据类型
注意: “页面->后台"或"后台->页面”,在定义和使用类型转换器时,步骤和思路完全相同
日期类型转换
SpringMVC内置了Date与字符串的类型转换器,可以将"yyyy/MM/dd"格式的字符串转为Date对象.
页面数据类型 转为 后台数据类型
全局类型转换:[针对整个项目,有效]
自定义日期类型转换器
局部类型换行: [针对指定数据转换有效]
@DateTimeFormat(pattern = "yyyy-MM-dd")
注意: Bean必须交给Spring容器管理
<mvc:annotation-driven />必配
后台数据类型 转为 页面数据类型: [Java对象–>String]
全局类型转换:[针对整个项目,有效]
自定义日期类型转换器
局部类型换行: [针对指定数据转换有效]
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatDate value="${requestScope.user.birth }" pattern="yyyy*MM*dd" />
编写类型转换器的步骤:
第1步: 编写Java类,实现类型转换器接口
public class MyDateConvert implements Converter<String, Date> {//S:原数据类型[被转换的数据] T:转换后的数据类型
@Override
public Date convert(String source) {//参数为被转换的数据,SpringMVC自动传入
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");//yyyy年MM月dd日
Date date=null;
try {
date=dateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
注意:
1.必须将类型转换器交个Spring容器管理
第2步: 注册类型转换器
注册类型转换器: 任意方式实现控制反转均可
配置类型转换器:
<bean id="转换器匿名" class="ConversionServiceFactoryBean类全名">
<property name="converters">
<set>
<ref bean="Bean对象匿名1[自定义类型转换器]" />
<ref bean="Bean对象匿名2[自定义类型转换器]" />
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="转换器匿名" />
拦截器
介绍:
拦截器可以拦截Action请求,以实现特定的拦截处理.SpringMVC中预置了许多拦截器,同时支持自定义拦截器.自定义拦截器只需实现HandlerInterceptor接口,并注册即可.
实现步骤:
第1步: 编写Java类,实现HandlerInterceptor接口
快捷键: Ctrl+i
public class MyIntercept1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("处理方法执行之前,运行preHandle()");
return true;//是否释放请求
}
//Action方法
@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()");
}
}
第2步: 在SpringMVC配置文件中,注册自定义拦截器.
配置文件:
<mvc:interceptors>
<!-- 第1种方式: 默认拦截所有Action请求 -->
<bean class="自定义拦截器类全名">
<!-- 第2种方式: 配置拦截资源和不拦截资源 -->
<mvc:interceptor>
<!-- 设置拦截器 拦截的URI -->
<mvc:mapping path="请求映射URI" />
<!-- 设置拦截器 不拦截的URI[可选] -->
<mvc:exclude-mapping path="请求映射URI" />
<!-- 定义拦截器 -->
<bean class="自定义拦截器类全名" />
</mvc:interceptor>
</mvc:interceptors>
注意: 方式2,必须按照标签顺序编写,且只能编写1个
第3步: 访问Action,验证拦截器
延伸:
原理:
SpringMVC根据拦截器注册顺序,依次执行每个拦截器的preHandle(),然后倒序执行每个拦截器的postHandle(),最后倒序执行每个拦截器的afterCompletion().若第N个拦截器的preHandle()返回false.将不再执行之后拦截器的所有方法[包含处理方法],然后倒序执行前(N-1)个拦截器的afterCompletion().