springmvc(四)SpringMVC核心技术

11 篇文章 1 订阅

SpringMVC核心技术

转发和重定向

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.../、<bean…/> 的顺序配置。

多个拦截器的执行顺序,
在这里插入图片描述

在这里插入图片描述

为什么要使用多个拦截器?
1.把验证功能分散到独立的拦截器,把每个拦截器当作单一的验证处理。
2.组合多个拦截器,

拦截器和过滤器的对比

1.拦截器是springmvc框架中的对象,过滤器是servlet中的对象。
2.拦截器对象是框架容器创建的,过滤器对象是tomcat创建的对象。
3.拦截器是侧重对请求做判断的,处理的,可以拦截请求,过滤器是侧重对request,response对象的属性,参数设置值的,例如resquest。setcharacterEncoding(“utf-8”)
4.拦截器的执行时间有三个,控制器方法之前,之后,请求完成后,过滤器是在请求之前,
5.拦截器是拦截对controller,动态资源请求的,过滤器可以过滤所有请求动态和静态的。
6.拦截器和过滤器一起执行的,先执行的过滤器,后面是中央调度器,后面才是拦截器,再后面是控制器方法,

springmvc执行流程

在这里插入图片描述
在这里插入图片描述
其他内容转向

先点赞,后观看,goodgoodstay

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值