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