长大后想做什么?做回小孩!

0%

拦截器转换器

Spring Web MVC的拦截器类似于servlet开发中的filter过滤器,用于对处理器进行预处理和后处理。

想要写一个拦截器只需要让拦截器实现HandlerInterceptor接口,并在springmvc.xml中进行配置即可使用。

拦截器:

HandlerInterceptor接口:

该接口一共有三个方法:

1
2
3
4
5
6
7
8
9
10
11
12
public interface HandlerInterceptor {
//都是default方法,可以根据需要选择实现
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}

default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}

编写拦截器时需要实现此接口根据不同的需要重写不同的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyHandlerInterceptor1 implements HandlerInterceptor {
// 这个方法是在controller方法执行之前调用的
// 如果返回值为true则继续执行controller方法,反之如果是false则终止controller方法的执行
// 可以用做是否登录的校验,身份权限的检验等等。。。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
// 这个方法是在controller方法执行之后,但视图还没有返回时调用的
// 这里可以得到数据模型和视图(ModelAndView)的信息
// 可以用做在视图返回前对数据模型进行统一的加工处理,加入公用信息以便页面显示等等。。。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
// 这个方法controller方法完全执行完毕并且视图也返回之后调用
// 这个方法可以得到controller执行时的异常信息
// 可以用做记录操作日志等等。。
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
springmvc.xml中配置拦截器:

写好HandlerInterceptor之后需要在springmvc.xml中进行拦截器的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--    配置拦截器-->
<mvc:interceptors>
<!-- 可以配置多个拦截器-->
<mvc:interceptor>
<!-- 进入拦截器的请求路径 /**全部进入拦截器-->
<mvc:mapping path="/**"/>
<!-- 配置具体的拦截器-->
<bean class="nynu.li.interceptor.MyHandlerInterceptor1"></bean>
</mvc:interceptor>

<mvc:interceptor>
<!-- 进入拦截器的请求路径 /**全部进入拦截器-->
<mvc:mapping path="/**"/>
<!-- 配置具体的拦截器-->
<bean class="nynu.li.interceptor.MyHandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>

注意preHandle按拦截器定义顺序调用

postHandler按拦截器定义逆序调用

afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器的preHandle都返回成功才调用

afterCompletion只有自身拦截器的preHandle返回true才调用


转换器:

主要用作自定义参数绑定时,前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。

一般使用<mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。

Converter<S,T>接口:
1
2
3
4
5
6
7
@FunctionalInterface
//S:source 转换源的类型
//T:target 转换目标的类型
public interface Converter<S, T> {
@Nullable
T convert(S var1);
}

要想自定义一个转换器,只需要实现Converter接口即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DateConverter implements Converter<String,Date> {
//时间格式转换器
public Date convert(String date) {
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date targetDate = null;
try {
targetDate = sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return targetDate;
}
}
springmvc.xml中配置拦截器:
1
2
3
4
5
6
7
8
9
10
<!--    配置转换器工厂bean-->
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" name="formattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="nynu.li.converter.DateConverter"></bean>
</set>
</property>
</bean>
<!-- 配置注解驱动,代替了处理器映射器(HandlerMapping)和处理器适配器(HandlerAdapter)-->
<mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"/>