javascript
【SSM框架系列】SpringMVC的文件上传、拦截器及异常处理
SpringMVC的文件上傳
服務器端實現文件上傳的技術有很多種,Servlet3.0,FileUtils,框架等等,都可以實現文件上傳,不管使用哪一種上傳技術,都必須滿足三要素:
-
表單項type=“file”
-
表單的提交方式是post
-
表單的enctype屬性是多部分表單形式,及enctype=“multipart/form-data”
SpringMVC的請求-文件上傳-文件上傳的原理
SpringMVC的請求-文件上傳-單文件上傳的代碼實現1
添加依賴
<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.3</version></dependency>配置多媒體解析器
<!--配置文件上傳解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UYF-8"/><property name="maxUploadSize" value="500000"/></bean>后臺程序
@RequestMapping(value="/quick22")@ResponseBodypublic void save22(String username, MultipartFile uploadFile) throws IOException {System.out.println(username);System.out.println(uploadFile);}SpringMVC的請求-文件上傳-單文件上傳的代碼實現2
完成文件上傳
@RequestMapping(value="/quick22")@ResponseBodypublic void save22(String username, MultipartFile uploadFile) throws IOException {System.out.println(username);//獲得上傳文件的名稱String originalFilename = uploadFile.getOriginalFilename();uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));}SpringMVC的請求-文件上傳-多文件上傳的代碼實現3
多文件上傳,只需要將頁面修改為多個文件上傳項,將方法參數MultipartFile類型修改為MultipartFile[]即可
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">名稱<input type="text" name="username"><br/>文件1<input type="file" name="uploadFile"><br/>文件2<input type="file" name="uploadFile"><br/><input type="submit" value="提交"></form>@RequestMapping(value="/quick23")@ResponseBodypublic void save23(String username, MultipartFile[] uploadFile) throws IOException {System.out.println(username);for (MultipartFile multipartFile : uploadFile) {String originalFilename = multipartFile.getOriginalFilename();multipartFile.transferTo(new File("C:\\upload\\"+originalFilename));}}SpringMVC的攔截器
SpringMVC攔截器-攔截器的作用
-
Spring MVC 的攔截器類似于 Servlet 開發中的過濾器 Filter,用于對處理器進行預處理和后處理。
-
將攔截器按一定的順序聯結成一條鏈,這條鏈稱為攔截器鏈(InterceptorChain)。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。攔截器也是AOP思想的具體實現。
Filter過濾器的作用
- 在請求到達目標資源之前干的事(對request增強)
- 在響應到達客戶端之前干的事(對response增強)
- 可以決定是否讓請求到達目標資源
SpringMVC攔截器-interceptor和filter區別
關于interceptor和filter的區別,如圖所示:
SpringMVC攔截器-基礎入門
自定義攔截器很簡單,只有如下三步:
創建攔截器類實現HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {//在目標方法執行之前 執行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {System.out.println("preHandle.....");// true代表放行,false代表阻止該請求到達目標資源return true;}//在目標方法執行之后 視圖對象返回之前執行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("postHandle...");}//在流程都執行完畢后 執行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 頁面加載完畢之后才會輸出System.out.println("afterCompletion....");}}配置:在SpringMVC的配置文件中配置
<!--配置攔截器--><mvc:interceptors><mvc:interceptor><!--對哪些資源執行攔截操作--><mvc:mapping path="/**"/><bean class="cs.wy.interceptor.MyInterceptor1"/></mvc:interceptor></mvc:interceptors>編寫Controller,發請求到controller,跳轉頁面
@Controllerpublic class TargetController {@RequestMapping("/target")public ModelAndView show(){System.out.println("目標資源執行......");ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("name","趙麗穎");modelAndView.setViewName("index");return modelAndView;}}頁面
<html><body><h2>Hello World! ${name}</h2></body></html>SpringMVC攔截器-基礎入門詳解
攔截器在預處理后什么情況下會執行目標資源,什么情況下不執行目標資源,以及在有多個攔截器的情況下攔截器的執行順序是什么?
配置攔截器2
<!--配置攔截器--><mvc:interceptors><mvc:interceptor><!--對哪些資源執行攔截操作--><mvc:mapping path="/**"/><bean class="cs.wy.interceptor.MyInterceptor2"/></mvc:interceptor><mvc:interceptor><!--對哪些資源執行攔截操作--><mvc:mapping path="/**"/><bean class="cs.wy.interceptor.MyInterceptor1"/></mvc:interceptor></mvc:interceptors>結論:
-
當攔截器的preHandle方法返回true則會執行目標資源,如果返回false則不執行目標資源
-
多個攔截器情況下,配置在前的先執行,配置在后的后執行
-
攔截器中的方法執行順序是:preHandler-------目標資源----postHandle---- afterCompletion
攔截器中的方法說明如下
SpringMVC異常處理機制
異常處理的思路
-
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規范代碼開發、測試等手段減少運行時異常的發生。
-
系統的Dao、Service、Controller出現都通過throws Exception向上拋出,最后由SpringMVC前端控制器交由異常處理器進行異常處理
異常處理兩種方式
-
使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver
-
實現Spring的異常處理接口HandlerExceptionResolver 自定義自己的異常處理器
簡單異常處理器SimpleMappingExceptionResolver
SpringMVC已經定義好了該類型轉換器,在使用時可以根據項目情況進行相應異常與視圖的映射配置
<!--配置簡單映射異常處理器--><bean class=“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”> <property name=“defaultErrorView” value=“error”/> 默認錯誤視圖<property name=“exceptionMappings”><map> 異常類型 錯誤視圖<entry key="cs.wy.exception.MyException" value="error"/><entry key="java.lang.ClassCastException" value="error"/></map></property></bean>自定義異常處理步驟
①創建異常處理器類實現HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {//處理異常的代碼實現//創建ModelAndView對象ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("exceptionPage");return modelAndView;}}②配置異常處理器
<bean id="exceptionResolver" class="cs.wy.exception.MyExceptionResolver"/>③編寫異常頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body>這是一個最終異常的顯示頁面</body></html>④測試異常跳轉
@RequestMapping("/quick22")@ResponseBodypublic void quickMethod22() throws IOException, ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); simpleDateFormat.parse("abcde");}總結
以上是生活随笔為你收集整理的【SSM框架系列】SpringMVC的文件上传、拦截器及异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring框架家族】Spring--
- 下一篇: 【SSM框架系列】Mybatis基本介绍