Java Web應(yīng)用開發(fā)任務(wù)式教程(慕課版) 單元7 異常處理與文件的上傳與下載_第1頁
Java Web應(yīng)用開發(fā)任務(wù)式教程(慕課版) 單元7 異常處理與文件的上傳與下載_第2頁
Java Web應(yīng)用開發(fā)任務(wù)式教程(慕課版) 單元7 異常處理與文件的上傳與下載_第3頁
Java Web應(yīng)用開發(fā)任務(wù)式教程(慕課版) 單元7 異常處理與文件的上傳與下載_第4頁
Java Web應(yīng)用開發(fā)任務(wù)式教程(慕課版) 單元7 異常處理與文件的上傳與下載_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單元7異常處理與文件的上傳與下載《JavaWeb應(yīng)用開發(fā)》了解系統(tǒng)異常的相關(guān)概念熟悉異常處理的相關(guān)方法了解文件上傳和下載的功能熟悉文件上傳和下載的相關(guān)工具知識目標能夠理解聲明式異常處理能夠熟練使用Servlet容器實現(xiàn)聲明式異常處理能夠理解編程式異常處理能夠熟練使用try_catch實現(xiàn)編程式異常處理能夠?qū)崿F(xiàn)文件的上傳功能能夠?qū)崿F(xiàn)文件的下載功能能力目標培養(yǎng)學(xué)生軟件開發(fā)的安全意識培養(yǎng)學(xué)生的工匠精神,追求卓越的軟件開發(fā)品質(zhì)培養(yǎng)學(xué)生的社會責(zé)任感素質(zhì)目標學(xué)習(xí)目標某商城系統(tǒng)中商品信息的異常處理任務(wù)7.1任務(wù)描述和技術(shù)分析4技術(shù)分析任務(wù)描述在系統(tǒng)的開發(fā)過程中,不可避免會碰到各種各樣的異常。如何正確高效的解決異常,給用戶更好的使用檢驗,是我們在項目開發(fā)過程中需要持續(xù)努力的。本任務(wù)我們通過商品信息管理中遇到的異常處理為例,介紹Servlet容器和try_catch編程方法來解決聲明式異常和編程式異常。在處理異常的過程中,需要根據(jù)異常的發(fā)生情況和實際問題進行分類處理,通常分為聲明式異常和編程式異常。聲明式異常通過Servlet容器(如Tomcat、Jetty等)可以通過配置web.xml文件來解決聲明式異常,編程式異常則是通過try-catch塊來捕獲和處理異常。支撐知識--異常處理簡介/01異常處理簡介異常就是有異于常態(tài),和正常情況不一樣,有錯誤發(fā)生。在java中,阻止當前方法或作用域的情況,稱之為異常。主要包括如下幾個異常:Throwable類Error類Exception類RuntimeException異常檢查異常異常:Throwable類圖7-1Throwable類在java異常的體系中,所有不正常類都繼承于Throwable類。Throwable主要包括兩個大類,一個是Error類,另一個是Exception類,他們之間的繼承關(guān)系如圖7-1所示。Error類中包括虛擬機錯誤和線程死鎖,一旦Error出現(xiàn)了,程序就徹底崩潰,被稱為程序終結(jié)者。Exception類,也就是通常所說的“異?!?。主要指編碼、環(huán)境、用戶操作輸入出現(xiàn)問題,Exception主要包括兩大類,非檢查異常(RuntimeException)和檢查異常,一般指除RuntimeException之外的其他異常。異常:RuntimeException異常RuntimeException異常主要包括以下四種異常:空指針異常數(shù)組下標越界異常類型轉(zhuǎn)換異常算術(shù)異常。RuntimeException異常會由java虛擬機自動拋出并自動捕獲,此類異常的出現(xiàn)絕大數(shù)情況是代碼本身有問題,應(yīng)該從邏輯上去解決并改進代碼。圖7-4RuntimeException異常異常:檢查異常引起檢查異常的原因多種多樣,例如文件不存在、類找不到、或者是連接錯誤等等。與RuntimeException運行異常不同,該異常我們必須手動在代碼里添加捕獲語句來處理該異常或?qū)惓伋鎏幚?,這也是我們學(xué)習(xí)異常語句中主要處理的異常對象。圖7-5檢查異常支撐知識--

