Java EE輕量級框架應(yīng)用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第12章 深入使用Spring MVC_第1頁
Java EE輕量級框架應(yīng)用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第12章 深入使用Spring MVC_第2頁
Java EE輕量級框架應(yīng)用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第12章 深入使用Spring MVC_第3頁
Java EE輕量級框架應(yīng)用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第12章 深入使用Spring MVC_第4頁
Java EE輕量級框架應(yīng)用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第12章 深入使用Spring MVC_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

文件上傳文件下載攔截器異常處理第12章

深入使用SpringMVC2024/1/29學(xué)習(xí)目標(biāo)/Target2

熟悉SpringMVC框架中文件上傳的實現(xiàn)步驟

掌握文件上傳案例的編寫

掌握如何編寫中英文名稱文件下載程序了解攔截器定義和配置方式

熟悉攔截器的執(zhí)行流程掌握攔截器的使用章節(jié)概述/Summary3使用SpringMVC可以很靈活地完成數(shù)據(jù)的綁定和響應(yīng),極大的簡化了JavaWeb的開發(fā)。但SpringMVC提供的便利不僅僅如此,使用SpringMVC還可以很便捷地完成項目中的異常處理、自定義攔截器以及文件上傳和下載等高級功能。本章將對SpringMVC提供的這些高級功能進行講解。目錄/CONTENTS文件上傳異常處理攔截器文件下載1432文件上傳01第12章深入使用SpringMVC文件上傳表單的滿足條件

大多數(shù)文件上傳都是通過表單形式提交給后臺服務(wù)器,因此,要實現(xiàn)文件上傳功能,就需要提供一個文件上傳的表單,并且該表單必須滿足以下3個條件。

form表單的method屬性設(shè)置為post。

form表單的enctype屬性設(shè)置為multipart/form-data。

提供<inputtype="file"name="filename"/>的文件上傳輸入框。

文件上傳6文件上傳表單的示例代碼

文件上傳表單的示例代碼如下。上述代碼中的文件上傳表單除了滿足了必須的3個條件之外,還在文件上傳輸入框中增加了一個HTML5中的新屬性multiple。如果文件上傳輸入框中使用了multiple屬性,則在上傳文件時,可以同時選擇多個文件進行上傳,即可實現(xiàn)多文件上傳。

<formaction="uploadUrl"method="post"enctype="multipart/form-data"

>

<inputtype="file"name="filename"multiple="multiple"/><inputtype="submit"value="文件上傳"/></form>文件上傳7MultipartResolver接口

當(dāng)客戶端提交的form表單中enctype屬性為multipart/form-data時,瀏覽器會采用二進制流的方式來處理表單數(shù)據(jù),服務(wù)器端會對請求中上傳的文件進行解析處理。

SpringMVC為文件上傳提供了直接的支持,這種支持是通過MultipartResolver(多部件解析器)對象實現(xiàn)的。MultipartResolver是一個接口,可以使用MultipartResolver的實現(xiàn)類CommonsMultipartResolver來完成文件上傳工作。文件上傳8MultipartResolver接口的使用

在SringMVC中使用MultipartResolver接口非常簡單,只需要在配置文件中定義MultipartResolver接口的Bean即可,具體配置方式如下。

<beanid="multipartResolver"class="mons.CommonsMultipartResolver"><!--設(shè)置請求編碼格式,必須與JSP中的pageEncoding屬性一致,默認為ISO-8859-1--><propertyname="defaultEncoding"value="UTF-8"/><!--設(shè)置允許上傳文件的最大值為2M,單位為字節(jié)--><propertyname="maxUploadSize"value="2097152"/></bean>文件上傳9<property>元素

<property>元素可以配置文件解析器類CommonsMultipartResolver的如下屬性。

maxUploadSize:上傳文件最大值(以字節(jié)為單位)。

maxInMemorySize:緩存中的最大值(以字節(jié)為單位)。

defaultEncoding:默認編碼格式。

resolveLazily:推遲文件解析,以便在Controller中捕獲文件大小異常。文件上傳10配置CommonsMultipartResolver時指定Beanid

因為初始化MultipartResolver時,程序會在BeanFactory中查找名稱為multipartResolver的MultipartResolver實現(xiàn)類,如果沒有查找到對應(yīng)名稱的MultipartResolver實現(xiàn)類,將不提供多部件解析處理。所以在配置CommonsMultipartResolver時必須指定該Bean的id為multipartResolver。

文件上傳11CommonsMultipartResolver如何實現(xiàn)上傳功能

