1. 程式人生 > >springmvc基礎:(3)攔截器與檔案上傳

springmvc基礎:(3)攔截器與檔案上傳

Springmvc與Struts2的區別

      springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。       springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。       Struts採用值棧儲存請求和響應的資料,通過OGNL存取資料, springmvc通過引數解析器是將request請求內容解析,並給方法形參賦值,     將資料和檢視封裝成ModelAndView物件,最後又將ModelAndView中的模型資料通過reques域傳輸到頁面。Jsp檢視解析器預設使用jstl。

springmvc攔截器在java檔案裡面的寫法:

    preHandle:在控制器方法呼叫前執行, 返回值為是否中斷:true,表示繼續執行(下一個攔截器或處理器);false則會中斷後續的所有操作,所以我們需要使用response來繼續響應後續請求     afterCompletion:整個請求完成,即檢視渲染結束後呼叫,這個時候可以做些資源清理工作,或日誌記錄     postHandle:在控制器方法呼叫後,解析檢視前呼叫,我們可以對檢視和模型做進一步渲染或修改,可在modelAndView中加入資料,比如當前時間                    配置攔截器,在springmvc.xml中新增配置:    

        <!--配置攔截器, 多個攔截器,順序執行 -->
        <mvc:interceptors>
            <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller -->
               <mvc:interceptor>
                 <mvc:mapping path="/**"/>
                 <mvc:exclude-mapping path="/user/login"/>
                 <bean class="cn.interceptor.LoginIntercetor"></bean>
             </mvc:interceptor>
        <!-- 當設定多個攔截器時,先按順序呼叫preHandle方法,然後逆序呼叫每個攔截器的postHandle和afterCompletion方法 -->
        </mvc:interceptors>

檔案上傳:     springmvc與struts2預設使用的上傳元件都是fileupload.     步驟1:新增spring依賴的jar檔案fileupload元件所依賴的jar檔案     步驟2:在web.xml中配置前端控制器         

          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:springmvc.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>

    步驟3:在src下新建spring的配置檔案springmvc.xml         

         <!-- 註解掃描 --> 
         <context:component-scan base-package="cn"></context:component-scan>
          <!-- springmvc使用<mvc:annotation-driven> -->
        <!-- 自動載入RequestMappingHandlerMapping和RequestMappingHandlerAdapter,
        可用在springmvc.xml配置檔案中使用<mvc:annotation-driven>替代註解處理器和介面卡的配置。 -->
         <mvc:annotation-driven></mvc:annotation-driven>
         <!-- 檢視解析器 -->
         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
             <property name="prefix" value="/"></property>
             <property name="suffix" value=".jsp"></property>
         </bean>
         <!-- 處理靜態資源 -->
         <mvc:default-servlet-handler/>
         <!-- 上傳檔案的檢視解析器 -->
         <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <!-- 設定上次檔案的最大大小,單位為位元組 -->
         <property name="maxUploadSize" value="100000000"></property>
         </bean>

    步驟4:編寫UploadController      

        @Controller
        public class UploadController {
        @RequestMapping("/upload")
        public String upload(@RequestParam("uploadFile") MultipartFile uploadFile,HttpServletRequest request){
            //獲取伺服器端的路徑
            String realPath =  request.getServletContext().getRealPath("/");
            File uploadDir = new File(realPath,"upload");
            if(!uploadDir.exists())
                uploadDir.mkdirs();
            //獲取待上傳的原始檔名稱
            String fileName =  uploadFile.getOriginalFilename();
            //FileUtils.copyFile(uploadFile, new File(uploadDir,fileName));
            try {
                uploadFile.transferTo(new File(uploadDir,fileName));
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "success";
        }

    步驟5:編寫上傳頁面upload.jsp        

       注意:form表單新增屬性enctype="multipart/form-data"支援檔案上傳
        <form action="upload" method="post" enctype="multipart/form-data">
              檔案:<input type="file" name="uploadFile"/>
            <input type="submit" value="上傳"/>
          </form>