聲明式異常處理—Servelt容器實現(xiàn)/02Servelt容器實現(xiàn)在程序設(shè)計中,聲明式異常處理是通過配置文件指定在發(fā)生異常時應(yīng)該執(zhí)行的操作,將異常處理邏輯與業(yè)務(wù)邏輯分離的一種方式。在聲明式異常處理中,開發(fā)者不需要顯式地在代碼中編寫try-catch塊,而是通過配置文件將異常與處理邏輯關(guān)聯(lián)起來。當一個Servlet拋出一個異常時,Web容器在使用了exception-type元素的web.xml中搜索與拋出異常類型相匹配的配置。因此,必須在web.xml中使用error元素來指定對特定異?;騂TTP狀態(tài)碼作出相應(yīng)的Servlet調(diào)用。Servelt容器實現(xiàn)以下是錯誤處理的Servlet可以訪問的請求屬性列表,用來分析錯誤/異常的性質(zhì)。如表7-1所示。錯誤/異常描述javax.servlet.error.status_code該屬性給出狀態(tài)碼,狀態(tài)碼可被存儲,并在存儲為java.lang.Integer數(shù)據(jù)類型后可被分析javax.servlet.error.exception_type該屬性給出異常類型的信息,異常類型可被存儲,并在存儲為java.lang.Class數(shù)據(jù)類型后可被分析。javax.servlet.error.message該屬性給出確切錯誤消息的信息,信息可被存儲,并在存儲為java.lang.String數(shù)據(jù)類型后可被分析。javax.servlet.error.request_uri該屬性給出有關(guān)URL調(diào)用Servlet的信息,信息可被存儲,并在存儲為java.lang.String數(shù)據(jù)類型后可被分析。javax.servlet.error.exception該屬性給出異常產(chǎn)生的信息,信息可被存儲,并在存儲為java.lang.Throwable數(shù)據(jù)類型后可被分析。javax.servlet.error.servlet_name該屬性給出Servlet的名稱,名稱可被存儲,并在存儲為java.lang.String數(shù)據(jù)類型后可被分析。表7-1錯誤/異常表在web.xml中使用<error>元素配置異常處理??梢耘渲锰囟ǖ漠惓n愋?lt;exception-type>或者特定的HTTP錯誤碼,如<error-code>。對應(yīng)的處理頁面通過<location>元素指定。Servelt容器實現(xiàn):web.xml配置異常處理創(chuàng)建項目Unit7_task1,項目的web.xml中配置異常處理,代碼如下。<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!--其他配置--><!--配置聲明式異常處理--><error><!--配置特定異常類型--><exception-type>java.lang.Exception</exception-type><!--指定異常時的處理頁面--><location>/errors/generic-error.jsp</location></error><error><!--配置特定HTTP錯誤碼--><error-code>404</error-code><!--指定404錯誤時的處理頁面--><location>/errors/not-found.jsp</location></error></web-app>在此例子中,當發(fā)生java.lang.Exception類型的異常時,將重定向到/errors/generic-error.jsp頁面;當發(fā)生HTTP錯誤碼為404時,將重定向到/errors/not-found.jsp頁面。在項目中的errors目錄下要創(chuàng)建generic-error.jsp和not-found.jsp頁面,用于展示相應(yīng)的錯誤信息。這樣配置后,當應(yīng)用程序發(fā)生相應(yīng)的異常或錯誤時,Servlet容器將會根據(jù)web.xml中的配置自動將請求重定向到指定的錯誤頁面,實現(xiàn)了聲明式異常處理。這使得異常處理邏輯與業(yè)務(wù)邏輯分離,提高了代碼的可維護性。支撐知識--