CommonsMultipartResolver并未自主實現(xiàn)文件上傳下載對應(yīng)的功能,而是在內(nèi)部調(diào)用了ApacheCommonsFileUpload的組件,所以使用SpirngMVC的文件上傳功能,需要在項目中導(dǎo)入ApacheCommonsFileUpload組件的依賴,即commons-fileupload依賴和commons-io依賴。由于commons-fileupload依賴會自動依賴commons-io,所以可以只在項目的pom.xml文件中引入如下依賴。

<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version></dependency>文件上傳12CommonsMultipartResolver如何實現(xiàn)上傳功能

當(dāng)完成文件上傳表單和文件上傳解析器的配置后,就可以在Controller中編寫上傳文件的方法。在SpringMVC中,上傳文件的方法編寫十分簡單,其代碼如下所示。@ControllerpublicclassFileUploadController{

@RequestMapping("/fileUpload")

publicStringfileUpload(MultipartFile

file){

if(!file.isEmpty()){//保存上傳的文件,filepath為保存的目標(biāo)目錄 file.transferTo(newFile(filePath))return"uploadSuccess";}

return"uploadFailure";}}文件上傳13MultipartFile接口的常用方法文件上傳方法聲明功能描述byte[]getBytes()將文件轉(zhuǎn)換為字節(jié)數(shù)組形式StringgetContentType()獲取文件的內(nèi)容類型InputStreamgetInputStream()讀取文件內(nèi)容,返回一個InputStream流StringgetName()獲取多部件form表單的參數(shù)名稱StringgetOriginalFilename()獲取上傳文件的初始化名longgetSize()獲取上傳文件的大小,單位是字節(jié)booleanisEmpty()判斷上傳的文件是否為空voidtransferTo(Filefile)將上傳文件保存到目標(biāo)目錄下14文件下載02第12章深入使用SpringMVC什么是文件下載

文件下載就是將文件服務(wù)器中的文件傳輸?shù)降奖緳C上。進行文件下載時,為了不以客戶端默認的方式處理返回的文件,可以在服務(wù)器端對所下載的文件進行相關(guān)的配置。配置的內(nèi)容包括返回文件的形式、文件的打開方式、文件的下載方式和響應(yīng)的狀態(tài)碼。其中,文件的打開方式可以通過響應(yīng)頭Content-Disposition的值來設(shè)定,文件的下載方式可以通過響應(yīng)頭Content-Type中設(shè)置的MIME類型來設(shè)定。文件下載16使用ResponseEntity對象進行文件下載

使用ResponseEntity對象進行文件下載的示例代碼如下所示。

@RequestMapping("/download")publicResponseEntity<byte[]>fileDownload(HttpServletRequest request,Stringfilename)throwsException{Stringpath=request.getServletContext().getRealPath("/upload/");//

下載文件所在路徑Filefile=newFile(path+File.separator+filename);//創(chuàng)建文件對象HttpHeadersheaders=newHttpHeaders();//設(shè)置消息頭headers.setContentDispositionFormData(“attachment”,filename);//

打開文件headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//下載返回的文件數(shù)據(jù)returnnew

ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),

headers,HttpStatus.OK);//使用ResponseEntity對象封裝返回下載數(shù)據(jù)}文件下載17示例代碼分析

上面示例中,設(shè)置響應(yīng)頭信息中的MediaType代表的是InternerMediaType(即互聯(lián)網(wǎng)媒體類型),也叫做MIME類型,MediaType.APPLICATION_OCTET_STREAM的值為application/octet-stream,即表示以二進制流的形式下載數(shù)據(jù)。HttpStatus類型代表的是Http協(xié)議中的狀態(tài),示例中的HttpStatus.OK表示200,即服務(wù)器已成功處理了請求。

文件下載18案例的功能需求

接下來將文件上傳和下載的相關(guān)知識結(jié)合起來,實現(xiàn)一個文件上傳和下載的案例。在實現(xiàn)案例之前,首先分析案例的功能需求。本案例要實現(xiàn)的功能為,將文件上傳到項目的文件夾下,文件上傳成功后將上傳的文件名稱記錄到一個文件中,并將記錄的文件列表展示在頁面,單擊文件列表的鏈接實現(xiàn)文件下載。案例:文件上傳和下載19實現(xiàn)文件上傳和下載案例的思路

搭建文件上傳和下載的環(huán)境。

實現(xiàn)文件上傳功能。

實現(xiàn)獲取文件列表功能。

編寫文件上傳和下載頁面。

實現(xiàn)文件下載。案例:文件上傳和下載20中文亂碼問題

