SpringMVC的拦截器

1 SpringMVC中拦截器

1.1 作用

作用:类似于javaweb中的Filter,用来对请求进行拦截,可以将多个Controller中执行的共同代码放入拦截器中执行,减少Controller类中代码的冗余.

1.2 特点

  • 拦截器器只能拦截Controller的请求,不能拦截jsp。

  • 拦截器可中断用户的请求轨迹。

  • 请求先经过拦截器,之后之后还会经过拦截器。

1.3开发拦截器

如图所示:在这里插入图片描述
1.引入依赖的代码如下:

<?xml version="1.0" encoding="UTF-8"?>`<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.txw</groupId>
  <artifactId>springmvc_03</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--相关的依赖-->
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <!--springmvc核心依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <!--servlet-api-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <!--文件上传的依赖-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3</version>
    </dependency>
    <!--json依赖-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>springmvc_03</finalName>
  </build>
</project>

如图所示:在这里插入图片描述

如图所示:在这里插入图片描述

如图所示:在这里插入图片描述
/*``:

如图所示:在这里插入图片描述
6.通过浏览器访问:http://localhost:8080/test/test1,如图所示:在这里插入图片描述
控制台打印结果,如图所示:在这里插入图片描述
6.通过浏览器访问:http://localhost:8080/test/test2,如图所示:在这里插入图片描述
控制台打印结果,如图所示:在这里插入图片描述

如图所示:在这里插入图片描述
8.编写User的代码如下:

package com.txw.entity;

import java.util.Date;
/**

  • @author Adair

  • E-mail: 1578533828@qq.com
    */
    public class User {
    private String name;
    private Integer age;
    private Double salary;
    private Boolean sex;
    private Date birthday;

    public User() {
    }

    public User(String name, Integer age, Double salary, Boolean sex, Date birthday) {
    this.name = name;
    this.age = age;
    this.salary = salary;
    this.sex = sex;
    this.birthday = birthday;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public Integer getAge() {
    return age;
    }

    public void setAge(Integer age) {
    this.age = age;
    }

    public Double getSalary() {
    return salary;
    }

    public void setSalary(Double salary) {
    this.salary = salary;
    }

    public Boolean getSex() {
    return sex;
    }

    public void setSex(Boolean sex) {
    this.sex = sex;
    }

    public Date getBirthday() {
    return birthday;
    }

    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }

    @Override
    public String toString() {
    return “User{” +
    “name=’” + name + ‘’’ +
    “, age=” + age +
    “, salary=” + salary +
    “, sex=” + sex +
    “, birthday=” + birthday +
    ‘}’;
    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

如图所示:在这里插入图片描述
9.编写MyInterceptor的代码如下:

package com.txw.interceptor;

import com.txw.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**

  • 自定义拦截器

  • @author Adair

  • E-mail: 1578533828@qq.com
    */
    @SuppressWarnings(“all”) // 注解警告信息
    public class MyInterceptor implements HandlerInterceptor {

    /**

    • 前置处理 请求到达拦截器后会优先执行指定内容
    • 返回值:代表是否执行 false:不执行 中断请求 true:放行 执行后续Controller
    • @param request 请求响应对象
    • @param response 请求响应对象
    • @param o 要访问的目标Controller服务方法
    • @return
    • @throws Exception
      /
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
      System.out.println("-------------1-------------------");
      System.out.println(o);
      // 模拟登录验证 session获取用户对象 进行判断
      /
      User user = (User) request.getSession().getAttribute(“user”);
      if (user != null){
      return true;
      }
      // 跳转登录页面 error.jsp
      response.sendRedirect(request.getContextPath() + “/error.jsp”);*/
      // request.getRequestDispatcher("/error.jsp").forward(request,response);
      return true;
      }

    /**

    • 请求后的处理 在Controller返回后执行指定内容 类似:AOP中的后置通知
    • postHandler执行完成之后开始给客户端进行响应
    • @param request
    • @param response
    • @param o
    • @param modelAndView
    • @throws Exception
      */
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
      System.out.println("-------------3-------------------");
      System.out.println("name: " + modelAndView.getModel().get(“name”));
      System.out.println(“即将跳转的位置为:” + modelAndView.getViewName());
      }

    /**

    • 响应处理 当Controller响应完客户端之后会执行指定内容 Controller发生异常之后也会执行指定内容。类似:finlly{}
    • @param httpServletRequest
    • @param httpServletResponse
    • @param o
    • @param e
    • @throws Exception 封装的是Controller中出现的异常对象
      */
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
      System.out.println("-------------4-------------------");
      System.out.println(e.getMessage());
      }
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

如图所示:在这里插入图片描述
10.编写TestController的代码如下:

package com.txw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**

  • @author Adair

  • E-mail: 1578533828@qq.com
    */
    @Controller
    @RequestMapping("/test")
    public class TestController {

    @RequestMapping(“test1”)
    public String test1(Model model){
    System.out.println("-------------2-------------------");
    int i = 1 / 0;
    model.addAttribute(“name”,“Adair”);
    // SpringMVC自动将request作用域和返回值封装为ModelAndView
    return “index”;
    }

    @RequestMapping(“test2”)
    public String test2(){
    System.out.println("-------------2-------------------");
    return “index”;
    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

如图所示:在这里插入图片描述
拦截器运行顺序,如图所示:在这里插入图片描述

2 SpringMVC全局异常处理

如图所示:在这里插入图片描述

2.1 作用

​ `当控制器中某个方法在运行过程中突然发生运行时异常时,为了增加用户体验对于用户不能出现500错误代码,应该给用户良好展示错误界面,全局异常处理就能更好解决这个问题.。

