SpringMVC拦截器功能 ,全局异常功能,返回jason数据功能
一、拦截器功能
1)声明一个类,并且实现HandlerInterceptor,重写里面的方法
解释一下重写的这三个方法
1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return false;
}
2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后通过DispatcherServlet向客户端返回响应
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {}
3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {}
2)配置拦截器,在spring mvc的配置文件加上
<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<!-- <bean class="xxxx"/> --> /需要修改
<mvc:interceptor>
<!-- 进行拦截:/**表示拦截所有controller -->
<!-- 进行拦截:/*是会分层级的 -->
<mvc:mapping path="/**" />
<!-- 不进行拦截 -->
<mvc:exclude-mapping path="/index.html"/>
<!-- 自定义的拦截器的类 -->
<bean class="xxxx"/> //需要修改
</mvc:interceptor>
</mvc:interceptors>
在上面的 中写上前面定义的那个拦截器的类的路径
填写上一下不进行拦截的页面
3.编写登录拦截器首先思路是如果登录的对象为空则拦截,不给他过,也就是第一个重写的方法的返回值为false(首先获取session作用域,然后获取对象,判断对象是否为空)
如果登陆成功后那controller层会放到session作用域里面,然后我们在这里判断这个作用于里面有没有这个对象就行了
4.定义一个LoginController.java文件,在里面编写登录的逻辑,如果登录成功后就塞进对象里面,然后再将对象塞进session作用域里面,并且进行跳转
解释一下这里的跳转后重定向的路径,如果在redirect重定向过去的路径上面加上斜杠/,如果添加斜杠,默认没有工程名称,然后就要在url前面加上项目名称,在参数列表里面加多一个request作用域参数,然后再利用作用域获取项目路径httpServletRequest.getContextPath()ok,完工
二、全局异常
在我们页面遇到异常的时候,它会跳到异常页面,而在客户浏览的时候我们不可能给客户呈现出这些异常的页面,所以当我们遇到异常页面的时候需要跳转到404页面
1)声明一个类,并且实现HandlerExceptionResolver
2)把这个类放到spring 容器里面
三、Springmvc返回json
作用:和前端做交互的时候ajax请求的时候,返回页面的,有时候是要返回json数据,也就是在1.操作数据库增删改给用户提示信息 2.前后端分离,使用json返回数据
1)添加项目依赖
<!-- 支持json转换 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
2)在方法上添加@ResponseBody
添加上这个注解以后return “list” 这类等就不是返回页面了,而是返回字符串了
如果我们要返回字符串内容,并不是返回页面,那么就在方法上面添加@ResponseBody的注解即可
在前面制作的拦截器上面加上特权让他通过,不拦截
四,最后总结
*spring mvc 处理流程
1.用户发送请求至 前端控制器DispatcherServlet。
2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。
3.处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。
4.前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。
5.执行处理器(Controller,也叫后端控制器)
6.处理器Controller执行完后返回ModelAnView。
7.处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。
8.前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。
9.视图解析器ViewResolver解析后返回具体的视图View。
10.前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)
11.前端控制器DispatcherServlet响应用户。