在實現(xiàn)文件下載的功能時,還需要注意文件中文名稱的亂碼問題。在使用Content-Disposition設(shè)置參數(shù)信息時,如果Content-Disposition中設(shè)置的文件名稱出現(xiàn)中文字符,需要針對不同的瀏覽器設(shè)置不同的編碼方式。目前Content-Disposition支持的編碼方式有UrlEncode編碼、Base64編碼、RFC2231編碼和ISO編碼。本案例不對全部瀏覽器的編碼方式進行設(shè)置,只對FireFox瀏覽器和非FireFox瀏覽器(如IE)分別進行編碼設(shè)置。案例:文件上傳和下載21攔截器03第12章深入使用SpringMVC什么是攔截器

攔截器(Interceptor)是一種動態(tài)攔截Controller方法調(diào)用的對象,它可以在指定的方法調(diào)用前或者調(diào)用后,執(zhí)行預(yù)先設(shè)定的代碼。攔截器作用類似于Filter(過濾器),但是它們的技術(shù)歸屬和攔截內(nèi)容不同。Filter采用Servlet技術(shù),攔截器采用SpringMVC技術(shù);Filter會對所有的請求進行攔截,攔截器只針對SpringMVC的請求進行攔截。

攔截器概述23攔截器的定義方式

在SpringMVC中定義一個攔截器非常簡單,常用的攔截器定義方式有以下兩種。

第一種方式是通過實現(xiàn)HandlerInterceptor接口定義攔截器。

第二種方式是通過繼承HandlerInterceptor接口的實現(xiàn)類HandlerInterceptorAdapter,定義攔截器。上述兩種方式的區(qū)別在于,直接實現(xiàn)HandlerInterceptor接口需要重寫HandlerInterceptor接口的所有方法;而繼承HandlerInterceptorAdapter類的話,允許只重寫想要回調(diào)的方法。

攔截器概述24自定義攔截器示例

下面通過實現(xiàn)HandlerInterceptor接口自定義攔截器,自定義攔截器的代碼如下所示。publicclassCustomInterceptorimplementsHandlerInterceptor

{

@Override

publicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse,Objecthandler)throwsException{returnfalse;}

@Override

publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse, Objecthandler,ModelAndViewmodelAndView)throwsException{}

@Override

publicvoidafterCompletion(HttpServletRequestrequest, HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{}}攔截器概述25preHandler()方法

preHandler()方法用于對程序進行安全控制、權(quán)限校驗等,它會在控制器方法調(diào)用前執(zhí)行。preHandler()方法的參數(shù)request是請求對象,response是響應(yīng)對象,handler是被調(diào)用的處理器對象。

preHandler()方法的返回值為bool類型,表示是否中斷后續(xù)操作。當(dāng)返回值為true時,表示繼續(xù)向下執(zhí)行;當(dāng)返回值為false時,整個請求就結(jié)束了,后續(xù)的所有操作都會中斷(包括調(diào)用下一個攔截器和控制器類中的方法執(zhí)行等)。

攔截器概述26postHandle()方法

postHandle()方法用于對請求域中的模型和視圖做出進一步的修改,它會在控制器方法調(diào)用之后且視圖解析之前執(zhí)行。

postHandle()方法的前2個參數(shù)和preHandler()方法的前2個參數(shù)一樣,分別是請求對象和響應(yīng)對象。如果處理器執(zhí)行完成有返回結(jié)果,可以通過第3個參數(shù)modelAndView讀取和調(diào)整返回結(jié)果對應(yīng)的數(shù)據(jù)與視圖信息。

攔截器概述27afterCompletion()方法

afterCompletion()方法可以完成一些資源清理、日志信息記錄等工作,它會在整個請求完成后執(zhí)行,即視圖渲染結(jié)束之后執(zhí)行。

postHandle()方法的前2個參數(shù)和preHandler()方法的前2個參數(shù)一樣,分別是請求對象和響應(yīng)對象。第3個參數(shù)ex是異常對象,如果處理器執(zhí)行過程中出現(xiàn)異常,會將異常信息封裝在該異常對象中,可以在afterCompletion()方法中針對異常情況進行單獨處理。需要注意的是,只有在preHandler()方法的返回值為true時,postHandle()方法和afterCompletion()方法才會按上述執(zhí)行規(guī)則執(zhí)行。

攔截器概述28配置自定義攔截器

要使自定義的攔截器生效,還需要在SpringMVC的配置文件中進行配置。配置代碼如下所示。

<mvc:interceptors><!--配置攔截器--><!--攔截所有請求--><beanclass="erceptor.MyInterceptor1"/><mvc:interceptor><mvc:mappingpath="/**"/><!--配置攔截器作用的路徑--><mvc:exclude-mappingpath=""/>!--配置不需要攔截器作用的路徑-->

