SpringMVC文件上传、拦截器、异常处理

1、SpirngMVC文件上传步骤

  1. 导入fileupload和io坐标

    <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>
    
  2. 配置文件上传解析器

        <!--配置文件上传解析器-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--上传文件的编码类型-->
            <property name="defaultEncoding" value="UTF-8"></property>
            <!--上传文件总大小-->
            <property name="maxUploadSize" value="30000000"></property>
        </bean>
    
  3. 编写文件上传代码

    <form action="${pageContext.request.contextPath}/user16" method="post" enctype="multipart/form-data">
        <input type="text" name="username"></br>
        <input type="file" name="uploadFile"><br>
        <input type="file" name="uploadFile"><br>
        <input type="file" name="uploadFile"><br>
        <input type="submit" value="提交">
    </form>
    
  4. 测试

        @RequestMapping(value = "/user16")
        @ResponseBody
        public void save16(String username, MultipartFile[] uploadFile) throws IOException {
            System.out.println(username);
            for (MultipartFile multipartFile : uploadFile) {
                //获取文件名
                String originalFilename = multipartFile.getOriginalFilename();
                //保存文件
                multipartFile.transferTo(new File("E:\\"+originalFilename));
            }
        }
    

2、Spring MVC 的拦截器链(Interceptor Chain)

区别 过滤器 拦截器
使用范围 是 servlet 规范中的一部分,任何 Java Web 工程都可以使用 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用
拦截范围 在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截 只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的

自定义拦截器步骤:

  1. 创建拦截器类实现HandlerInterceptor接口

    public class Interceptor1 implements HandlerInterceptor {
    
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle...");
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle...");
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion...");
        }
    }
    
    方法名 说明
    preHandle() 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法
    postHandle() 该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为true 时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作
    afterCompletion() 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,前提是preHandle 方法的返回值为true 时才能被调用
  2. 配置拦截器

    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--配置对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <!--拦截器类的全路径-->
            <bean class="cn.guixinchn.interceptor.Interceptor1"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    
  3. 测试拦截器的拦截效果

    @RequestMapping(value = "/user17")
    @ResponseBody
    public ModelAndView save17(){
        System.out.println("目标方法执行了。。");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username","张三");
        modelAndView.setViewName("user");
        return modelAndView;
    }
    

3、SpirngMVC异常处理

异常处理两种方式:

  • 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

    <!--配置简单映射异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--配置默认异常-->
        <!--<property name="defaultErrorView" value="error"></property>-->
        <property name="exceptionMappings">
            <map>
                <!--key为异常类型,value为错误的视图-->
                <entry key="java.lang.ClassCastException" value="error1"></entry>
                <entry key="cn.guixinchn.exception.MyException" value="error2"></entry>
            </map>
        </property>
    </bean>
    
  • 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器步骤:

    1. 创建异常处理器类实现HandlerExceptionResolver

      //参数Exception 异常对象
      //返回ModelAndView,跳转到错误的视图信息界面
      public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
          
          ModelAndView modelAndView = new ModelAndView();
          
          if(e instanceof MyException){
              modelAndView.addObject("info","自定义异常");
          } else if (e instanceof ClassCastException) {
              modelAndView.addObject("info","类型转换异常");
          }
          modelAndView.setViewName("error");
          return modelAndView;
      }
      
    2. 配置异常处理器

      <bean class="cn.guixinchn.resolver.MyExceptionResolver"></bean>
      
    3. 编写异常页面、测试

      @RequestMapping(value = "/user19")
      @ResponseBody
      public void save19() throws MyException {
          System.out.println("自定义异常.....");
          throw new MyException();
      }
      
      @RequestMapping(value = "/user18")
      @ResponseBody
      public void save18(){
          System.out.println("类型转换异常.....");
          Object str = "zhangsan";
          Integer num = (Integer) str;
      }
      
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
          <h1>异常页面</h1>
          <h1>${info}</h1>
      </body>
      </html>
      
posted @ 2020-12-26 15:07  咕咕星  阅读(131)  评论(0编辑  收藏  举报