浅谈springMVC的拦截器、错误异常、数据绑定、属性编辑器
一、拦截器
上篇博文中已经说到过可以继承HandlerInterceptorAdapter类或者实现HandlerInterceptor接口。
这里想说的是对于其方法中一个参数的说明。
?
?注意:
?
1、这里需要说明一点的是,它只能转发到jsp页面,不能转发到Controller;
2、如果错误不能转发到对应的错误页面,请查看你的错误类是否写正确了,如org.springframework.validation.BindException是否写正确。
3、传递到错误页面不能传递参数,如<prop key="java.lang.Exception">unknowError?flag=1</prop>,这么写就不会转发到unknowError.jsp页面了。
4、如果错误页面没有记录错误日志,那么你的log4j日志文件也是不会记录错误日志的,那么我们需要自己手动在错误页面中记录,代码如下:
?
?
说明:根据SimpleMappingExceptionResolver类的源码可知,它将错误日志放在了request的属性变量中,变量名为exception,类型为Exception,需要引入org.apache.log4j.Logger包,这样的话,log4j日志就会记录错误日志了。
5、当然也需要这个配置文件(定义jsp文件的位置):
?
?三、数据绑定
?
上篇博文中有提到在BaseController中定义全局的数据转换(如String转换为Date或者Calendar;如果String转换为JavaBean等),只要注册一个方法protected void ininBinder(WebDataBinder binder){ ?},并且添加注解@InitBinder,就可以实现全局Controller的数据转换。
下面详细介绍下两种方式实现数据的绑定:
1、全局数据绑定
第一种方式,定义一个BaseController,在里面注册一个protected void ininBinder(WebDataBinder binder){},添加注解@InitBinder。【注解式】
第二种方式,定义一个类MyBinder实现WebBindingInitializer接口,同时实现其方法public void initBinder(WebDataBinder binder, WebRequest arg1) {}。【声明式】
接下来需要在spring-mvc.xml中配置,这里要多说一点。
一般大家可能省事,直接写了<mvc:annotation-driven/>来激活@Controller模式,它默认会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,它们是springMVC为@Controllers分发请求所必须的。但是如果你想用声明式注册一个数据绑定,你需要手动注册AnnotationMethodHandlerAdapter和DefaultAnnotationHandlerMapping。
?
当然也可以自定义属性编辑器,你只需继承PropertyEditorSupport类(推荐)或者实现PropertyEditor接口;然后实现其setAsText(String text)方法做自己的操作。
?
?
?