<!--對匹配路徑的請求才進行攔截--><beanclass="erceptor.MyInterceptor2"/></mvc:interceptor></mvc:interceptors>攔截器的配置29配置自定義攔截器代碼分析

在上述代碼中,<mvc:interceptors>元素使用2種方式配置了攔截器,其中,使用子元素<bean>聲明的攔截器,將會對所有的請求進行攔截;而使用<mvc:interceptor>元素聲明的攔截器,會對指定路徑下的請求進行攔截。<mvc:interceptor>元素的子元素<mvc:mapping>通過path屬性配置攔截器作用的路徑。如上述代碼中path的屬性值為“/**”,表示攔截所有路徑。如果有不需要攔截的請求,可以通過<mvc:exclude-mapping>元素進行配置。需要注意的是,<mvc:interceptor>中的子元素必須按照上述代碼的配置順序進行編寫,即<mvc:mapping…/>→<mvc:exclude-mapping…/>→<bean…/>的順序,否則文件會報錯。

攔截器的配置30單個攔截器的執(zhí)行流程

如果在項目中只定義了一個攔截器,單個攔截器的執(zhí)行流程如圖所示。

攔截器的執(zhí)行流程31單個攔截器的執(zhí)行流程分析

從單個攔截器的執(zhí)行流程圖中可以看出,程序收到請求后,首先會執(zhí)行攔截器中的preHandle()方法,如果preHandle()方法返回的值為false,則將中斷后續(xù)所有代碼的執(zhí)行。

如果preHandle()方法的返回值為true,則程序會繼續(xù)向下執(zhí)行Handler的代碼。當(dāng)Handler執(zhí)行過程中沒有出現(xiàn)異常時,接著會執(zhí)行攔截器中的postHandle()方法。postHandle()方法執(zhí)行后會通過DispatcherServlet向客戶端返回響應(yīng),并且在DispatcherServlet處理完請求后,執(zhí)行攔截器中的afterCompletion()方法;如果Handler執(zhí)行過程中出現(xiàn)異常,將跳過攔截器中的postHandle()方法,直接由DispatcherServlet渲染異常頁面返回響應(yīng),最后執(zhí)行攔截器中的afterCompletion()方法。

攔截器的執(zhí)行流程32多個攔截器的執(zhí)行流程

在大型的企業(yè)級項目中,可能會定義很多攔截器來實現(xiàn)不同的功能。假設(shè)項目中配置了順序為Interceptor1、Interceptor2的兩個攔截器,多個攔截器的執(zhí)行流程如圖所示。

攔截器的執(zhí)行流程33多個攔截器的執(zhí)行流程分析

從多個攔截器的執(zhí)行流程圖中可以看出,當(dāng)有程序中配置了多個攔截器時,攔截器中的preHandle()方法會按照配置文件中攔截器的配置順序執(zhí)行,而攔截器中的postHandle()方法和afterCompletion()方法則會按照攔截器的配置順序的相反順序執(zhí)行。攔截器的執(zhí)行流程34案例要求

本案例主要是對用戶登錄狀態(tài)的驗證,只有登錄成功的用戶才可以訪問系統(tǒng)中的資源。為了保證后臺系統(tǒng)的頁面不能被客戶直接請求訪問,本案例中所有的頁面都存放在項目的WEB-INF

文件夾下,客戶需要訪問相關(guān)頁面時,需要在服務(wù)器端轉(zhuǎn)發(fā)到相關(guān)頁面。如果沒有登錄系統(tǒng)而直接訪問系統(tǒng)首頁,攔截器會將請求攔截,并轉(zhuǎn)發(fā)到登錄頁面,同時在登錄頁面中給出提示信息。如果用戶登錄時提交的用戶名或密碼錯誤,也會在登錄頁面給出相應(yīng)的提示信息。當(dāng)已登錄的用戶在系統(tǒng)頁面中單擊“退出”鏈接時,系統(tǒng)同樣會回到登錄頁面。

案例:后臺系統(tǒng)登錄驗證35后臺系統(tǒng)登錄驗證的流程圖案例:后臺系統(tǒng)登錄驗證36異常處理04第12章深入使用SpringMVCHandlerExceptionResolver接口

如果希望對SpringMVC中所有異常進行統(tǒng)一處理,可以使用SpringMVC提供的異常處理器HandlerExceptionResolver接口。SpringMVC內(nèi)部提供了HandlerExceptionResolver的實現(xiàn)類SimpleMappingExceptionResolver。它實現(xiàn)了簡單的異常處理,通過該實現(xiàn)類可以將不同類型的異常映射到不同的頁面,當(dāng)發(fā)生異常的時候,實現(xiàn)類根據(jù)發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論