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>