2.2 全局异常处理开发

1.编写CustomerHanlderExceptionResolver的代码如下:

package com.txw.exception;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
/**

  • 全局异常处理类

  • @author Adair

  • E-mail: 1578533828@qq.com
    */
    @SuppressWarnings(“all”) // 注解警告信息
    public class CustomerHanlderExceptionResolver implements HandlerExceptionResolver {

    /**

    • 方法功能:一旦程序出现异常的处理方案
    • @param request 请求响应对象
    • @param response 请求响应对象
    • @param o 发生异常的Controller访问方法对象
    • @param e 发生的异常对象
    • @return
      */
      @Override
      public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
      ModelAndView modelAndView = new ModelAndView();
      // 发生异常跳转到专门准备的异常处理页面 /error.jsp 等价于 return “”
      try {
      modelAndView.setViewName(“redirect:/error.jsp?message=” + URLEncoder.encode(e.getMessage(),“UTF-8”));
      } catch (Exception exception) {
      exception.printStackTrace();
      }
      return modelAndView;
      }
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

如图所示:在这里插入图片描述
2.编写springmvc.xml的代码如下:

<!--配置全局异常处理类-->
<bean class="com.txw.exception.CustomerHanlderExceptionResolver"/>

 
 
  • 1
  • 2

如图所示:在这里插入图片描述
3.编写TestController的代码如下:

package com.txw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**

  • @author Adair

  • E-mail: 1578533828@qq.com
    */
    @Controller
    @RequestMapping(“test”)
    public class TestController {

    @RequestMapping(“test1”)
    public String test1(Model model){
    System.out.println("-------------2-------------------");
    int i = 1 / 0;
    model.addAttribute(“name”,“Adair”);
    // SpringMVC自动将request作用域和返回值封装为ModelAndView
    return “index”;
    }

    @RequestMapping(“test2”)
    public String test2(){
    System.out.println("-------------2-------------------");
    return “index”;
    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

如图所示:在这里插入图片描述
4.编写error.jsp的代码如下:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<html>
<head>
    <title>登录页面</title>
    <meta charset="UTF-8">
</head>
<body>
    异常信息:${param.massage}
    <h1>当前网络环境较差,请刷新重试!<a href="">刷新</a> </h1>
</body>
</html>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

如图所示:在这里插入图片描述
5.通过浏览器访问:http://localhost:8080/test/test1,跳转到如图所示:在这里插入图片描述

3 父子容器问题

如图所示:在这里插入图片描述
ssm总结,如图所示:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值