編程式異常處理—try_catch實現(xiàn)/03編程式異常處理編程式異常處理主要通過使用try-catch塊來捕獲和處理異常。在Java中,try-catch塊是一種常見的異常處理機制,允許開發(fā)者在可能拋出異常的代碼塊中捕獲并處理異常。try塊負責(zé)捕獲異常,一旦try中發(fā)現(xiàn)異常,程序的控制權(quán)將被移交給catch塊中的異常處理程序。要注意的是,try語句塊不可以獨立存在,必須與catch或者finally塊并存。(1)try塊出現(xiàn)異常后,跳轉(zhuǎn)到catch代碼塊執(zhí)行。執(zhí)行完catch塊之后程序跳出catch塊,繼續(xù)執(zhí)行后面的代碼。編寫catch塊要注意的是,多個catch塊處理的異常類,要按照先catch子類后catch父類的處理方式,因為會異常會由上而下,就近處理(2)catch塊finally塊是最終執(zhí)行的代碼,不管理有沒有異常拋出或拋出的異常有沒有被捕獲執(zhí)行,finally塊一定會執(zhí)行,一般用于關(guān)閉和釋放資源。(3)finally塊try_catch異常處理示例在項目Unit7_task1中創(chuàng)建包com.example.unit7,包中創(chuàng)建類Example71publicclassExample71{publicstaticvoidmain(String[]args){try{//可能拋出異常的代碼intresult=divide(10,0);System.out.println("Result:"+result);//這行代碼不會執(zhí)行}catch(ArithmeticExceptione){//捕獲ArithmeticException異常,并處理System.out.println("Error:Divisionbyzero");//可以記錄日志、發(fā)送通知等處理邏輯}finally{//可選的finally塊,用于清理資源System.out.println("Finallyblockexecuted");}//程序繼續(xù)執(zhí)行,不受異常影響System.out.println("Programcontinues...");}

//一個可能拋出ArithmeticException的方法privatestaticintdivide(intdividend,intdivisor){returndividend/divisor;}}圖7-6測試結(jié)果上述程序在運行時會拋出ArithmeticException,因為在divide方法中嘗試對10除以0,而除數(shù)不能為0。由于異常被捕獲,程序不會中斷執(zhí)行,而是進入catch塊中處理異常。因此,輸出會顯示錯誤信息和"Finallyblockexecuted",而try-catch結(jié)構(gòu)之后的"Programcontinues..."也會執(zhí)行。程序的運行結(jié)果如圖7-6所示。任務(wù)實現(xiàn)任務(wù)在網(wǎng)上商城系統(tǒng)中,我們將所有的異常進行處理,在數(shù)據(jù)訪問層操作數(shù)據(jù)庫時主要有檢查異常,通過try_catch方法進行處理,在Servelt處理時進行聲明式異常處理,通過在web.xml中進行配置來讓異常在前端頁面進行信息展示。用try_catch方法進行編程式異常處理,主要針對系統(tǒng)代碼內(nèi)的異常進行捕捉和處理,保證系統(tǒng)的正常運行某商城系統(tǒng)中商品信息的異常處理任務(wù)實現(xiàn)某商城系統(tǒng)中商品詳細信息的上傳與下載任務(wù)7.2任務(wù)描述和技術(shù)分析20技術(shù)分析任務(wù)描述在商城系統(tǒng)中,在對商品的信息進行操作時,會涉及到商品的圖片上傳,以更好的給用戶展示商品信息,同時,商家可能需要對商品的所有圖片進行打包下載。在Servlet技術(shù)中實現(xiàn)文件的上傳,需要考慮借助第三方工具或者通過注解標注的方式進行操作,通常,上傳的文件需要存儲在服務(wù)器的特定目錄中,這可以使用JavaI/O或第三方庫(如ApacheCommonsFileUpload)來處理文件的存儲。同時,需要考慮安全性,防止惡意文件上傳和執(zhí)行,可以通過設(shè)置文件大小限制、文件類型限制、檢查文件內(nèi)容等方式來提高安全性。對于文件的下載,需要設(shè)置響應(yīng)頭,告訴瀏覽器響應(yīng)內(nèi)容的類型和如何處理。支撐知識--文件上傳/01文件上傳通過HTTP上傳文件,需要將HTML表單的enctype屬性設(shè)置為multipart/form-data。這允許表單將其數(shù)據(jù)作為多部分MIME消息發(fā)送,每部分可以包含一個文件內(nèi)容。利用ApacheCommonsFileUpload對文件上傳的豐富處理能力,實現(xiàn)servlet對文件的上傳功能。Servlet可以與HTML的form標簽一起使用,允許用戶上傳文件到服務(wù)器。上傳的文件可以是文本文件或圖像文件或任何文檔。上傳文件需要引入的jar文件:commons-fileupload.jar和commons-io.jar,通過maven依賴引入。文件上傳(1)創(chuàng)建項目,引入maven依賴<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency>文件上傳(2)創(chuàng)建文件上傳頁面文件上傳需要給用戶提供一個操作文件上傳的頁面,頁面中創(chuàng)建一個文件上傳表單,有幾點需要特別注意:表單method屬性應(yīng)該設(shè)置為POST方法,不能使用GET方法;表單enctype屬性應(yīng)該設(shè)置為multipart/form-data;表單action屬性應(yīng)該設(shè)置為在后端服務(wù)器上處理文件上傳的Servlet文件。文件上傳(2)創(chuàng)建文件上傳頁面在webapp下創(chuàng)建upload.jsp頁面文件,在表單的form標簽中,設(shè)置了表單提交方式為post,同時enctype的類型為“multipart/form-data”。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"

isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>文件上傳實例</title></head><body><h1>文件上傳實例</h1><formmethod="post"action="

${pageContext.request.contextPath}/UploadServlet"enctype="multipart/form-data">

選擇一個文件:<inputtype="file"name="uploadFile"/><inputtype="submit"value="上傳"/></form></body></html>文件上傳(3)編寫Servlet項目src的main目錄的java下,創(chuàng)建包com.example.unit7,包中創(chuàng)建UploadServlet類,接收文件上傳請求并處理。根據(jù)給定后端的接收地址,將上傳的文件存放于WEB-INF目錄下。首先,判斷上傳文件的保存目錄是否存在,如果不存在則創(chuàng)建目錄,如果存在,利用Apache文件上傳組件接收文件,通過文件流的形式讀取文件并進行存儲。文件上傳結(jié)束后,返回對應(yīng)的結(jié)果。文件上傳(3)編寫Servlet//解決上傳文件名的中文亂碼

upload.setHeaderEncoding("UTF-8");//3、判斷提交上來的數(shù)據(jù)是否是上傳表單的數(shù)據(jù)

if(!ServletFileUpload.isMultipartContent(request)){//按照傳統(tǒng)方式獲取數(shù)據(jù)

return;}//4、使用ServletFileUpload解析器解析上傳數(shù)據(jù),解析結(jié)果返回的是一個List<FileItem>集合,每一個FileItem對應(yīng)一個Form表單的輸入項

List<FileItem>list=upload.parseRequest(request);for(FileItemitem:list){//如果fileitem中封裝的是普通輸入項的數(shù)據(jù)

if(item.isFormField()){Stringname=item.getFieldName();//解決普通輸入項的數(shù)據(jù)的中文亂碼問題

Stringvalue=item.getString("UTF-8");//value=newString(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name+"="+value);}else{//如果fileitem中封裝的是上傳文件publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//設(shè)置上傳文件的保存目錄,將上傳的文件存放于WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全

StringsavePath=this.getServletContext().getRealPath("/WEB-INF/upload");System.out.println(savePath);Filefile=newFile(savePath);//判斷上傳文件的保存目錄是否存在

if(!file.exists()&&!file.isDirectory()){System.out.println(savePath+"目錄不存在,需要創(chuàng)建");//創(chuàng)建目錄

file.mkdir();}//消息提示

Stringmessage="";try{//使用Apache文件上傳組件處理文件上傳步驟:

//1、創(chuàng)建一個DiskFileItemFactory工廠

DiskFileItemFactoryfactory=newDiskFileItemFactory();//2、創(chuàng)建一個文件上傳解析器

ServletFileUploadupload=newServletFileUpload(factory);文件上傳(3)編寫Servlet

out.write(buffer,0,len);}//關(guān)閉輸入流

in.close();//關(guān)閉輸出流

out.close();//刪除處理文件上傳時生成的臨時文件

item.delete();message="文件上傳成功!";}}}catch(Exceptione){message="文件上傳失?。?;e.printStackTrace();}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request,response);}

//得到上傳的文件名稱,

Stringfilename=item.getName();System.out.println(filename);if(filename==null||filename.trim().equals("")){continue;}//處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分

filename=filename.substring(filename.lastIndexOf("\\")+1);//獲取item中的上傳文件的輸入流

InputStreamin=item.getInputStream();//創(chuàng)建一個文件輸出流

FileOutputStreamout=newFileOutputStream(savePath+"\\"+filename);//創(chuàng)建一個緩沖區(qū)

bytebuffer[]=newbyte[1024];//判斷輸入流中的數(shù)據(jù)是否已經(jīng)讀完的標識

intlen=0;//循環(huán)將輸入流讀入到緩沖區(qū)當中,(len=in.read(buffer))>0就表示in里面還有數(shù)據(jù)

while((len=in.read(buffer))>0){//使用FileOutputStream輸出流將緩沖區(qū)的數(shù)據(jù)寫入到指定的目錄(savePath+"\\"+filename)當中文件上傳(4)上傳結(jié)果頁面<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>文件上傳結(jié)果</title></head><body><h2>${message}</h2></body></html>瀏覽請求上傳頁面upload.jsp,如圖7-9所示。單擊“選擇文件”,即可打開“打開文件”對話框,進行上傳文件的選擇。支撐知識--文件下載/02文件下載在Servlet中實現(xiàn)文件下載的過程涉及幾個關(guān)鍵步驟,確保用戶能夠從服務(wù)器下載文件。具體過程如下:(1)首先,需要確定用戶下載的文件資源是否存在。這可以是服務(wù)器上的一個靜態(tài)文件,或者是動態(tài)生成的數(shù)據(jù)。(2)為了讓瀏覽器識別響應(yīng)為一個文件下載,而不是顯示內(nèi)容,需要設(shè)置HTTP響應(yīng)頭。Content-Type,告訴瀏覽器文件的類型。如果不確定文件類型,可以使用"application/octet-stream",這是一個通用的二進制文件類型,通常用于下載。Content-Disposition,這用于告訴瀏覽器如何處理響應(yīng)的內(nèi)容。將其設(shè)置為"attachment;filename=\""+fileName+"\"",這會提示瀏覽器將響應(yīng)作為下載處理,而不是在瀏覽器中直接打開,并提供一個文件名。Content-Length,這是可選的,指定文件的大小,可以讓瀏覽器顯示下載進度。(3)最后,需要將文件的內(nèi)容通過Servlet的輸出流傳輸給客戶端。文件下載通過文件流的形式下載文件,前端示例代碼如下。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>FileDownloadExample</title></head><body> <h1>FileDownloadExample</h1><!--這里設(shè)置一個鏈接,點擊時觸發(fā)文件下載--><ahref="${pageContext.request.contextPath}/download"target="_blank">DownloadFile</a></body></html>文件下載在com.example.unit7包中創(chuàng)建FileDownloadServlet類,代碼如下。@WebServlet("/download")publicclassFileDownloadServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//獲取要下載的文件路徑,這里假設(shè)文件在項目的根目錄下StringfilePath=getServletContext().getRealP

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論