SpringMVC--(文件上传、拦截器、异常) 自用解析

六: Spring实现文件上传

  1. SpringMVC传统方式文件上传

    1. SpringMVC框架提供了Multipart对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同
    2. 代码示例:

      @RequestMapping(value="/fileupload")
      public String fileupload(HttpServletRequest request,MultipartFile upload) throws Exception {
          System.out.println("SpringMVC方式的文件上传...");
          // 先获取到要上传的文件目录
          String path = request.getSession().getServletContext().getRealPath("/uploads");
          // 创建File对象,一会向该路径下上传文件
          File file = new File(path);
          // 判断路径是否存在,如果不存在,创建该路径
          if(!file.exists()) {
              file.mkdirs();
          }
          // 获取到上传文件的名称
          String filename = upload.getOriginalFilename();
          String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
          // 把文件的名称唯一化
          filename = uuid+"_"+filename;
          // 上传文件
          upload.transferTo(new File(file,filename));
          return "success";
      }
      
    3. 配置文件解析器对象

      
      
          
      
      
  2. SpringMVC跨服务器方式文件上传

    1. 搭建图片服务器
    2. 实现SpringMVC跨服务器方式文件上传

      1. 导入所需要的jar包

        
            com.sun.jersey
            jersey-core
            1.19.4
        
        
            com.sun.jersey
            jersey-client
            1.19.4
        
        
      2. 编写文件上传的页面

        跨服务器的文件上传

        选择文件:
      3. 编写控制器

        @RequestMapping(value="/fileupload")
        public String fileupload(MultipartFile upload) throws Exception { 
            System.out.println("SpringMVC跨服务器方式的文件上传..."); 
            // 定义图片服务器的请求路径 
            String path = "http://localhost:9090/uploadPath/uploads/";
            // 获取到上传文件的名称 
            String filename = upload.getOriginalFilename(); 
            String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
            // 把文件的名称唯一化
            filename = uuid+"_"+filename;
            // 向图片服务器上传文件
            // 创建客户端对象
            Client client = Client.create();
            // 连接图片服务器
            WebResource webResource = client.resource(path+filename);
            // 上传文件
            webResource.put(upload.getBytes());
            return "success";
        }
        

七: SpringMVC的异常处理

  1. 异常处理思路

    • 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生
    • 系统的dao,service,controller出现都通过throw Exception向上抛出,最后springmvc前端控制器交由异常处理器进行异常处理。
  2. SpringMVC的异常处理

    1. 自定义异常类

      public class CustomException extends Exception {
      
          private String message;
      
          public CustiomException(String message) {
              this.message = message;
          }
          public String getMessage() {
              return message;
          }
      }
      
    2. 自定义异常处理

      public class CustomExceptionResolver implements HandlerExceptionResolver {
      
          @Override
          public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
      
              ex.printStackTrace();
              CustomException customException = null;
              //如果抛出的是系统自定义异常则直接转换
              if(ex instanceof CustomExcetion) {
                  customException = (CustomException) ex;
              } else {
                  //如果抛出的不是系统自定义异常则重新构造一个系统错误异常
                  customException = new CustomException("系统错误");
              }
              ModelAndView mv = new ModelAndView();
              mv.addObject("message", customException.getMessage());
              mv.setViewName("error");
              return mv;
      }
      
    3. 配置异常处理器

      
      
      

八: SpringMVC框架中的拦截器

  1. 拦截器概述

    • Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
    • 拦截器链(Interceptor Chain) :将拦截器按一定的顺序连接成一条链,在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用

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

    • 我们想要自定义拦截器,要求必须实现: HandlerInterception接口
  2. 自定义拦截器步骤

    1. 定义一个类是实现 HandlerInterception 接口

      public class HandlerInterceptionDemo implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("proHandle拦截器执行了");
              return true;
          }
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("postHandle方法执行了");
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse, Object handle, Exception ex) {{
              System.out.print("afterCompletion方法执行了");
          }
      }
      
    2. 配置拦截器

      
      
          
              
              
          
      
      
  3. 拦截器的细节

    1. 拦截器的放行

      • 放行的含义是指,如果由下一个拦截器就执行下一个,如果该拦截器处于拦截器链额最后一个,则执行控制器中的方法
    2. 拦截器中方法的说明

      public interface HandlerInterceptor {
          /**
          * 如何调用:
          *   按拦截器定义顺序调用
          * 何时调用:
          *   只要配置了都会调用
          * 有什么用:
          *   如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回 true。
          *   如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
          */
          default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
          return true;
          }
      
          /**
          * 如何调用:
          *   按拦截器定义逆序调用
          * 何时调用:
          *   在拦截器链内所有拦截器返成功调用
          * 有什么用:
          *   在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求 request 进行处理。
          */
          default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
          }
      
          /**
          * 如何调用:
          *   按拦截器定义逆序调用
          * 何时调用:
          *   只有 preHandle 返回 true 才调用
          * 有什么用:
          *   在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
          */
          default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
          }
      }
      
    3. 拦截器的作用路径

      • 作用路径可以通过在配置文件中配置

        
        
            
                
                
                
            
        
        
  4. 配置多个拦截器

    • 多个拦截器是按照配置的顺序决定的

      1. 拦截器1: preHandle拦截器拦截
      2. 拦截器2:preHandle拦截器拦截
      3. 控制器中的方法执行了
      4. 拦截器2: postHandle方法执行了
      5. 拦截器1: postHandle方法执行了
      6. 拦截器2: afterCompletion方法执行了
      7. 拦截器1: afterCompletion方法执行了

你可能感兴趣的:(mvc)