forward:视图完整路径
redirect:视图完整路径
框架使用的是集中的异常处理,把各个Controller中抛出的异常集中到一个地方处理,处理异常的叫做异常处理器,
框架中使用两个注解完成异常的集中处理,这样每个Controller就不用单独处理异常了,注解是:
1.@ExceptionHandler:放在方法的上面,表示方法可以处理某个类型的异常,当异常发生时,执行这个方法,
2.@ControllerAdvice:放在类的上面,表示这个类有异常处理的方法,相当于aop中的Aspect.@ControllerAdvice看作是控制器增强,就是给Controller类增加异常(切面)的处理功能。
转到
拦截器:是springmvc框架中的一种对象,需要实现接口HandlerInterceptor,拦截用户请求,拦截到controller中共用的功能定义到拦截器。
特点:
1.拦截器可以分为系统拦截器和自定义拦截器。
2.一个项目可以设置多个拦截器,0个或多个自定义拦截器。
3.拦截器侧重拦截用户请求。
4.拦截器是在请求处理之前执行的,
拦截器的定义:
1.创建类实现拦截器接口Handler’Interceptor,实现接口中的方法(3个)
2.在springmvc的配置文件中,声明拦截器对象,并指定拦截的url地址。
package net.biancheng.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class TestInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法在控制器的处理请求方法调用之前执行");
return false;
}
}
上述拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法,说明如下。
preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续 *** 作,返回 true 表示继续向下执行,返回 false 表示中断后续 *** 作。
postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
让自定义的拦截器生效需要在 Spring MVC 的配置文件中进行配置,配置示例代码如下:
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置一个全局拦截器,拦截所有请求 -->
<bean class="net.biancheng.interceptor.TestInterceptor" />
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截作用的路径 -->
<mvc:exclude-mapping path="" />
<!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="net.biancheng.interceptor.Interceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/gotoTest" />
<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="net.biancheng.interceptor.Interceptor2" />
</mvc:interceptor>
</mvc:interceptors>
在上述示例代码中,元素说明如下。
mvc:interceptors:该元素用于配置一组拦截器。
:该元素是 mvc:interceptors 的子元素,用于定义全局拦截器,即拦截所有的请求。
mvc:interceptor:该元素用于定义指定路径的拦截器。
mvc:mapping:该元素是 mvc:interceptor 的子元素,用于配置拦截器作用的路径,该路径在其属性 path 中定义。path 的属性值为/**时,表示拦截所有路径,值为/gotoTest时,表示拦截所有以/gotoTest结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过 mvc:exclude-mapping 子元素进行配置。
需要注意的是,mvc:interceptor 元素的子元素必须按照 mvc:mapping.../、mvc:exclude-mapping.../、
多个拦截器的执行顺序,
为什么要使用多个拦截器?
1.把验证功能分散到独立的拦截器,把每个拦截器当作单一的验证处理。
2.组合多个拦截器,
1.拦截器是springmvc框架中的对象,过滤器是servlet中的对象。
2.拦截器对象是框架容器创建的,过滤器对象是tomcat创建的对象。
3.拦截器是侧重对请求做判断的,处理的,可以拦截请求,过滤器是侧重对request,response对象的属性,参数设置值的,例如resquest。setcharacterEncoding(“utf-8”)
4.拦截器的执行时间有三个,控制器方法之前,之后,请求完成后,过滤器是在请求之前,
5.拦截器是拦截对controller,动态资源请求的,过滤器可以过滤所有请求动态和静态的。
6.拦截器和过滤器一起执行的,先执行的过滤器,后面是中央调度器,后面才是拦截器,再后面是控制器方法,
其他内容转向
先点赞,后观看,goodgoodstay
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)