1. 程式人生 > 實用技巧 >SpringMVC檔案上傳、攔截器、異常處理

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>