SpringMVC知识点总结(三)

springMVC异常处理机制

如图所示,如果在整个系统开发过程中不设置一个异常处理器,那么每个从dao到service到controller遇到异常的处理方式就是向上抛出,前端控制器接收到异常之后还会向上抛出到前端页面上,这时候如果有设置异常处理器,异常处理器可以对该异常进行相应的处理,比如显示一个相对友好的页面给用户,而不是直接显示错误。
在这里插入图片描述

实现步骤

编写异常类和错误页面

自定义异常类:用于存储错误信息

package com.ccp.utils;

public class MyException  extends Exception{
private String message;

    public MyException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

错误页面:
注意要放到WEB-INF目录的pages下

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/5/5
  Time: 22:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

${message}

</body>
</html>

自定义异常处理器

package com.ccp.utils;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyExceptionResolver  implements HandlerExceptionResolver{
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        e.printStackTrace();
        ModelAndView modelAndView=new ModelAndView();
        MyException myException=null;
        //如果是系统自定义异常则进行转换
        if(e instanceof MyException){
            myException= (MyException) e;
        }
        //如果不是则手动创建一个
        else {
            myException=new MyException("系统正在维护,请联系管理员");
        }
        //将错误名称传入域中
        modelAndView.addObject("message",myException.getMessage());
        modelAndView.setViewName("exceptionTest");
        return modelAndView;
    }
}

最后配置一下该异常处理器

在springMVC.xml中进行配置
在这里插入图片描述

控制器代码

这里手动创建一个异常,以模仿真实环境
注意需要将会抛出异常的代码放入trycatch之中,这里如果不抛出我们自定义的Exception,那么会自动创建一个自定义的Exception并且赋值"系统正在维护,请联系管理员"。

public class TestController {
    @RequestMapping("saveSession")
    public String   saveSession(Model model) throws MyException{
        User user=new User();
        model.addAttribute("username","chen");
        model.addAttribute("password",user);
        model.addAttribute("age",25);
        try {
            int i=1/0;
        } catch (Exception e) {
            e.printStackTrace();
            throw new MyException("出错了!");
        }
        return "success";
    }

SpringMVC传统的文件上传方式

实现步骤

添加依赖jar包

<?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>org.example</groupId>
  <artifactId>SpringFileUpload</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringFileUpload Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <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>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>SpringFileUpload</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

配置文件解析器

这里的maxUploadSize是我们配置的上传文件最大容量

  </bean>
    <!-- 配置文件上传解析器 --> <bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为 5MB --> <property name="maxUploadSize"> <value>5242880</value>
</property>
</bean>

定义控制器方法

    @RequestMapping("/fileUpload")
    public String fileUpload(MultipartFile
                                     uploadFile, HttpServletRequest request) throws Exception {
        //获取到uploads文件夹地址
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        //如果uploads文件夹存在则创建一个新文件,不存在则创建该文件夹
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        //获得原始文件名
        String fileName = uploadFile.getOriginalFilename();
        //获得随机名称
        String randomName = UUID.randomUUID().toString().replace("-", "");
        //将上传过去的文件名改为随机生成的文件名
        fileName = randomName + "_" + fileName;
        uploadFile.transferTo(new File(path, fileName));
        return "success";
    }

前端代码

<%--
  Created by IntelliJ IDEA.
  User: cc
  Date: 2021/5/29
  Time: 19:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/fileUpload" method="post" enctype="multipart/form-data">
    名称:<input type="text" name="picname"/><br/>
    图片:<input type="file" name="uploadFile"/><br/>
    <input type="submit" value="上传"/>
</form>
</body>
</html>

这里有一点需要注意
在这里插入图片描述
最后上传到的地址为
F:\studyProject\SpringFileUpload\target\SpringFileUpload\uploads

spring过滤器

在这里插入图片描述

步骤

自定义拦截器

需要实现 HandlerInterceptor 接口,重写其中方法, preHandle是在控制器执行之前执行, postHandle是在控制器执行之后执行, afterCompletion是在控制器返回的页面加载完成之后执行。如果这里的preHandle返回值返回fa’lse,那么就不会放行,后面的代码就不会执行了。

package com.cpj.controller.utils;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HandlerInterceptorDemo1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1前置方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("1后置方法执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("1页面加载结束执行");
    }
}

配置拦截器

这里是配置了两个拦截器

   <!-- 配置拦截器 -->
    <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
    <bean id="handlerInterceptorDemo1"
          class="com.cpj.controller.utils.HandlerInterceptorDemo1"></bean>
</mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean id="handlerInterceptorDemo2"
                  class="com.cpj.controller.utils.HandlerInterceptorDemo2"></bean>
        </mvc:interceptor>
</mvc:interceptors>

控制器

在这里插入图片描述

执行成功后页面

在这里插入图片描述

运行结果

可以看到如果有多个拦截器它的执行顺序是这样的

在这里插入图片描述
在这里插入图片描述
先执行拦截器1的preHandle,然后执行拦截器2的preHandle,然后控制器,然后拦截器二的postHandle,然后拦截器一的postHandle,然后页面渲染成功,然后执行拦截器2的afterCompletion,最后拦截器1的afterCompletion

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值