版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章SpringMVC的高級(jí)功能《JavaEE企業(yè)級(jí)應(yīng)用開發(fā)教程(Spring+SpringMVC+MyBatis)》學(xué)習(xí)目標(biāo)/Target了解攔截器的概念,能夠簡(jiǎn)述攔截器的作用掌握攔截器的配置和執(zhí)行流程,能夠在程序中配置攔截器掌握SpringMVC中的異常處理,能夠使用簡(jiǎn)單異常處理器、自定義異常處理器、異常處理注解實(shí)現(xiàn)異常的統(tǒng)一處理掌握登錄驗(yàn)證案例的實(shí)現(xiàn),能夠基于攔截器實(shí)現(xiàn)登錄驗(yàn)證案例掌握文件上傳和文件下載,能夠在SpringMVC應(yīng)用中實(shí)現(xiàn)文件上傳和文件下載章節(jié)概述/Summary在Web應(yīng)用開發(fā)中,SpringMVC以其高效、靈活和可擴(kuò)展等特性贏得了廣大開發(fā)者的青睞。除了基本的請(qǐng)求映射和視圖渲染功能,SpringMVC還提供了異常處理、自定義攔截器以及文件上傳和文件下載等高級(jí)功能,這些功能極大地提升了Web應(yīng)用開發(fā)的效率。下面將對(duì)SpringMVC提供的這些高級(jí)功能進(jìn)行講解。目錄/Contents7.17.2異常處理攔截器7.3文件上傳和文件下載異常處理7.17.1
異常處理在軟件開發(fā)中,無論是與數(shù)據(jù)庫(kù)交互的持久層操作,還是業(yè)務(wù)邏輯層或控制層的處理,都難免會(huì)遇到各種編譯期或運(yùn)行時(shí)異常。若每個(gè)異常都單獨(dú)處理,將增加開發(fā)工作量,且難以保持規(guī)范和統(tǒng)一性,對(duì)后續(xù)代碼維護(hù)也不利。對(duì)此可以將程序中所有的異常進(jìn)行統(tǒng)一抽取與處理。SpringMVC提供了高效且靈活的方式來實(shí)現(xiàn)異常的統(tǒng)一處理,其中主要的方式有使用簡(jiǎn)單異常處理器、使用自定義異常處理器、使用異常處理注解,下面對(duì)這三種異常處理方式進(jìn)行講解。7.1.1
簡(jiǎn)單異常處理器先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉簡(jiǎn)單異常處理器,能夠說出簡(jiǎn)單異常處理器如何使用7.1.1
簡(jiǎn)單異常處理器SimpleMappingExceptionResolver是SpringMVC框架提供的異常處理器,由于它提供了一種相對(duì)簡(jiǎn)單和直接的方式將特定異常映射到特定的視圖,從而實(shí)現(xiàn)異常的統(tǒng)一處理,通常也稱為簡(jiǎn)單異常處理器。在使用SimpleMappingExceptionResolver時(shí),需要配置異常與視圖之間的映射關(guān)系,當(dāng)程序發(fā)生異常時(shí),SimpleMappingExceptionResolver將根據(jù)配置的異常與視圖之間的映射關(guān)系,選擇合適的視圖進(jìn)行展示,從而實(shí)現(xiàn)異常的統(tǒng)一處理。SimpleMappingExceptionResolver也可以為所有的異常指定一個(gè)默認(rèn)的異常處理頁(yè)面,當(dāng)應(yīng)用程序拋出的異常沒有對(duì)應(yīng)的映射頁(yè)面,則使用默認(rèn)頁(yè)面處理異常信息。7.1.1
簡(jiǎn)單異常處理器SimpleMappingExceptionResolver類中預(yù)定義了一些常用的屬性用于指定處理異常時(shí)的設(shè)置,其中常見的屬性如下。①exceptionMappings:用于配置異常與視圖之間的映射關(guān)系,即將特定的異常映射到對(duì)應(yīng)的視圖上。②defaultErrorView:用于定義默認(rèn)的異常處理視圖,當(dāng)沒有明確的異常映射時(shí),將會(huì)使用該默認(rèn)視圖。③
exceptionAttribute:用于指定異常信息在視圖中的屬性名稱,這樣在視圖中就可以通過指定的屬性名稱獲取異常信息。7.1.1
簡(jiǎn)單異常處理器(1)創(chuàng)建項(xiàng)目在IDEA中創(chuàng)建一個(gè)名稱為chapter07的MavenWeb項(xiàng)目,在項(xiàng)目的pom.xml中引入SpringMVC、Servlet和Jackson對(duì)應(yīng)的依賴,以及在web.xml中配置SpringMVC前端控制器等信息,并將本書配套資源中提供的頁(yè)面和JavaScript文件引入到項(xiàng)目中。下面通過案例演示使用SimpleMappingExceptionResolver對(duì)異常進(jìn)行統(tǒng)一處理。7.1.1
簡(jiǎn)單異常處理器(2)創(chuàng)建異常處理器類文件7-1ExceptionController.java源代碼在項(xiàng)目的src\main\java目錄下,創(chuàng)建一個(gè)名稱為com.itheima.controller的包,在包中創(chuàng)建ExceptionController類,在ExceptionController類中定義三個(gè)會(huì)拋出不同異常的方法。7.1.1
簡(jiǎn)單異常處理器(3)配置異常與視圖的映射關(guān)系文件7-2spring-mvc.xml源代碼在SpringMVC的配置文件spring-mvc.xml中使用SimpleMappingExceptionResolver指定異常和視圖的映射關(guān)系,具體如文件7-2所示。7.1.1
簡(jiǎn)單異常處理器(4)測(cè)試效果啟動(dòng)項(xiàng)目,測(cè)試空指針異常的異常處理效果,在瀏覽器中訪問http://localhost:8080/chapter07/showNullPointer,頁(yè)面效果如下圖所示。7.1.1
簡(jiǎn)單異常處理器(4)測(cè)試效果接著測(cè)試IO異常的異常處理效果,在瀏覽器中訪問http://localhost:8080/chapter07/showIOException,頁(yè)面效果如下圖所示。7.1.1
簡(jiǎn)單異常處理器(4)測(cè)試效果測(cè)試算術(shù)異常的異常處理效果,在瀏覽器中訪問http://localhost:8080/chapter07/showArithmetic,頁(yè)面效果如下圖所示。7.1.2
自定義異常處理器先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握自定義異常處理器,能夠使用自定義異常處理器處理異常7.1.2
自定義異常處理器在SpringMVC中,開發(fā)者可以通過實(shí)現(xiàn)HandlerExceptionResolver接口創(chuàng)建自定義的異常處理器處理應(yīng)用程序中拋出的異常。HandlerExceptionResolver接口是SpringMVC中用于全局異常處理的接口,它定義了一種策略,用于解決在處理請(qǐng)求過程中發(fā)生的異常。HandlerExceptionResolver接口只有一個(gè)方法,該方法的聲明如下。ModelAndViewresolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex);7.1.2
自定義異常處理器resolveException()方法可以根據(jù)處理器方法執(zhí)行過程中出現(xiàn)的異常類型和其他相關(guān)參數(shù)來解析異常,并返回一個(gè)ModelAndView對(duì)象,其中包含了視圖名稱以及在該視圖中所需的模型數(shù)據(jù),resolveException()方法中的參數(shù)說明如下。①HttpServletRequestrequest:表示當(dāng)前請(qǐng)求的HTTP請(qǐng)求對(duì)象,開發(fā)者可以通過該對(duì)象獲取請(qǐng)求的相關(guān)信息,如請(qǐng)求的URL、請(qǐng)求參數(shù)等。②HttpServletResponseresponse:表示當(dāng)前請(qǐng)求的HTTP響應(yīng)對(duì)象,開發(fā)者可以通過該對(duì)象進(jìn)行對(duì)客戶端的響應(yīng)操作,如設(shè)置響應(yīng)狀態(tài)碼、寫入響應(yīng)內(nèi)容等。③Objecthandler:表示處理當(dāng)前請(qǐng)求的處理器對(duì)象,通常是一個(gè)處理器方法。④Exceptionex:表示當(dāng)前請(qǐng)求過程中拋出的異常對(duì)象,開發(fā)者可以通過該異常對(duì)象獲取異常的相關(guān)信息,如異常類型、異常消息等。7.1.2
自定義異常處理器(1)自定義異常文件7-3MyException.java源代碼在項(xiàng)目中創(chuàng)建包c(diǎn)om.itheima.exception,并在包中創(chuàng)建自定義異常類MyException,具體如文件7-3所示。下面通過案例使用自定義異常處理器分類別處理自定義異常和JDK內(nèi)置的異常。7.1.2
自定義異常處理器(2)定義處理器方法addData()方法源代碼在文件7-1的ExceptionController類中定義方法addData(),在該方法中拋出自定義異常,具體代碼如下所示。7.1.2
自定義異常處理器(3)創(chuàng)建自定義異常處理器文件7-4MyExceptionHandler.java源代碼在項(xiàng)目中創(chuàng)建包c(diǎn)om.itheima.handle,在該包下創(chuàng)建自定義異常處理器MyExceptionHandler,并使用@Component注解標(biāo)注該類。在MyExceptionHandler類中重寫resolveException()方法,用于判斷當(dāng)前異常是自定義異常還是JDK內(nèi)置的異常,根據(jù)異常的種類不同返回不同的異常信息。7.1.2
自定義異常處理器(4)測(cè)試效果將文件7-2中注入SimpleMappingExceptionResolver的配置注釋或刪除,以確保當(dāng)前測(cè)試效果基于自定義異常處理器。啟動(dòng)項(xiàng)目,測(cè)試IO異常的異常處理效果,在瀏覽器中訪問地址http://localhost:8080/chapter07/showIOException,頁(yè)面效果如下圖所示。7.1.2
自定義異常處理器(4)測(cè)試效果測(cè)試自定義異常的異常處理效果,在瀏覽器中訪問地址http://localhost:8080/chapter07/addData,程頁(yè)面效果如下圖所示。7.1.3
異常處理注解先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握異常處理注解的使用,能夠使用異常處理注解處理異常7.1.3
異常處理注解@ControllerAdvice注解是SpringMVC用于定義全局處理器通知的注解,它可用于實(shí)現(xiàn)全局的異常處理、全局?jǐn)?shù)據(jù)綁定、全局?jǐn)?shù)據(jù)預(yù)處理等功能。通常情況下,@ControllerAdvice注解標(biāo)注的類不需要使用@Controller或@RestController注解進(jìn)行標(biāo)注,因?yàn)樗ǔ2恢苯犹幚碚?qǐng)求,而是通過定義異常處理方法、數(shù)據(jù)綁定方法和數(shù)據(jù)預(yù)處理方法來間接影響請(qǐng)求處理的流程。7.1.3
異常處理注解@ExceptionHandler注解是SpringMVC用于標(biāo)記特定異常處理方法的注解,可以在該注解中指定需要處理的異常類型。當(dāng)處理器方法拋出異常時(shí),SpringMVC會(huì)查找并調(diào)用帶有@ExceptionHandler注解的方法處理對(duì)應(yīng)的異常。@ExceptionHandler注解可以在處理器類(即帶有@Controller或@RestController注解的類)中使用,也可以在帶有@ControllerAdvice注解的類中使用。在處理器類中使用時(shí),標(biāo)注@ExceptionHandler注解的方法僅處理當(dāng)前處理器內(nèi)部拋出的指定異常。在帶有@ControllerAdvice注解的類中使用,標(biāo)注@ExceptionHandler注解的方法可以處理整個(gè)應(yīng)用程序中拋出的異常,實(shí)現(xiàn)全局的異常處理邏輯。7.1.3
異常處理注解(1)創(chuàng)建全局異常處理器類文件7-5GlobalExceptionHandler.java源代碼在com.itheima.handle包下創(chuàng)建名稱為GlobalExceptionHandler的全局異常處理器,在ExceptionAdvice類中定義異常處理方法handleMyException()、handleMyException()、handleException()三個(gè)處理不同異常的方法,具體如文件7-5所示。下面通過案例演示基于@ControllerAdvice注解和@ExceptionHandler注解實(shí)現(xiàn)全局異常的處理。7.1.3
異常處理注解(2)測(cè)試效果為了確保當(dāng)前異常處理的效果是基于@ControllerAdvice注解和@ExceptionHandler注解實(shí)現(xiàn),在此先將文件7-4進(jìn)行注釋。啟動(dòng)項(xiàng)目,測(cè)試自定義異常的異常處理效果,在瀏覽器中訪問地址http://localhost:8080/chapter07/addData,頁(yè)面顯示效果如下圖所示。7.1.3
異常處理注解(2)測(cè)試效果測(cè)試IO異常的異常處理效果,在瀏覽器中訪問地址http://localhost:8080/chapter07/showIOException,頁(yè)面效果如下圖所示。7.1.3
異常處理注解(2)測(cè)試效果測(cè)試空指針異常的異常處理效果,在瀏覽器中訪問地址http://localhost:8080/chapter07/showNullPointer,頁(yè)面效果如下圖所示。攔截器7.27.2攔截器在Web應(yīng)用程序的開發(fā)過程中,經(jīng)常需要對(duì)請(qǐng)求進(jìn)行前置處理或后置操作,例如權(quán)限校驗(yàn)、日志記錄、數(shù)據(jù)預(yù)處理等,這些操作若在每個(gè)處理方法中重復(fù)編寫,不僅煩瑣,而且難以維護(hù),對(duì)此可以使用SpringMVC提供的攔截器實(shí)現(xiàn)這些操作。攔截器允許開發(fā)者在請(qǐng)求到達(dá)處理器之前和之后執(zhí)行自定義的業(yè)務(wù)邏輯,提高了代碼的可重用性和可維護(hù)性。下面將對(duì)SpringMVC中攔截器進(jìn)行詳細(xì)講解。7.2.1
攔截器概述先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解攔截器的概念,能夠簡(jiǎn)述攔截器的作用7.2.1
攔截器概述攔截器(Interceptor)是SpringMVC框架提供的一種功能強(qiáng)大的組件,它基于動(dòng)態(tài)攔截的機(jī)制對(duì)Web請(qǐng)求進(jìn)行攔截和處理,這種機(jī)制使得開發(fā)者能夠在請(qǐng)求進(jìn)入處理器之前、處理器處理完請(qǐng)求后以及渲染視圖之后執(zhí)行一些特定的操作。攔截器的作用類似于Filter(過濾器),但是它們的技術(shù)歸屬和攔截內(nèi)容不同。過濾器是基于Servlet技術(shù)的組件,可以攔截所有請(qǐng)求,并且過濾器可以跨越整個(gè)Web應(yīng)用程序的請(qǐng)求流程。攔截器則是SpringMVC技術(shù)棧中的組件,只針對(duì)SpringMVC處理器的請(qǐng)求進(jìn)行攔截,這使得攔截器在SpringMVC應(yīng)用程序中具有更高的針對(duì)性和靈活性。7.2.1
攔截器概述自定義攔截器類可以通過實(shí)現(xiàn)HandlerInterceptor接口實(shí)現(xiàn),HandlerInterceptor接口是SpringMVC中定義攔截器的核心接口,它定義了在請(qǐng)求處理的不同階段可以執(zhí)行的方法。HandlerInterceptor接口的聲明如下。HandlerInterceptor接口源代碼7.2.1
攔截器概述1.preHandle()方法preHandle()方法會(huì)在請(qǐng)求處理之前被調(diào)用,即在處理器方法被調(diào)用之前執(zhí)行,通常使用preHandle()方法執(zhí)行一些前置操作,例如身份驗(yàn)證、日志記錄、權(quán)限檢查等。preHandle()方法的返回值類型為boolean,如果返回true,表示請(qǐng)求會(huì)繼續(xù)向后傳遞,即由后續(xù)的攔截器(如果有的話)和處理器方法處理;如果返回false,則表示攔截器已經(jīng)處理了請(qǐng)求,請(qǐng)求不會(huì)繼續(xù)傳遞,并且會(huì)立即中斷當(dāng)前的請(qǐng)求處理流程。7.2.1
攔截器概述preHandle()方法的參數(shù)說明如下。①request:HTTP請(qǐng)求對(duì)象,它包含了客戶端發(fā)送給服務(wù)器的請(qǐng)求信息,如請(qǐng)求頭、請(qǐng)求參數(shù)等。通過這個(gè)對(duì)象,開發(fā)者可以獲取請(qǐng)求的各種信息,并進(jìn)行相應(yīng)的處理。②response:HTTP響應(yīng)對(duì)象,它用于構(gòu)建服務(wù)器發(fā)送給客戶端的響應(yīng)。通過這個(gè)對(duì)象,開發(fā)者可以設(shè)置響應(yīng)的狀態(tài)碼、響應(yīng)頭以及響應(yīng)體等。③handler:當(dāng)前請(qǐng)求所對(duì)應(yīng)的處理器對(duì)象,它包含了處理請(qǐng)求所需的邏輯。這個(gè)參數(shù)在preHandle()方法中主要用于獲取當(dāng)前請(qǐng)求所對(duì)應(yīng)的具體處理器信息,以便根據(jù)需要進(jìn)行相應(yīng)的處理或決策。7.2.1
攔截器概述2.postHandle()方法postHandle()方法會(huì)在請(qǐng)求處理之后、視圖渲染之前被調(diào)用。此時(shí),處理器方法已經(jīng)執(zhí)行完畢,并可能返回了一個(gè)ModelAndView對(duì)象。開發(fā)者可以在這個(gè)方法中修改視圖、添加模型數(shù)據(jù)、對(duì)請(qǐng)求或響應(yīng)執(zhí)行一些額外的操作。如果處理器方法沒有返回ModelAndView對(duì)象,則postHandle()方法中modelAndView參數(shù)的值為null。postHandle()方法的參數(shù)中,request、response和handler與preHandle()方法中對(duì)應(yīng)的參數(shù)對(duì)象一致。modelAndView表示模型與視圖的容器對(duì)象。7.2.1
攔截器概述3.afterCompletion()方法afterCompletion()方法會(huì)在整個(gè)請(qǐng)求處理流程結(jié)束之后被調(diào)用,即在視圖渲染完畢之后執(zhí)行。通常用于執(zhí)行一些清理工作,如釋放資源、記錄性能統(tǒng)計(jì)信息等。afterCompletion()方法的參數(shù)中,request、response和handler與preHandle()方法中對(duì)應(yīng)的參數(shù)對(duì)象一致。參數(shù)ex表示在請(qǐng)求處理過程中拋出的異常對(duì)象。如果請(qǐng)求處理過程中沒有發(fā)生異常,則此參數(shù)的值為null。通過參數(shù)ex,開發(fā)者可以在afterCompletion()方法中執(zhí)行一些針對(duì)異常的清理或記錄工作。7.2.2
攔截器的配置和執(zhí)行流程先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握攔截器的配置和執(zhí)行流程,能夠在程序中配置攔截器,并說出攔截器的執(zhí)行流程7.2.2
攔截器的配置和執(zhí)行流程要使自定義的攔截器在SpringMVC應(yīng)用中發(fā)揮作用,在程序運(yùn)行之前需要對(duì)其進(jìn)行配置,這需要先創(chuàng)建攔截器實(shí)例并將該實(shí)例注冊(cè)到SpringMVC中。一旦攔截器配置完成,在程序運(yùn)行時(shí),它們會(huì)按照特定的順序執(zhí)行,這一順序與配置攔截器時(shí)的順序密切相關(guān)。下面對(duì)攔截器的配置和執(zhí)行流程進(jìn)行講解。7.2.2
攔截器的配置和執(zhí)行流程(1)XML配置文件方式XML配置攔截器源代碼在SpringMVC的XML配置文件中,可以使用<mvc:interceptors>標(biāo)簽配置攔截器的信息,包括指定攔截的路徑模式和引用自定義的攔截器Bean。配置的示例代碼如下。將自定義的攔截器注冊(cè)到SpringMVC,可以通過XML配置文件和Java配置類兩種主要方式實(shí)現(xiàn)。1.攔截器的配置7.2.2
攔截器的配置和執(zhí)行流程(2)Java配置類方式SpringMVC提供了一套默認(rèn)的配置,這些默認(rèn)配置通常可以滿足大多數(shù)常見的Web開發(fā)需求。然而,在實(shí)際開發(fā)中,開發(fā)者經(jīng)常需要根據(jù)項(xiàng)目的特定需求來調(diào)整或擴(kuò)展這些默認(rèn)配置。為了便于開發(fā)者自定義SpringMVC的配置,SpringMVC提供了WebMvcConfigurer接口。通過實(shí)現(xiàn)WebMvcConfigurer接口,開發(fā)者可以擴(kuò)展SpringMVC的默認(rèn)配置,從而自定義MVC的各種特性,例如添加攔截器、資源處理器、消息轉(zhuǎn)換器等等。7.2.2
攔截器的配置和執(zhí)行流程WebMvcConfigurer接口中的addInterceptors()方法用于向SpringMVC的攔截器注冊(cè)表中添加攔截器。當(dāng)開發(fā)者想要自定義攔截器時(shí),可以實(shí)現(xiàn)WebMvcConfigurer接口,并重寫這個(gè)方法,將自定義的攔截器添加到攔截器注冊(cè)表中。addInterceptors()方法的簽名如下。publicvoidaddInterceptors(InterceptorRegistryregistry)7.2.2
攔截器的配置和執(zhí)行流程用Java配置類的方式配置攔截器源代碼SpringMVC提供了@EnableWebMvc注解用于啟用SpringMVC的功能,并且會(huì)自動(dòng)注冊(cè)一些默認(rèn)的組件,如HandlerMapping,HandlerAdapter,ViewResolver等,基于@EnableWebMvc注解可以靈活地控制各個(gè)組件的注冊(cè)和配置。使用Java配置類的方式配置攔截器的示例如下。7.2.2
攔截器的配置和執(zhí)行流程(1)單個(gè)攔截器的執(zhí)行流程2.攔截器的執(zhí)行流程7.2.2
攔截器的配置和執(zhí)行流程(2)多個(gè)攔截器的執(zhí)行流程假設(shè)項(xiàng)目中定義了攔截器1和攔截器2兩個(gè)攔截器,并且按照攔截器1→攔截器2的順序進(jìn)行配置,此時(shí)多個(gè)攔截器的執(zhí)行流程如下圖所示。7.2.3
案例:登錄驗(yàn)證先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!基于攔截器實(shí)現(xiàn)登錄驗(yàn)證的案例7.2.3
案例:登錄驗(yàn)證本案例的登錄驗(yàn)證指的是,通過驗(yàn)證用戶登錄狀態(tài)來限制對(duì)系統(tǒng)資源的訪問權(quán)限。只有成功登錄的用戶才能訪問系統(tǒng)內(nèi)的各項(xiàng)功能或資源,具體實(shí)現(xiàn)要求如下。①為了避免用戶通過直接請(qǐng)求訪問頁(yè)面,本案例將所有頁(yè)面存儲(chǔ)在項(xiàng)目的WEB-INF/pages目錄。②如果用戶未登錄系統(tǒng)而嘗試直接訪問登錄之外的資源,則將用戶重定向至登錄頁(yè)面。③當(dāng)用戶嘗試登錄系統(tǒng)時(shí),如果提交的用戶名或密碼錯(cuò)誤,系統(tǒng)會(huì)在登錄頁(yè)面顯示相應(yīng)的錯(cuò)誤提示信息。④
當(dāng)已登錄的用戶在系統(tǒng)頁(yè)面中單擊“退出”超鏈接時(shí),系統(tǒng)會(huì)清除用戶的登錄狀態(tài),并引導(dǎo)他們重新返回登錄頁(yè)面。7.2.3
案例:登錄驗(yàn)證(1)導(dǎo)入資源在項(xiàng)目chapter07的src\main\webapp\WEB-INF目錄下創(chuàng)建文件夾pages,將本書配套資源中登錄驗(yàn)證案例的頁(yè)面導(dǎo)入到pages文件夾下。7.2.3
案例:登錄驗(yàn)證(2)創(chuàng)建用戶類文件7-6User.java源代碼在src\main\java目錄下創(chuàng)建包c(diǎn)om.itheima.pojo的包,并在包中創(chuàng)建用戶類User,在User類中,聲明username和password屬性,分別表示用戶名和密碼,并定義每個(gè)屬性的getter/setter方法,具體如文件7-6所示。7.2.3
案例:登錄驗(yàn)證(3)創(chuàng)建處理器類文件7-7UserController.java源代碼在com.itheima.controller包中,創(chuàng)建處理器類UserController,并在該類中定義跳轉(zhuǎn)到系統(tǒng)首頁(yè)、跳轉(zhuǎn)到登錄頁(yè)面、跳轉(zhuǎn)到訂單信息頁(yè)面、用戶登錄和用戶退出的五個(gè)方法,本案例中將用戶名和密碼在程序中硬編碼為heima和123456,具體如文件7-7所示。7.2.3
案例:登錄驗(yàn)證(4)創(chuàng)建攔截器類文件7-8LoginInterceptor.java源代碼在erceptor包中創(chuàng)建攔截器類LoginInterceptor實(shí)現(xiàn)HandlerInterceptor接口,在重寫的preHandle()方法中對(duì)攔截的請(qǐng)求進(jìn)行處理。首先判斷Session中是否存儲(chǔ)了用戶信息。如果Session中存儲(chǔ)了用戶信息,則表明用戶當(dāng)前已經(jīng)成功登錄,對(duì)當(dāng)前請(qǐng)求放行。否則跳轉(zhuǎn)到登錄頁(yè)面,具體如文件7-8所示。7.2.3
案例:登錄驗(yàn)證(5)創(chuàng)建配置類文件7-9WebConfig.java源代碼在項(xiàng)目中創(chuàng)建com.itheima.config包,在該包中創(chuàng)建配置類WebConfig用于配置添加攔截器,在添加的攔截器中除了登錄請(qǐng)求和轉(zhuǎn)跳到登錄頁(yè)面的請(qǐng)求需要放行,其他請(qǐng)求都需要被攔截,具體如文件7-9所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果啟動(dòng)項(xiàng)目,在瀏覽器中訪問系統(tǒng)首頁(yè),訪問路徑為http://localhost:8080/chapter07/main,效果如下圖所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果在瀏覽器中訪問訂單信息頁(yè)面,訪問路徑為http://localhost:8080/chapter07/orderinfo,效果如下圖所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果不填寫任何用戶信息,直接單擊左下角的“登錄”按鈕,效果如下圖所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果在登錄表單中,用戶名輸入框中填寫heima,密碼輸入框中填寫123456,然后單擊左下角的“登錄”按鈕,效果如下圖所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果單擊“訂單信息”超鏈接,效果如下圖所示。7.2.3
案例:登錄驗(yàn)證(6)測(cè)試效果擊“退出”超鏈接,效果如下圖所示。文件上傳和文件下載7.37.3
文件上傳和文件下載在現(xiàn)代的網(wǎng)絡(luò)應(yīng)用中,文件上傳和文件下載是非常常見的功能,無論是為了共享資料、備份數(shù)據(jù),還是實(shí)現(xiàn)遠(yuǎn)程協(xié)作,文件上傳和文件下載都扮演著至關(guān)重要的角色。文件上傳功能使得我們可以輕松地將本地文件傳輸至服務(wù)器,供他人查閱或使用;而文件下載功能則讓用戶能夠方便地從網(wǎng)絡(luò)上獲取所需的資料,滿足個(gè)人或團(tuán)隊(duì)的需求。下面對(duì)基于SpringMVC的文件的上傳和下載進(jìn)行講解。7.3.1
文件上傳先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握文件上傳,能夠在程序中實(shí)現(xiàn)文件上傳的功能7.3.1
文件上傳大多數(shù)文件上傳都是通過表單形式提交給后臺(tái)服務(wù)器,因此,要實(shí)現(xiàn)文件上傳功能,就需要提供一個(gè)文件上傳的表單,并且該表單必須滿足以下3個(gè)條件。①表單提交的HTTP請(qǐng)求方法為POST。②表單的enctype屬性的值設(shè)置為multipart/form-data,這是因?yàn)槲募?shù)據(jù)需要以二進(jìn)制形式存在,不能直接作為文本嵌入到表單數(shù)據(jù)中。multipart/form-data編碼類型允許在單個(gè)請(qǐng)求中發(fā)送文本和二進(jìn)制數(shù)據(jù)。③需要提供文件上傳輸入框。<formaction="uploadUrl"method="post"enctype="multipart/form-data"><inputtype="file"name="filename"multiple="multiple"/><inputtype="submit"value="文件上傳"/></form>7.3.1
文件上傳當(dāng)文件上傳時(shí),瀏覽器會(huì)采用二進(jìn)制流的方式來處理表單數(shù)據(jù)。服務(wù)器端接收到包含文件數(shù)據(jù)的請(qǐng)求后,需要對(duì)這些數(shù)據(jù)進(jìn)行解析處理,以便從中提取出上傳的文件及其相關(guān)信息。SpringMVC為文件上傳提供了直接的支持,通過MultipartResolver接口的實(shí)現(xiàn)類對(duì)象可以處理multipart/form-data類型的請(qǐng)求,將請(qǐng)求中包含的文件和其他表單字段數(shù)據(jù)提取出來。 SpringMVC為MultipartResolver接口提供了實(shí)現(xiàn)類StandardServletMultipartResolver,當(dāng)SpringMVC程序基于Servlet3.0或更高版本的規(guī)范時(shí),只需在Servlet容器中配置multipart相關(guān)的參數(shù),SpringMVC會(huì)默認(rèn)基于StandardServletMultipartResolver處理multipart/form-data類型請(qǐng)求,從而成功地處理文件上傳。7.3.1
文件上傳在Servlet容器中配置multipart相關(guān)的參數(shù)示例如下。<servlet> <multipart-config> <max-file-size>10485760</max-file-size> <max-request-size>20971520</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config></servlet>用于指定單個(gè)上傳文件的最大大小限制,單位為字節(jié)用于指定上傳文件存儲(chǔ)在內(nèi)存中的閾值用于指定整個(gè)請(qǐng)求的最大大小限制7.3.1
文件上傳當(dāng)完成文件上傳表單和文件上傳解析器的配置后,就可以在處理器方法中使用MultipartFile類型的參數(shù)接收上傳的文件,參數(shù)名稱必須和文件上傳表單中文件的名稱一致,示例代碼如下。@ControllerpublicclassFileUploadController{@RequestMapping("/fileUpload")publicStringfileUpload(@RequestParam("file")MultipartFilefile){ if(!file.isEmpty()){ //保存上傳的文件,filename為要保存到的目標(biāo)文件 file.transferTo(newFile("filename")) return"uploadSuccess"; } return"uploadFailure"; }}7.3.1
文件上傳MultipartFile接口的常用方法方法聲明功能描述byte[]getBytes()將文件內(nèi)容轉(zhuǎn)換為字節(jié)數(shù)組形式StringgetContentType()獲取文件的內(nèi)容類型InputStreamgetInputStream()讀取文件內(nèi)容,返回一個(gè)InputStream對(duì)象StringgetName()獲取表單中文件上傳輸入框的參數(shù)名稱StringgetOriginalFilename()獲取上傳文件的原始文件名longgetSize()獲取上傳文件的大小,單位是字節(jié)booleanisEmpty()判斷上傳的文件是否為空,即上傳的文件大小是否為0voidtransferTo(Filefile)將上傳的文件內(nèi)容保存到指定的目標(biāo)文件中7.3.2
文件下載先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握文件下載,能夠在程序中實(shí)現(xiàn)文件下載的功能7.3.2
文件下載文件下載指將服務(wù)器上的文件傳輸?shù)娇蛻舳?,這可以通過HTTP協(xié)議實(shí)現(xiàn),通常是將所下載文件和指定的下載方式等內(nèi)容設(shè)置在HTTP響應(yīng)中,客戶端接收到這些內(nèi)容后,根據(jù)響應(yīng)的內(nèi)容進(jìn)行相應(yīng)的處理,例如保存文件到本地硬盤。HTTP響應(yīng)中響應(yīng)頭Content-Disposition用于指示客戶端應(yīng)該如何處理響應(yīng)體的內(nèi)容,其中,值為attachment時(shí)表示瀏覽器應(yīng)該將文件作為附件下載,并且可以通過設(shè)置filename參數(shù)指定客戶端保存文件時(shí)的默認(rèn)文件名。響應(yīng)頭Content-Type用于指定被傳輸數(shù)據(jù)的類型,當(dāng)該響應(yīng)頭設(shè)置為MediaType.APPLICATION_OCTET_STREAM時(shí),瀏覽器或其他客戶端不知道如何處理這些數(shù)據(jù),進(jìn)而會(huì)提示用戶下載文件,而不是在瀏覽器中直接打開。7.3.2
文件下載在SpringMVC程序中,可以通過操作HttpServletResponse的輸出流實(shí)現(xiàn)文件下載,也可以基于Spring的ResponseEntity類實(shí)現(xiàn)文件下載。ResponseEntity類是用于表示HTTP響應(yīng)的一個(gè)類,它可以封裝響應(yīng)的狀態(tài)碼、頭部信息和主體內(nèi)容,相對(duì)來說比直接操作HttpServletResponse的輸出流簡(jiǎn)潔一些?;赗esponseEntity進(jìn)行文件下載的示例如下?;赗esponseEntity進(jìn)行文件下載源代碼7.3.2
文件下載瀏覽器在處理Content-Disposition頭部時(shí),如果文件名包含非ASCII字符(如中文),則必須進(jìn)行適當(dāng)?shù)木幋a,以確保在HTTP頭部中正確傳遞和解析。當(dāng)前主流的瀏覽器通常使用UTF-8字符編碼來處理文件名中的特殊字符或非ASCII字符,如下是將中文文件名進(jìn)行UTF-8編碼的示例。Stringfilename="文件名";URLEncoder.encode(filename,"UTF-8").replaceAll("\\+","%20");7.3.3
案例:文件上傳和文件下載先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握文件上傳和文件下載,能夠在SpringMVC程序中實(shí)現(xiàn)文件上傳和文件下載7.3.3
案例:文件上傳和文件下載文件上傳和文件下載案例要求如下。①基于項(xiàng)目頁(yè)面的上傳表單,實(shí)現(xiàn)本地文件上傳到項(xiàng)目中指定目錄的功能。②文件上傳成功后將文件的名稱記錄到一個(gè)特定的文件中。③項(xiàng)目的頁(yè)面中提供一個(gè)下載列表,該列表需要展示所有已上傳文件的名稱,用戶單擊列表中的文件名,即可下載對(duì)應(yīng)的文件。7.3.3
案例:文件上傳和文件下載文件7-10web.xml源代碼1.配置multipart相關(guān)的參數(shù)Web應(yīng)用中需要接收用戶上傳的文件時(shí),需要配置multipart相關(guān)的參數(shù)。在項(xiàng)目的web.xml文件中配置multipart相關(guān)的參數(shù),具體如文件7-10所示。7.3.3
案例:文件上傳和文件下載2.實(shí)現(xiàn)文件上傳功能在項(xiàng)目的webapp/WEB-INF目錄下創(chuàng)建一個(gè)名稱為files的文件夾,用于存放上傳成功的文件和記錄文件,其中記錄文件中只記錄上傳成功的文件的名稱。為了便于將記錄文件的文件名稱在頁(yè)面中展示,在此選擇使用JSON文件存儲(chǔ)文件的名稱,在files文件夾下創(chuàng)建記錄文件files.json,后續(xù)在files.json中存儲(chǔ)的數(shù)據(jù)格式為{"names":["文件名1","文件名2",…"文件名n"]}。7.3.3
案例:文件上傳和文件下載2.實(shí)現(xiàn)文件上傳功能操作JSON數(shù)據(jù)時(shí),需要在Java對(duì)象和JSON數(shù)據(jù)之間進(jìn)行序列化和反序列化。Jackson中的ObjectMapper類可以輕松地實(shí)現(xiàn)這些操作,其中ObjectMapper類常用的方法如下。(1)readValue()方法readValue()方法用于將JSON數(shù)據(jù)反序列化為Java對(duì)象。(2)writeValueAsString()方法writeValueAsString()方法用于將Java對(duì)象序列化為JSON字符串。7.3.3
案例:文件上傳和文件下載2.實(shí)現(xiàn)文件上傳功能在pom.xml中引入CommonsIO的依賴,具體如下所示。<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version></dependency>7.3.3
案例:文件上傳和文件下載2.實(shí)現(xiàn)文件上傳功能在項(xiàng)目中創(chuàng)建包c(diǎn)om.itheima.utils,在包下創(chuàng)建工具類JSONFileUtils,在該類中定義讀取文件內(nèi)容和寫入內(nèi)容到文件中的方法,具體如文件7-11所示。文件7-11JSONFileUtils.xml源代碼7.3.3
案例:文件上傳和文件下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026中國(guó)科學(xué)院上海生命科學(xué)研究院生物化學(xué)與細(xì)胞生物學(xué)研究所分子細(xì)胞卓越中心曾安組招聘博士后科研助理2人參考考試題庫(kù)附答案解析
- 2026年甘肅酒泉敦煌市人民法院招聘司法警察備考考試題庫(kù)附答案解析
- 2026上海浦東新區(qū)全球健康學(xué)院招聘教學(xué)科研人員1人備考考試題庫(kù)附答案解析
- 2026上半年云南事業(yè)單位聯(lián)考省發(fā)展和改革委員會(huì)所屬招聘4人備考考試題庫(kù)附答案解析
- 2026年度上半年伊春湯旺縣公安局公開招聘警務(wù)輔助人員20人參考考試試題附答案解析
- 2026沙坪壩區(qū)曙光幼兒園教共體招聘參考考試題庫(kù)附答案解析
- 2026上半年云南事業(yè)單位聯(lián)考德宏師范學(xué)院招聘碩士研究生附以上人員9人參考考試題庫(kù)附答案解析
- 2026山東事業(yè)單位統(tǒng)考濟(jì)寧高招聘4人備考考試題庫(kù)附答案解析
- 投標(biāo)人安全生產(chǎn)制度
- 安全生產(chǎn)督辦工作制度
- DB11∕T161-2024城市道路融雪技術(shù)規(guī)程
- 企業(yè)領(lǐng)導(dǎo)力與團(tuán)隊(duì)管理能力提升
- UL508標(biāo)準(zhǔn)中文版-2018工控產(chǎn)品UL中文版標(biāo)準(zhǔn)
- 礦山安全生產(chǎn)標(biāo)準(zhǔn)化
- 云南省建筑工程竣工報(bào)告表
- 房屋拆除工程投標(biāo)方案(技術(shù)方案)
- GB/T 41339.4-2023海洋生態(tài)修復(fù)技術(shù)指南第4部分:海草床生態(tài)修復(fù)
- 固定動(dòng)火區(qū)申請(qǐng)表、告知書、管理規(guī)定
- 二片罐行業(yè)現(xiàn)狀與發(fā)展趨勢(shì)分析
- LY/T 1694-2007松脂采集技術(shù)規(guī)程
- FZ/T 01137-2016紡織品熒光增白劑的測(cè)定
評(píng)論
0/150
提交評(píng)論