版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章
Servlet技術(shù)模型此文檔下載自官網(wǎng),除本頁,其余未修改,可直接刪除本頁本章內(nèi)容2.1ServletAP2.2Servlet生命周期2.3分析請(qǐng)求2.4發(fā)送響應(yīng)2.5Web應(yīng)用程序及結(jié)構(gòu)2.6部署描述文件2.7@WebServlet和@WebInitParam注解2.8ServletConfig接口Servlet是JavaWeb應(yīng)用開發(fā)的基礎(chǔ),ServletAPI定義了若干接口和類。Servlet規(guī)范提供了一個(gè)標(biāo)準(zhǔn)的,平臺(tái)獨(dú)立的框架實(shí)現(xiàn)在Servlet和容器之間的通信。該框架是由一組Java接口和類組成的,它們稱為ServletAPI。2.1ServletAPI2.1ServletAPIServlet3.0API由下面4個(gè)包組成:javax.servlet包,定義了開發(fā)獨(dú)立于協(xié)議的服務(wù)器小程序的接口和類。javax.servlet.http包,定義了開發(fā)采用HTTP協(xié)議通信的服務(wù)器小程序的接口和類。javax.servlet.annotation包,定義9個(gè)注解類型和2個(gè)枚舉類型。javax.servlet.descriptor包,定義了訪問Web應(yīng)用程序配置信息的類型。2.1.1javax.servlet包接口名說明Filter在請(qǐng)求和響應(yīng)之間執(zhí)行過濾任務(wù)的過濾器對(duì)象FilterChainServlet容器向開發(fā)人員提供的一個(gè)過濾器鏈對(duì)象FilterConfigServlet容器使用的過濾器配置對(duì)象RequestDispatcher將請(qǐng)求轉(zhuǎn)發(fā)到其他資源的對(duì)象Servlet所有Servlet的根接口ServletConfigServlet容器使用的Servlet配置對(duì)象,用來向Servlet傳遞信息ServletContext該接口定義了一些方法,Servlet可以與Servlet容器通信ServletRequest提供客戶請(qǐng)求的對(duì)象ServletResponse提供服務(wù)器響應(yīng)的對(duì)象ServletContextListener用于監(jiān)聽Web應(yīng)用程序的監(jiān)聽器接口ServletContextAttributeListener用于監(jiān)聽Web應(yīng)用程序?qū)傩缘谋O(jiān)聽器接口ServletRequestListener用于監(jiān)聽請(qǐng)求對(duì)象的監(jiān)聽器接口ServletRequestAttributeListener用于監(jiān)聽請(qǐng)求對(duì)象屬性的監(jiān)聽器接口SingleThreadModel實(shí)現(xiàn)單線程的接口,已不推薦使用類名說明GenericServlet定義了一般的、獨(dú)立于協(xié)議的ServletServletContextAttributeEventServlet環(huán)境屬性的事件類ServletContextEventServlet環(huán)境的事件類ServletInputStream從客戶請(qǐng)求讀取二進(jìn)制數(shù)據(jù)的類ServletOutputStream向客戶發(fā)送二進(jìn)制數(shù)據(jù)的類ServletRequestAttributeEvent請(qǐng)求屬性事件類ServletRequestEvent請(qǐng)求事件類ServletRequestWrapper請(qǐng)求對(duì)象包裝類ServletResponseWrapper響應(yīng)對(duì)象包裝類ServletException當(dāng)Servlet遇到一般錯(cuò)誤時(shí)拋出該異常UnavailableExceptionServlet或過濾器在其永久或臨時(shí)不可用時(shí)拋出的異常2.1.1javax.servlet包1.Servlet接口Servlet接口是ServletAPI中的核心接口,每個(gè)Servlet必須直接或間接實(shí)現(xiàn)該接口。該接口定義了如下5個(gè)方法。publicvoidinit(ServletConfigconfig)publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOExceptionpublicServletConfiggetServletConfig()publicStringgetServletInfo()publicvoiddestroy()2.ServletConfig接口ServletConfig接口為用戶提供了有關(guān)Servlet配置信息。Servlet配置包括Servlet名稱、Servlet上下文對(duì)象、Servlet初始化參數(shù)等。3.GenericServlet類GenericServlet抽象類實(shí)現(xiàn)了Servlet接口和ServletConfig接口,提供了Servlet接口中除了service()方法外的所有方法的實(shí)現(xiàn),同時(shí)增加了幾個(gè)支持日志的方法??梢詳U(kuò)展該類并實(shí)現(xiàn)service()方法來創(chuàng)建任何類型的Servlet。4.ServletRequest接口ServletRequest接口是獨(dú)立于任何協(xié)議的請(qǐng)求對(duì)象,定義了獲取客戶請(qǐng)求信息的方法,如getParameter()、getProtocol()、getRemoteHost()等。5.ServletResponse接口ServletResponse接口是獨(dú)立于任何協(xié)議的響應(yīng)對(duì)象,定義了向客戶發(fā)送響應(yīng)的方法,如setContentType()方法、sendRedirect()方法、getWriter()方法等。該包提供創(chuàng)建使用HTTP協(xié)議的Servlet所需要的接口和類。該包共定義8個(gè)接口和7個(gè)類,其中某些接口和類擴(kuò)展了javax.servlet包中對(duì)應(yīng)的接口和類來實(shí)現(xiàn)對(duì)HTTP協(xié)議的支持。
2.1.2javax.servlet.http包2.1.2javax.servlet.http包接口名說明HttpServletRequest該接口提供了有關(guān)HTTP請(qǐng)求的信息HttpServletResponse該接口提供了有關(guān)HTTP響應(yīng)的信息HttpSession實(shí)現(xiàn)會(huì)話管理的接口,也用來存儲(chǔ)用戶信息HttpSessionActivationListenerHTTP會(huì)話啟動(dòng)監(jiān)聽器接口HttpSessionAttributeListenerHTTP會(huì)話屬性監(jiān)聽器接口HttpSessionBindingListenerHTTP會(huì)話綁定監(jiān)聽器接口HttpSessionListenerHTTP會(huì)話監(jiān)聽器接口HttpSessionContext該接口已不推薦使用類名說明HttpServlet用于創(chuàng)建HTTPServlet的抽象類Cookie創(chuàng)建Cookie對(duì)象的一個(gè)實(shí)現(xiàn)類HttpServletRequestWrapperHttpServletRequest接口的實(shí)現(xiàn)類HttpServletResponseWrapperHttpServletResponse接口的實(shí)現(xiàn)類HttpSessionEvent會(huì)話事件類HttpSessionBindingEvent會(huì)話綁定事件或會(huì)話屬性事件類HttpUtils一個(gè)工具類,已不推薦使用2.1.2javax.servlet.http包ServletAPI的層次結(jié)構(gòu)1.HttpServlet類HttpServlet抽象類用來實(shí)現(xiàn)針對(duì)HTTP協(xié)議的Servlet,它擴(kuò)展了GenericServlet類。在HttpServlet類中增加了一新的service()方法,格式如下:
protectedvoidservice(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException是Servlet向客戶提供服務(wù)的一個(gè)方法,我們編寫的Servlet可以覆蓋該方法。1.HttpServlet類此外,在HttpServlet中針對(duì)不同的HTTP請(qǐng)求方法定義了不同的處理方法,如處理GET請(qǐng)求的doGet()方法格式如下:
protectedvoiddoGet(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException通常,我們編寫的Servlet覆蓋doGet()方法或doPost()方法。2.HttpServletRequest接口HttpServletRequest接口擴(kuò)展了ServletRequest接口并提供了針對(duì)HTTP請(qǐng)求操作方法,如定義了從請(qǐng)求對(duì)象中獲取HTTP請(qǐng)求頭、Cookie等信息的方法。
3.HttpServletResponse接口HttpServletResponse接口擴(kuò)展了ServletResponse接口并提供了針對(duì)HTTP的發(fā)送響應(yīng)的方法。它定義了為響應(yīng)設(shè)置如HTTP頭、Cookie信息的方法。2.2Servlet生命周期Servlet作為一種在容器中運(yùn)行的組件,有一個(gè)從創(chuàng)建到銷毀的過程,這個(gè)過程被稱為Servlet生命周期。Servlet生命周期包括以下幾個(gè)階段:加載和實(shí)例化Servlet類,調(diào)用init()方法初始化Servlet實(shí)例,一旦初始化完成,容器從客戶收到請(qǐng)求時(shí)就將調(diào)用它的service()方法,最后容器在Servlet實(shí)例上調(diào)用destroy()方法使它進(jìn)入銷毀狀態(tài)。2.2Servlet生命周期2.2.1加載和實(shí)例化Servlet對(duì)一個(gè)Servlet,可能在Web容器啟動(dòng)時(shí)或第一次被訪問時(shí)加載到容器中。對(duì)每個(gè)Servlet,容器使用Class.forName()方法對(duì)其加載并實(shí)例化。容器創(chuàng)建了Servlet實(shí)例后就進(jìn)入生命周期階段,Servlet生命周期方法包括init()方法service()方法destroy()方法2.2.2初始化Servlet容器創(chuàng)建Servlet實(shí)例后,將調(diào)用init(ServletConfig)方法初始化Servlet。調(diào)用init(ServletConfig)方法后,容器將調(diào)用無參數(shù)的init()方法,之后Servlet就完成初始化。在Servlet生命周期中init()方法僅被調(diào)用一次。2.2.3為客戶提供服務(wù)在Servlet實(shí)例初始化后,它就準(zhǔn)備為客戶提供服務(wù)。當(dāng)容器接收到對(duì)Servlet的請(qǐng)求時(shí),容器根據(jù)請(qǐng)求中的URL找到正確的Servlet,首先創(chuàng)建兩個(gè)對(duì)象(請(qǐng)求和響應(yīng)),然后創(chuàng)建一個(gè)新的線程,在該線程中調(diào)用service()方法,同時(shí)將請(qǐng)求對(duì)象和響應(yīng)對(duì)象作為參數(shù)傳遞給該方法。Servlet使用響應(yīng)對(duì)象(response)獲得輸出流對(duì)象,調(diào)用有關(guān)方法將響應(yīng)發(fā)送給客戶瀏覽器。之后,線程將被銷毀或者返回到容器管理的線程池。請(qǐng)求和響應(yīng)對(duì)象已經(jīng)離開其作用域,也將被銷毀。最后客戶得到響應(yīng)。2.2.3為客戶提供服務(wù)2.2.4銷毀和卸載Servlet當(dāng)容器決定不再需要Servlet實(shí)例時(shí),它將在Servlet實(shí)例上調(diào)用destroy()方法,Servlet在該方法中釋放資源,如它在init()方法中獲得的數(shù)據(jù)庫連接。一旦該方法被調(diào)用,Servlet實(shí)例不能再提供服務(wù)。一旦Servlet實(shí)例被銷毀,它將作為垃圾被回收。如果Web容器關(guān)閉,Servlet也將被銷毀和卸載。2.3分析請(qǐng)求HTTP消息是客戶向服務(wù)器的請(qǐng)求或者服務(wù)器向客戶的響應(yīng)。HTTP消息的各部分消息部分說明請(qǐng)求行或狀態(tài)行指定請(qǐng)求或響應(yīng)消息的目的請(qǐng)求頭或響應(yīng)頭指定元信息,如關(guān)于消息內(nèi)容的大小、類型、編碼方式空行可選的消息體請(qǐng)求或響應(yīng)消息的主要內(nèi)容2.3.1HTTP請(qǐng)求結(jié)構(gòu)請(qǐng)求行POST/paipaistore/selectProductHTTP/1.1Accept=*/*Accept-Language=zh-cn
Accept-Encoding=gzip,deflate請(qǐng)求頭User-Agent=Mozilla/4.0(compatible;MSIE9.0;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)Host=localhost:8080Connection=Keep-Alive空行數(shù)據(jù)productname=iphone52.3.1HTTP請(qǐng)求結(jié)構(gòu)由客戶向服務(wù)器發(fā)出的消息叫做HTTP請(qǐng)求。1.請(qǐng)求行HTTP的請(qǐng)求行由三部分組成:方法名、請(qǐng)求資源的URI和HTTP版本。這三部分由空格分隔。2.請(qǐng)求頭請(qǐng)求行之后的內(nèi)容稱為請(qǐng)求頭(requestheader),它可以指定請(qǐng)求使用的瀏覽器信息、字符編碼信息及客戶能處理的頁面類型等。接下來是一個(gè)空行??招械暮竺媸钦?qǐng)求的數(shù)據(jù)。3.HTTP的請(qǐng)求方法請(qǐng)求行中的方法名指定了客戶請(qǐng)求服務(wù)器完成的動(dòng)作。方法說明方法說明GET請(qǐng)求讀取一個(gè)Web頁面DELETE移除Web頁面POST請(qǐng)求向服務(wù)器發(fā)送數(shù)據(jù)TRACE返回收到的請(qǐng)求PUT請(qǐng)求存儲(chǔ)一個(gè)Web頁面OPTIONS查詢特定選項(xiàng)HEAD請(qǐng)求讀取一個(gè)Web頁面的頭部CONNECT保留作將來使用2.3.1HTTP請(qǐng)求結(jié)構(gòu)4.GET方法和POST方法在所有的HTTP請(qǐng)求方法中,GET方法和POST方法是兩種最常用的方法。GET方法用來檢索資源。它的含義是“獲得(get)由該URI標(biāo)識(shí)的資源”。POST方法用來向服務(wù)器發(fā)送需要處理的數(shù)據(jù),它的含義是“將數(shù)據(jù)發(fā)送(post)到由該URI標(biāo)識(shí)的主動(dòng)資源”。
GET和POST方法的比較
特征GET方法POST方法資源類型主動(dòng)的或被動(dòng)的主動(dòng)的數(shù)據(jù)類型文本文本或二進(jìn)制數(shù)據(jù)數(shù)據(jù)量一般不超過255個(gè)字符沒有限制可見性數(shù)據(jù)是URL的一部分,在瀏覽器的地址欄中對(duì)用戶可見數(shù)據(jù)不是URL的一部分而是作為請(qǐng)求的消息體發(fā)送,在瀏覽器的地址欄中對(duì)用戶不可見數(shù)據(jù)緩存數(shù)據(jù)可在瀏覽器的URL歷史中緩存數(shù)據(jù)不能在瀏覽器的URL歷史中緩存2.3.2發(fā)送HTTP請(qǐng)求在客戶端如果發(fā)生下面的事件,瀏覽器就向Web服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求。用戶在瀏覽器的地址欄中輸入U(xiǎn)RL并按回車鍵。用戶點(diǎn)擊了HTML頁面中的超鏈接。用戶在HTML頁面中添寫一個(gè)表單并提交。2.3.3處理HTTP請(qǐng)求在HttpServlet類中,除定義了service()方法為客戶提供服務(wù)外,還針對(duì)每個(gè)HTTP方法定義了相應(yīng)的doXxx()方法,一般格式如下:protectedvoiddoXxx(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException;HTTP方法HttpServlet方法HTTP方法HttpServlet方法GETdoGet()DELETEdoDelete()POSTdoPost()OPTIONSdoOptions()HEADdoHead()TRACEdoTrace()PUTdoPut()2.3.4分析請(qǐng)求客戶發(fā)送給服務(wù)器的請(qǐng)求信息被封裝在HttpServletRequest對(duì)象中,其中包含了由瀏覽器發(fā)送給服務(wù)器的數(shù)據(jù),這些數(shù)據(jù)包括請(qǐng)求參數(shù)、客戶端有關(guān)信息等。
1.檢索請(qǐng)求參數(shù)請(qǐng)求參數(shù)是隨請(qǐng)求一起發(fā)送到服務(wù)器的數(shù)據(jù),它是以名/值對(duì)的形式發(fā)送的??梢允褂肧ervletRequest接口中定義的方法檢索由客戶發(fā)送的參數(shù)publicStringgetParameter(String
name)返回由name指定的請(qǐng)求參數(shù)值,如果指的參數(shù)不存在,則返回null值。使用該方必須確信指定的參數(shù)只有一個(gè)值。1.檢索請(qǐng)求參數(shù)publicString[]getParameterValues(String
name):返回指定參數(shù)name所包含的所有值,返回值是一個(gè)String數(shù)組。如果指定的參數(shù)不存在,則返回null值。1.檢索請(qǐng)求參數(shù)publicEnumerationgetParameterNames():返回一個(gè)Enumeration對(duì)象,它包含請(qǐng)求中所有的請(qǐng)求參數(shù)名,元素是String類型的。如果沒有請(qǐng)求參數(shù),則返回一個(gè)空的Enumeration對(duì)象。publicMapgetParameterMap():返回一個(gè)包含所有請(qǐng)求參數(shù)的Map對(duì)象,該對(duì)象以參數(shù)名作為鍵、以參數(shù)值作為值。請(qǐng)求參數(shù)傳遞的方法(1)通過表單指定請(qǐng)求參數(shù),每個(gè)表單域可以傳遞一個(gè)請(qǐng)求參數(shù),這種方法適用于GET請(qǐng)求和POST請(qǐng)求。(2)通過查詢串指定請(qǐng)求參數(shù),將參數(shù)名和值附加在請(qǐng)求的URL后面,這種方法只適用于GET請(qǐng)求。程序2.1login.jsp程序2.2LoginServlet.java2.檢索客戶端有關(guān)信息在HttpServletRequest接口中還定義了下面常用的方法用來檢索客戶端有關(guān)信息:publicStringgetMethod()publicStringgetRemoteHost()publicStringgetRemoteAddr()
publicint
getRemotePort()publicStringgetProtocol()
publicStringgetRequestURI()publicStringgetQueryString()
publicStringgetContentType()
publicStringgetCharacterEncoding()
程序2.3ClientInfoServlet.java2.檢索客戶端有關(guān)信息3.檢索HTTP請(qǐng)求頭HTTP請(qǐng)求頭是隨請(qǐng)求一起發(fā)送到服務(wù)器息,它是以“名/值”對(duì)的形式發(fā)送。請(qǐng)求頭內(nèi)容User-Agent關(guān)于瀏覽器和它的平臺(tái)的信息Accept客戶能接受并處理的MIME類型Accept-Charset客戶可以接受的字符集Accept-Encoding客戶能處理的頁面編碼的方法Accept–Language客戶能處理的語言Host服務(wù)器的DNS名字Authorization訪問密碼保護(hù)的Web頁面時(shí),客戶用這個(gè)請(qǐng)求頭來標(biāo)識(shí)自己的身份Cookie將一個(gè)以前設(shè)置的Cookie送回服務(wù)器Date消息被發(fā)送的日期和時(shí)間Connection指示連接是否支持持續(xù)連接,值Keep-Alive表示支持持續(xù)連接publicStringgetHeader(Stringname):返回指定名稱的請(qǐng)求頭的值。publicEnumerationgetHeaders(Stringname):返回指定名稱的請(qǐng)求頭的Enumeration對(duì)象。publicEnumerationgetHeaderNames():返回一個(gè)Enumeration對(duì)象,它包含所有請(qǐng)求頭名。publicint
getIntHeader(Stringname):返回指定名稱的請(qǐng)求頭的整數(shù)值。publiclonggetDateHeader(Stringname):返回指定名稱的請(qǐng)求頭的日期值。程序2.4ShowHeadersServlet.java3.檢索HTTP請(qǐng)求頭2.3.5請(qǐng)求轉(zhuǎn)發(fā)在實(shí)際應(yīng)用中可能需要將請(qǐng)求轉(zhuǎn)發(fā)(forward)到其他資源。使用ServletRequest接口中定義的方法,格式如下:RequestDispatcher
getRequestDispatcher(Stringpath)publicvoidforward(ServletRequestrequest,ServletResponseresponse):將請(qǐng)求轉(zhuǎn)發(fā)到服務(wù)器上的另一個(gè)動(dòng)態(tài)或靜態(tài)資源(如Servlet、JSP頁面或HTML頁面)。publicvoidinclude(ServletRequestrequest,ServletResponseresponse):將控制轉(zhuǎn)發(fā)到指定的資源,并將其輸出包含到當(dāng)前輸出中。RequestDispatcher接口定義了下面兩個(gè)方法2.3.6使用請(qǐng)求對(duì)象存儲(chǔ)數(shù)據(jù)voidsetAttribute(String
name,Object
obj)ObjectgetAttribute(Stringname)voidremoveAttribute(Stringname)程序2.5LoginServlet.java程序2.6welcome.jsp2.3.7實(shí)例:一個(gè)簡(jiǎn)單的考試系統(tǒng)開發(fā)一個(gè)簡(jiǎn)單的考試系統(tǒng),在JSP頁面中建立一個(gè)表單,通過POST方法傳遞參數(shù)。程序2.7questions.jsp程序2.8SimpleTestServlet.java2.3.8文件上傳文件上傳是將客戶端的一個(gè)或多個(gè)文件傳輸?shù)椒?wù)器上保存。實(shí)現(xiàn)文件上傳首先需要在客戶端的HTML頁面中通過一個(gè)表單打開一個(gè)文件,然后提交給服務(wù)器。上傳文件表單的<form>標(biāo)簽中應(yīng)該指定enctype屬性,它的值應(yīng)該為“multipart/form-data”,<form>標(biāo)簽的method屬性應(yīng)該指定為“post”,同時(shí)表單應(yīng)該提供一個(gè)<inputtype="file">的輸入域用于指定上傳的文件。2.3.8文件上傳在服務(wù)器端,可以使用請(qǐng)求對(duì)象的getInputStream()返回ServletInputStream輸入流對(duì)象,文件內(nèi)容就包含在該對(duì)象中,另外其中還包含表單域的名稱和值、上傳的文件名、內(nèi)容類型等信息。例如,假設(shè)上傳一個(gè)Java源文件,返回的輸入流的內(nèi)容可能如下。2.3.8文件上傳7d81a5209008aContent-Disposition:form-data;name="mnumber"2233447d81a5209008aContent-Disposition:form-data;name="fileName";filename="C:\study\HelloWorld.java"Content-Type:application/octet-streampublicclassHelloWorld{publicstaticvoidmain(String
ars[]){
System.out.println("Hello,World!");}}7d81a5209008aContent-Disposition:form-data;name="submit"提交7d81a5209008a--2.3.8文件上傳程序2.9fileUpload.jsp當(dāng)表單提交時(shí),瀏覽器將表單各部分的數(shù)據(jù)發(fā)送到服務(wù)器端,每個(gè)部分之間使用分隔符分隔開。通過請(qǐng)求對(duì)象的下面兩個(gè)方法來處理上傳的文件。publicPartgetPart(Stringname):返回用name指定名稱的Part對(duì)象。publicCollection<Part>getParts():返回所有Part對(duì)象的一個(gè)集合。Part是Servlet3.0API新增的一個(gè)接口,定義在javax.servlet.http包中。它提供了下面的常用方法:publicInputStream
getInputStream()throwsIOException:返回Part對(duì)象的輸入流對(duì)象。
2.3.8文件上傳publicStringgetContentType():返回Part對(duì)象的內(nèi)容類型。publicStringgetName():返回Part對(duì)象的名稱。publiclonggetSize():返回Part對(duì)象的大小。publicStringgetHeader(Stringname):返回Part對(duì)象指定的MIME頭的值。publicCollection<String>getHeaders(Stringname):返回name指定的頭值的集合。2.3.8文件上傳publicCollection<String>getHeaderNames():返回Part對(duì)象頭名稱的集合。publicvoiddelete()throwsIOExceeption:刪除臨時(shí)文件。publicvoidwrite(String
fileName)throwsIOException:將Part對(duì)象寫到指定的文件中。程序2.10FileUploadServlet.java2.3.8文件上傳對(duì)實(shí)現(xiàn)文件上傳的Servlet類必須使用@MultipartConfig注解,使用該注解告訴容器該Servlet能夠處理multipart/form-data的請(qǐng)求。使用該注解,HttpServletRequest對(duì)象才可以得到表單數(shù)據(jù)的各部分。使用該注解可以配置容器存儲(chǔ)臨時(shí)文件的位置,文件和請(qǐng)求數(shù)據(jù)的大小限制以及閾值大小。該注解定義了如表2-10所示的元素。2.3.8文件上傳2.3.8文件上傳表2-10@MultipartConfig注解的常用元素元素名類型說明locationString指定容器臨時(shí)存儲(chǔ)文件的目錄位置maxFileSizelong指定允許上傳文件的最大字節(jié)數(shù)maxRequestSizelong指定允許整個(gè)請(qǐng)求的multipart/form-data數(shù)據(jù)的最大字節(jié)數(shù)fileSizeShresholdint指定文件寫到磁盤后閾值的大小除了在注解中指定文件的限制外,還可以在web.xml文件中使用<servlet>的子元素<multipart-config>指定這些限制,該元素包括4個(gè)子元素,分別為:<location>、<max-file-size>、<max-request-size>和<file-size-threshold>。在帶有multipart/form-data的表單中還可以包含一般的文本域,這些域的值仍然可以使用請(qǐng)求對(duì)象的getParameter()得到。2.3.8文件上傳2.4發(fā)送響應(yīng)2.4.1HTTP響應(yīng)結(jié)構(gòu)2.4.2理解ServletResponse2.4.3理解HttpServletResponse2.4.4發(fā)送狀態(tài)碼和錯(cuò)誤消息2.4.1HTTP響應(yīng)結(jié)構(gòu)由服務(wù)器向客戶發(fā)送的HTTP消息稱為HTTP響應(yīng)(HTTPresponse)。一個(gè)典型的HTTP響應(yīng)消息狀態(tài)行HTTP/1.1200OK
Date:Tue,01Sep200423:59:59GMT響應(yīng)頭Content-Type:text/htmlContent-Length:52空行響應(yīng)數(shù)據(jù)<html><body><h1>Hello,John!</h1></body></html>狀態(tài)行由三部分組成,各部分由空格分隔:HTTP版本說明請(qǐng)求結(jié)果的響應(yīng)狀態(tài)碼描述狀態(tài)碼的短語
HTTP/1.1404NotFound//表示沒有找到與給定的URI匹配的資源HTTP/1.1500InternalError//表示服務(wù)器檢測(cè)到一個(gè)內(nèi)部錯(cuò)誤1.狀態(tài)行與狀態(tài)碼2.響應(yīng)頭響應(yīng)頭是服務(wù)器向客戶端發(fā)送的消息。Date響應(yīng)頭表示消息發(fā)送的日期。Content-Type響應(yīng)頭指定響應(yīng)的內(nèi)容類。Content-Length指示響應(yīng)內(nèi)容的長度。3.響應(yīng)數(shù)據(jù)空行的后面是響應(yīng)的數(shù)據(jù)。<html><body><h1>Hello,World!</h1></body></html>2.4.2輸出流與內(nèi)容類型Servlet使用輸出流向客戶發(fā)送響應(yīng)。通常,在發(fā)送響應(yīng)數(shù)據(jù)之前還需通過響應(yīng)對(duì)象的setContentType()方法設(shè)置響應(yīng)的內(nèi)容類型。publicPrintWriter
getWriter()
publicServletOutputStream
getOutputStream()throwsIOException
publicvoidsetContentType(Stringtype)
1.使用PrintWriterPrintWriter對(duì)象被Servlet用來動(dòng)態(tài)產(chǎn)生頁面。調(diào)用響應(yīng)對(duì)象的getWriter()方法返回PrintWriter類的對(duì)象,它可以向客戶發(fā)送文本數(shù)據(jù)。
PrintWriterout=response.getWriter();2.使用ServletOutputStream如果要向客戶發(fā)送二進(jìn)制數(shù)據(jù)(如JAR文件),應(yīng)該使用OutputStream對(duì)象。
ServletOutputStream
sos=
response.getOutputStream();3.設(shè)置內(nèi)容類型在向客戶發(fā)送數(shù)據(jù)之前,一般應(yīng)該設(shè)置發(fā)送數(shù)據(jù)的MIME(MultipurposeInternetMailExtensions)內(nèi)容類型。MIME是描述消息內(nèi)容類型的因特網(wǎng)標(biāo)準(zhǔn)。response.setContentType("text/html;charset=UTF-8");3.設(shè)置內(nèi)容類型表2-11
常見的MIME內(nèi)容類型類型名含義application/mswordMicrosoftWord文檔application/pdfAcrobat的pdf文件application/vnd.ms-excelExcel電子表格application/vnd.ms-powerpointPowerPoint演示文稿application/jarJAR文件application/zipZIP壓縮文件audio/midiMIDI音頻文件image/gifGIF圖像image/jpegJPEG圖像text/htmlHTML文檔text/plain純文本video/mpegMPEG視頻片段3.設(shè)置內(nèi)容類型通過將響應(yīng)內(nèi)容類型設(shè)置為“application/vnd.ms-excel”可將輸出以Excel電子表格的形式發(fā)送給客戶瀏覽器,這樣客戶可將結(jié)果保存到電子表格中。輸出內(nèi)容可以是用制表符分隔的數(shù)據(jù)或HTML表格數(shù)據(jù)等,并且還可以使用Excel內(nèi)建的公式。下面的Servlet使用制表符分隔數(shù)據(jù)生成Excel電子表格。程序2.11ExcelServlet.java2.4.3設(shè)置響應(yīng)頭響應(yīng)頭是隨響應(yīng)數(shù)據(jù)一起發(fā)送到瀏覽器的附加信息。
publicvoidsetHeader(Stringname,Stringvalue)
publicvoidsetIntHeader(Stringname,intvalue)
publicvoidsetDateHeader(Stringname,longdate)
publicvoidaddIntHeader(Stringname,intvalue)
publicvoidaddDateHeader(Stringname,longdate)
典型的響應(yīng)頭名及其用途響應(yīng)頭名稱說明Date指定服務(wù)器的當(dāng)前時(shí)間Expires指定內(nèi)容被認(rèn)為過時(shí)的時(shí)間Last-Modified指定文檔被最后修改的時(shí)間Refresh告訴瀏覽器重新裝載頁面Content-Type指定響應(yīng)的內(nèi)容類型Content-Length指定響應(yīng)的內(nèi)容的長度Content-Disposition為客戶指定將響應(yīng)的內(nèi)容保存到磁盤上的名稱Content-Encoding指定頁面在傳輸過程中使用的編碼方式下面的ShowTimeServlet通過設(shè)置Refresh響應(yīng)頭實(shí)現(xiàn)每5秒鐘刷新一次頁面。程序2.12ShowTimeServlet.java要告訴瀏覽器在5秒鐘后跳轉(zhuǎn)到http://host/path頁面,可以使用下面語句。response.setHeader("Refresh","5;URL=http://host/path/");2.4.3設(shè)置響應(yīng)頭實(shí)際上,在HTML頁面中通過在<head>標(biāo)簽內(nèi)添加下面代碼也可以實(shí)現(xiàn)這個(gè)功能。<metahttp-equiv="Refresh"content="5;URL=http://host/path/">2.4.3設(shè)置響應(yīng)頭2.4.4響應(yīng)重定向Servlet可能決定不直接向?yàn)g覽器發(fā)送響應(yīng),而是將響應(yīng)重定向到其他資源。
publicvoidsendRedirect(Stringlocation)location為指定的新的資源的URL,該URL可以是絕對(duì)URL(如),也可以是相對(duì)URL。若路徑以“/”開頭,則相對(duì)于服務(wù)器根目錄(如,/helloweb/login.html),若不以“/”開頭,則相對(duì)于Web應(yīng)用程序的文檔根目錄(如,login.jsp)。程序2.13RedirectServlet.java2.4.4響應(yīng)重定向關(guān)于sendRedirect()方法,應(yīng)該注意如果響應(yīng)被提交,即響應(yīng)頭已經(jīng)發(fā)送到瀏覽器,就不能調(diào)用該方法,否則將拋出java.lang.IllegalStateException異常。
PrintWriterout=response.getWriter();out.println("<html><body>HelloWorld!</body></html>");out.flush();//響應(yīng)在這一點(diǎn)被提交了response.sendRedirect("");2.4.5發(fā)送狀態(tài)碼和錯(cuò)誤消息服務(wù)器向客戶發(fā)送的響應(yīng)的第一行是狀態(tài)行,它由三部分組成:HTTP版本、狀態(tài)碼和狀態(tài)碼的描述信息,如下是一個(gè)典型的狀態(tài)行:
HTTP/1.1200OK
由于HTTP的版本是由服務(wù)器決定的,而狀態(tài)的消息與狀態(tài)碼有關(guān),因此,在Servlet中一般只需要設(shè)置狀態(tài)碼。狀態(tài)碼200是系統(tǒng)自動(dòng)設(shè)置的,Servlet不需要指定該狀態(tài)碼。對(duì)其他狀態(tài)碼,可以由系統(tǒng)自動(dòng)設(shè)置,也可用響應(yīng)對(duì)象的setStatus()方法設(shè)置,該方法的格式為:publicvoidsetStaus(intsc)可以設(shè)置任意的狀態(tài)碼。參數(shù)sc表示要設(shè)置的狀態(tài)碼對(duì)于404狀態(tài)碼,其消息為NotFound,HttpServletResponse接口中為該狀態(tài)碼定義的常量名為SC_NOT_FOUND。2.4.5發(fā)送狀態(tài)碼和錯(cuò)誤消息在HTTP協(xié)議1.1版中定義了若干狀態(tài)碼,這些狀態(tài)碼由3位整數(shù)表示,一般分為5類狀態(tài)碼范圍含義示例100~199表示信息100表示服務(wù)器同意處理客戶的請(qǐng)求200~299表示請(qǐng)求成功200表示請(qǐng)求成功,204表示內(nèi)容不存在300~399表示重定向301表示頁面移走了,304表示緩存的頁面仍然有效400~499表示客戶的錯(cuò)誤403表示禁止的頁面,404表示頁面沒有找到500~599表示服務(wù)器的錯(cuò)誤500表示服務(wù)器內(nèi)部錯(cuò)誤,503表示以后再試2.4.5發(fā)送狀態(tài)碼和錯(cuò)誤消息HTTP為常見的錯(cuò)誤狀態(tài)定義了狀態(tài)碼,這些錯(cuò)誤狀態(tài)包括:資源沒有找到、資源被永久移動(dòng)以及非授權(quán)訪問等。所有這些代碼都在接口HttpServletResponse中作為常量定義。HttpServletResponse也提供了sendError()方法用來向客戶發(fā)送狀態(tài)碼,該方法有兩個(gè)重載的形式,如下所示。publicvoidsendError(intsc)publicvoidsendError(intsc,Stringmsg)2.4.5發(fā)送狀態(tài)碼和錯(cuò)誤消息第一個(gè)方法使用一個(gè)狀態(tài)碼,第二個(gè)方法同時(shí)指定顯示消息。服務(wù)器在默認(rèn)情況下創(chuàng)建一個(gè)HTML格式的響應(yīng)頁面,其中包含指定的錯(cuò)誤消息。例如,如果Servlet發(fā)現(xiàn)客戶不應(yīng)訪問其結(jié)果,它將調(diào)用sendError(HttpServletResponse.SC_UNAUTHORIZED)程序2.14StatusServlet.java2.4.5發(fā)送狀態(tài)碼和錯(cuò)誤消息2.5Web應(yīng)用程序及結(jié)構(gòu)2.5.1Web應(yīng)用程序2.5.2應(yīng)用服務(wù)器2.5.3Web應(yīng)用程序的結(jié)構(gòu)2.5.1Web應(yīng)用程序所謂Web應(yīng)用程序是一種可以通過Web訪問的應(yīng)用程序。一個(gè)Web應(yīng)用程序是由完成特定任務(wù)的各種Web組件(WebComponents)構(gòu)成的并通過Web將服務(wù)展示給外界。
2.5.2應(yīng)用服務(wù)器Web應(yīng)用程序駐留在應(yīng)用服務(wù)器(ApplicationServer)上。應(yīng)用服務(wù)器為Web應(yīng)用程序提供一種簡(jiǎn)單的和可管理的對(duì)系統(tǒng)資源的訪問機(jī)制。它也提供低級(jí)的服務(wù),如HTTP協(xié)議的實(shí)現(xiàn)和數(shù)據(jù)庫連接管理。Servlet
容器僅僅是應(yīng)用服務(wù)器的一部分。
2.5.2應(yīng)用服務(wù)器市場(chǎng)上可以得到多種應(yīng)用服務(wù)器,其中包括Apache的Tomcat
CauchoTechnology的ResinMacromedia的JRun
JBossOracle的WebLogicIBM的WebSphere其中有些如WebLogic、WebSphere不僅僅是Servlet容器,它們也提供對(duì)EJB、JMS以及其他JavaEE技術(shù)的支持。2.5.3Web應(yīng)用程序的結(jié)構(gòu)Web應(yīng)用程序具有嚴(yán)格定義的目錄結(jié)構(gòu)。一個(gè)Web應(yīng)用程序的所有資源被保存在一個(gè)結(jié)構(gòu)化的目錄中,目錄結(jié)構(gòu)是按照資源和文件的位置嚴(yán)格定義的。Tomcat安裝目錄的webapps目錄是所有Web應(yīng)用程序的根目錄。
1.理解文檔根目錄每個(gè)Web應(yīng)用程序都有一個(gè)文檔根目錄(documentroot),它是應(yīng)用程序所在的目錄。如果要訪問html目錄中的/hello.html
文件,應(yīng)該使用下面的URL。http:///helloweb/html/hello.html
helloweb├css(存放級(jí)聯(lián)樣式表文件)├html(存放HTML文件)├images(存放GIF、JPEG或PNG文件)├js(存放JavaScript腳本文件)├jsp(存放JSP文件)├index.html(默認(rèn)的歡迎文件)├WEB-INF├classes(類文件目錄)├com.demo.LoginServlet.class├lib(庫文件目錄)├*.jar(jdbcdriver.jar,mytaglib.jar)├web.xml(部署描述文件)2.理解WEB-INF目錄每個(gè)Web應(yīng)用程序在它的根目錄中都必須有一個(gè)WEB-INF目錄。該目錄中主要存放供服務(wù)器訪問的資源。該目錄主要包含三個(gè)內(nèi)容。
1)classes目錄2)lib目錄
3)web.xml文件3.Web歸檔文件一個(gè)Web應(yīng)用程序包含許多文件,可以將這些文件打包成一個(gè)擴(kuò)展名為.war的Web歸檔文件中,一般稱為WAR文件??梢灾苯影岩粋€(gè)WAR文件放到Tomcat的webapps目錄中,Tomcat會(huì)自動(dòng)把該文件的內(nèi)容釋放到webapps目錄中并創(chuàng)建一個(gè)與WAR文件同名的應(yīng)用程序。4.默認(rèn)的Web應(yīng)用程序除用戶創(chuàng)建的Web應(yīng)用程序外,Tomcat服務(wù)器還維護(hù)一個(gè)默認(rèn)的Web應(yīng)用程序。<tomcat-install>\webapps\ROOT目錄被設(shè)置為默認(rèn)的Web應(yīng)用程序的文檔根目錄。它與其他的Web應(yīng)用程序類似,只不過訪問它的資源不需要指定應(yīng)用程序的名稱或上下文路徑。
2.6部署描述文件Web應(yīng)用程序中包含多種組件,有些組件可使用注解配置,有些組件需使用部署描述文件配置。部署描述文件(DeploymentDescriptor,簡(jiǎn)稱DD)可用來初始化Web應(yīng)用程序的組件。程序2.15web.xml2.6.1DD文件的定義為了保證跨Web容器的可移植性,部署描述文件的文檔類型定義(DocumentTypeDefinition,DTD)的標(biāo)準(zhǔn)由Sun公司制定。DTD規(guī)定了XML文檔的語法和標(biāo)簽的規(guī)則,這些規(guī)則包括一系列的元素和實(shí)體的聲明。下面列出了<web-app>元素的DTD定義,這里給出常用元素。<web-app>元素的DTD定義<!ELEMENTweb-app(description?,display-name?,icon?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error*,jsp-config*,security-constraint*,login-config?,security-role*)>
在部署描述文件中定義的元素元素名說明description對(duì)應(yīng)用程序的簡(jiǎn)短描述display-name定義應(yīng)用程序的顯示名稱context-param定義應(yīng)用程序的初始化參數(shù)servlet定義Servletservlet-mapping定義Servlet映射welcome-file-list定義應(yīng)用程序的歡迎文件session-config定義會(huì)話時(shí)間listener定義監(jiān)聽器類filter定義過濾器filter-mapping定義過濾器映射error定義錯(cuò)誤處理頁面security-constraint定義Web應(yīng)用程序的安全約束mime-mapping定義常用文件擴(kuò)展名的MIME類型2.6.2<servlet>元素<servlet>元素為Web應(yīng)用程序定義一個(gè)Servlet,該元素的DTD定義如下。<!ELEMENTservlet(description?,icon?,display-name?,servlet-name,(servlet-class|jsp-file),init-param*,load-on-startup?,security-role-ref*)>1.<servlet-name>元素該元素用來定義Servlet名稱,該元素是必選項(xiàng)。定義的名稱在DD文件中應(yīng)該唯一??梢酝ㄟ^ServletConfig的getServletName()方法檢索Servlet名。2.<servlet-class>元素該元素指定Servlet類的完整名稱,即需要帶包的名稱,例如com.demo.HelloServlet。
容器將使用該類創(chuàng)建Servlet實(shí)例。Servlet類以及它所依賴的所有類都應(yīng)該在Web應(yīng)用程序的類路徑中。WEB-INF目錄中的classes目錄和lib目錄中的JAR文件被自動(dòng)添加到容器的類路徑中,因此如果把類放到這兩個(gè)地方就不需要設(shè)置類路徑。3.<init-param>元素該元素定義向Servlet傳遞的初始化參數(shù)。在一個(gè)<servlet>元素中可以定義任意多個(gè)<init-param>元素。每個(gè)<init-param>元素必須有且僅有一組<param-name>和<param-value>子元素。Servlet可以通過ServletConfig接口的getInitParameter
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版高中語文必修五-晨讀晚練答案13
- 【原創(chuàng)】江蘇省建陵高級(jí)中學(xué)2013-2020學(xué)年高一寒假作業(yè)物理試題
- 【優(yōu)化方案】2021高考數(shù)學(xué)總復(fù)習(xí)(湖北理科)課后達(dá)標(biāo)檢測(cè):第10章-第4課時(shí)
- 公路勘測(cè)規(guī)范-20210619135727
- 小結(jié)根尖各部分的結(jié)構(gòu)特點(diǎn)和功能
- 《道路交通信號(hào)燈》(GB-14887-2003)
- 食用菌產(chǎn)業(yè)鏈分析與優(yōu)化考核試卷
- 蘇州2025年江蘇蘇州幼兒師范高等專科學(xué)校招聘專任教師及專職輔導(dǎo)員8人筆試歷年典型考點(diǎn)(頻考版試卷)附帶答案詳解版
- 飼養(yǎng)場(chǎng)飼料營養(yǎng)監(jiān)測(cè)考核試卷
- 非公開募集基金參與航空航天產(chǎn)業(yè)投資考核試卷
- 山東省濟(jì)南市2022年中考英語情景運(yùn)用拔高練習(xí)(Word版含答案)
- 中學(xué)校本課程教材《生活中的化學(xué)》
- 污水處理站運(yùn)行維護(hù)管理方案
- 農(nóng)村公路養(yǎng)護(hù)工程施工組織設(shè)計(jì)
- 個(gè)人如何開辦婚介公司,婚介公司經(jīng)營和管理
- 公司物流倉儲(chǔ)規(guī)劃方案及建議書
- 天津市歷年社會(huì)保險(xiǎn)繳費(fèi)基數(shù)、比例
- 2024國家開放大學(xué)電大專科《學(xué)前兒童發(fā)展心理學(xué)》期末試題及答案
- 汽車座椅面套縫紉工時(shí)定額的研究
- 立體幾何常考定理總結(jié)(八大定理)
- 噴嘴壓力計(jì)算表及選型
評(píng)論
0/150
提交評(píng)論