下面内容参考这个博文https://www.cnblogs.com/baiduligang/p/4247164.html记录学到的内容的,文字和图片都是这篇文章里的:

一、拦截器

写一个拦截器,org.springframwork.web.servlet.HandlerInterceptor接口,

org.springframwork.web.servlet.handler.HandlerInterceptorAdapter适配器,实现接口或继承此类,来实现自己的拦截器
Springmvc的拦截器,是属于HandlerMapping级别的,可以有多个Handlermaping,每个HandlerMapping可以有自己的拦截器
拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。如果没有找到处理器,那么这个拦截器就不会被执行。

有三个方法:

controller之前执行:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);

生成视图之前执行:

public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView);

最后执行,可用于释放资源

public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 
在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 
参数中的Object handler是下一个拦截器。

springMvc配置拦截器有几种方式:

1、给每个HandlerMapping都加拦截器,拦截所有的url

学习springMVC

<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

2、拦截匹配的url

学习springMVC

在<mvc:interceptor>标签中通过mappingpath给定匹配url,bean来指出自己写的拦截器是哪个类。如果是REST风格的URL,静态资源也会被拦截。

3、HandlerMapping上的拦截器

学习springMVC

在特定的HandlerMapping上加拦截器,所以如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

需要注意一点:

 如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。

二、异常处理

1、全局异常处理

可以配置全局异常的处理:

学习springMVC

你也可以实现HandlerExceptionResolver接口,写一个自己的异常处理程序。spring的扩展性是很好的。

同时我们也可以为所有的异常指定一个默认的异常提示页面(通过defaultErrorView属性的配置),如果所抛出的异常在exceptionMappings中没有对应的映射,则Spring将用此默认配置显示异常信息。

注意这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在viewResolver中指定。如/error/error表示/error/error.jsp

2、异常记录到日志中

在前的配置中,其中有一个属性warnLogCategory,值是“SimpleMappingExceptionResolver类的全限定名”。我是在SimpleMappingExceptionResolver类父类AbstractHandlerExceptionResolver类中找到这个属性的。查看源码后得知:如果warnLogCategory不为空,spring就会使用apache的org.apache.commons.logging.Log日志工具,记录这个异常,级别是warn。

值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver类的全限定名”。这个值不是随便写的。 因为我在log4j的配置文件中还要加入log4j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WARN,保证这个级别是warn的日志一定会被记录,即使log4j的根日志级别是ERROR。

三、处理Ajax请求

1、需要加入两个jar包:jackson-core-asl-、jackson-mapper-asl-。(-后面是版本号)

2、spring的配置文件中要有这一行,才能使用到spring内置支持的json转换。如果你手工把POJO转成json就可以不须要使用spring内置支持的json转换。

<mvc:annotation-driven />

3、使用@ResponseBody注解

会把方法中返回的内容转换成json

原文地址:http://elf8848.iteye.com/blog/875830

相关文章:

  • 2022-01-20
  • 2021-07-06
  • 2021-06-25
  • 2021-06-19
猜你喜欢
  • 2021-08-19
相关资源
相似解决方案