




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章
Servlet技術模型此文檔下載自官網,除本頁,其余未修改,可直接刪除本頁本章內容2.1ServletAP2.2Servlet生命周期2.3分析請求2.4發送響應2.5Web應用程序及結構2.6部署描述文件2.7@WebServlet和@WebInitParam注解2.8ServletConfig接口Servlet是JavaWeb應用開發的基礎,ServletAPI定義了若干接口和類。Servlet規范提供了一個標準的,平臺獨立的框架實現在Servlet和容器之間的通信。該框架是由一組Java接口和類組成的,它們稱為ServletAPI。2.1ServletAPI2.1ServletAPIServlet3.0API由下面4個包組成:javax.servlet包,定義了開發獨立于協議的服務器小程序的接口和類。javax.servlet.http包,定義了開發采用HTTP協議通信的服務器小程序的接口和類。javax.servlet.annotation包,定義9個注解類型和2個枚舉類型。javax.servlet.descriptor包,定義了訪問Web應用程序配置信息的類型。2.1.1javax.servlet包接口名說明Filter在請求和響應之間執行過濾任務的過濾器對象FilterChainServlet容器向開發人員提供的一個過濾器鏈對象FilterConfigServlet容器使用的過濾器配置對象RequestDispatcher將請求轉發到其他資源的對象Servlet所有Servlet的根接口ServletConfigServlet容器使用的Servlet配置對象,用來向Servlet傳遞信息ServletContext該接口定義了一些方法,Servlet可以與Servlet容器通信ServletRequest提供客戶請求的對象ServletResponse提供服務器響應的對象ServletContextListener用于監聽Web應用程序的監聽器接口ServletContextAttributeListener用于監聽Web應用程序屬性的監聽器接口ServletRequestListener用于監聽請求對象的監聽器接口ServletRequestAttributeListener用于監聽請求對象屬性的監聽器接口SingleThreadModel實現單線程的接口,已不推薦使用類名說明GenericServlet定義了一般的、獨立于協議的ServletServletContextAttributeEventServlet環境屬性的事件類ServletContextEventServlet環境的事件類ServletInputStream從客戶請求讀取二進制數據的類ServletOutputStream向客戶發送二進制數據的類ServletRequestAttributeEvent請求屬性事件類ServletRequestEvent請求事件類ServletRequestWrapper請求對象包裝類ServletResponseWrapper響應對象包裝類ServletException當Servlet遇到一般錯誤時拋出該異常UnavailableExceptionServlet或過濾器在其永久或臨時不可用時拋出的異常2.1.1javax.servlet包1.Servlet接口Servlet接口是ServletAPI中的核心接口,每個Servlet必須直接或間接實現該接口。該接口定義了如下5個方法。publicvoidinit(ServletConfigconfig)publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOExceptionpublicServletConfiggetServletConfig()publicStringgetServletInfo()publicvoiddestroy()2.ServletConfig接口ServletConfig接口為用戶提供了有關Servlet配置信息。Servlet配置包括Servlet名稱、Servlet上下文對象、Servlet初始化參數等。3.GenericServlet類GenericServlet抽象類實現了Servlet接口和ServletConfig接口,提供了Servlet接口中除了service()方法外的所有方法的實現,同時增加了幾個支持日志的方法。可以擴展該類并實現service()方法來創建任何類型的Servlet。4.ServletRequest接口ServletRequest接口是獨立于任何協議的請求對象,定義了獲取客戶請求信息的方法,如getParameter()、getProtocol()、getRemoteHost()等。5.ServletResponse接口ServletResponse接口是獨立于任何協議的響應對象,定義了向客戶發送響應的方法,如setContentType()方法、sendRedirect()方法、getWriter()方法等。該包提供創建使用HTTP協議的Servlet所需要的接口和類。該包共定義8個接口和7個類,其中某些接口和類擴展了javax.servlet包中對應的接口和類來實現對HTTP協議的支持。
2.1.2javax.servlet.http包2.1.2javax.servlet.http包接口名說明HttpServletRequest該接口提供了有關HTTP請求的信息HttpServletResponse該接口提供了有關HTTP響應的信息HttpSession實現會話管理的接口,也用來存儲用戶信息HttpSessionActivationListenerHTTP會話啟動監聽器接口HttpSessionAttributeListenerHTTP會話屬性監聽器接口HttpSessionBindingListenerHTTP會話綁定監聽器接口HttpSessionListenerHTTP會話監聽器接口HttpSessionContext該接口已不推薦使用類名說明HttpServlet用于創建HTTPServlet的抽象類Cookie創建Cookie對象的一個實現類HttpServletRequestWrapperHttpServletRequest接口的實現類HttpServletResponseWrapperHttpServletResponse接口的實現類HttpSessionEvent會話事件類HttpSessionBindingEvent會話綁定事件或會話屬性事件類HttpUtils一個工具類,已不推薦使用2.1.2javax.servlet.http包ServletAPI的層次結構1.HttpServlet類HttpServlet抽象類用來實現針對HTTP協議的Servlet,它擴展了GenericServlet類。在HttpServlet類中增加了一新的service()方法,格式如下:
protectedvoidservice(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException是Servlet向客戶提供服務的一個方法,我們編寫的Servlet可以覆蓋該方法。1.HttpServlet類此外,在HttpServlet中針對不同的HTTP請求方法定義了不同的處理方法,如處理GET請求的doGet()方法格式如下:
protectedvoiddoGet(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException通常,我們編寫的Servlet覆蓋doGet()方法或doPost()方法。2.HttpServletRequest接口HttpServletRequest接口擴展了ServletRequest接口并提供了針對HTTP請求操作方法,如定義了從請求對象中獲取HTTP請求頭、Cookie等信息的方法。
3.HttpServletResponse接口HttpServletResponse接口擴展了ServletResponse接口并提供了針對HTTP的發送響應的方法。它定義了為響應設置如HTTP頭、Cookie信息的方法。2.2Servlet生命周期Servlet作為一種在容器中運行的組件,有一個從創建到銷毀的過程,這個過程被稱為Servlet生命周期。Servlet生命周期包括以下幾個階段:加載和實例化Servlet類,調用init()方法初始化Servlet實例,一旦初始化完成,容器從客戶收到請求時就將調用它的service()方法,最后容器在Servlet實例上調用destroy()方法使它進入銷毀狀態。2.2Servlet生命周期2.2.1加載和實例化Servlet對一個Servlet,可能在Web容器啟動時或第一次被訪問時加載到容器中。對每個Servlet,容器使用Class.forName()方法對其加載并實例化。容器創建了Servlet實例后就進入生命周期階段,Servlet生命周期方法包括init()方法service()方法destroy()方法2.2.2初始化Servlet容器創建Servlet實例后,將調用init(ServletConfig)方法初始化Servlet。調用init(ServletConfig)方法后,容器將調用無參數的init()方法,之后Servlet就完成初始化。在Servlet生命周期中init()方法僅被調用一次。2.2.3為客戶提供服務在Servlet實例初始化后,它就準備為客戶提供服務。當容器接收到對Servlet的請求時,容器根據請求中的URL找到正確的Servlet,首先創建兩個對象(請求和響應),然后創建一個新的線程,在該線程中調用service()方法,同時將請求對象和響應對象作為參數傳遞給該方法。Servlet使用響應對象(response)獲得輸出流對象,調用有關方法將響應發送給客戶瀏覽器。之后,線程將被銷毀或者返回到容器管理的線程池。請求和響應對象已經離開其作用域,也將被銷毀。最后客戶得到響應。2.2.3為客戶提供服務2.2.4銷毀和卸載Servlet當容器決定不再需要Servlet實例時,它將在Servlet實例上調用destroy()方法,Servlet在該方法中釋放資源,如它在init()方法中獲得的數據庫連接。一旦該方法被調用,Servlet實例不能再提供服務。一旦Servlet實例被銷毀,它將作為垃圾被回收。如果Web容器關閉,Servlet也將被銷毀和卸載。2.3分析請求HTTP消息是客戶向服務器的請求或者服務器向客戶的響應。HTTP消息的各部分消息部分說明請求行或狀態行指定請求或響應消息的目的請求頭或響應頭指定元信息,如關于消息內容的大小、類型、編碼方式空行可選的消息體請求或響應消息的主要內容2.3.1HTTP請求結構請求行POST/paipaistore/selectProductHTTP/1.1Accept=*/*Accept-Language=zh-cn
Accept-Encoding=gzip,deflate請求頭User-Agent=Mozilla/4.0(compatible;MSIE9.0;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)Host=localhost:8080Connection=Keep-Alive空行數據productname=iphone52.3.1HTTP請求結構由客戶向服務器發出的消息叫做HTTP請求。1.請求行HTTP的請求行由三部分組成:方法名、請求資源的URI和HTTP版本。這三部分由空格分隔。2.請求頭請求行之后的內容稱為請求頭(requestheader),它可以指定請求使用的瀏覽器信息、字符編碼信息及客戶能處理的頁面類型等。接下來是一個空行。空行的后面是請求的數據。3.HTTP的請求方法請求行中的方法名指定了客戶請求服務器完成的動作。方法說明方法說明GET請求讀取一個Web頁面DELETE移除Web頁面POST請求向服務器發送數據TRACE返回收到的請求PUT請求存儲一個Web頁面OPTIONS查詢特定選項HEAD請求讀取一個Web頁面的頭部CONNECT保留作將來使用2.3.1HTTP請求結構4.GET方法和POST方法在所有的HTTP請求方法中,GET方法和POST方法是兩種最常用的方法。GET方法用來檢索資源。它的含義是“獲得(get)由該URI標識的資源”。POST方法用來向服務器發送需要處理的數據,它的含義是“將數據發送(post)到由該URI標識的主動資源”。
GET和POST方法的比較
特征GET方法POST方法資源類型主動的或被動的主動的數據類型文本文本或二進制數據數據量一般不超過255個字符沒有限制可見性數據是URL的一部分,在瀏覽器的地址欄中對用戶可見數據不是URL的一部分而是作為請求的消息體發送,在瀏覽器的地址欄中對用戶不可見數據緩存數據可在瀏覽器的URL歷史中緩存數據不能在瀏覽器的URL歷史中緩存2.3.2發送HTTP請求在客戶端如果發生下面的事件,瀏覽器就向Web服務器發送一個HTTP請求。用戶在瀏覽器的地址欄中輸入URL并按回車鍵。用戶點擊了HTML頁面中的超鏈接。用戶在HTML頁面中添寫一個表單并提交。2.3.3處理HTTP請求在HttpServlet類中,除定義了service()方法為客戶提供服務外,還針對每個HTTP方法定義了相應的doXxx()方法,一般格式如下:protectedvoiddoXxx(HttpServletRequest,
HttpServletResponse)throwsServletException,IOException;HTTP方法HttpServlet方法HTTP方法HttpServlet方法GETdoGet()DELETEdoDelete()POSTdoPost()OPTIONSdoOptions()HEADdoHead()TRACEdoTrace()PUTdoPut()2.3.4分析請求客戶發送給服務器的請求信息被封裝在HttpServletRequest對象中,其中包含了由瀏覽器發送給服務器的數據,這些數據包括請求參數、客戶端有關信息等。
1.檢索請求參數請求參數是隨請求一起發送到服務器的數據,它是以名/值對的形式發送的。可以使用ServletRequest接口中定義的方法檢索由客戶發送的參數publicStringgetParameter(String
name)返回由name指定的請求參數值,如果指的參數不存在,則返回null值。使用該方必須確信指定的參數只有一個值。1.檢索請求參數publicString[]getParameterValues(String
name):返回指定參數name所包含的所有值,返回值是一個String數組。如果指定的參數不存在,則返回null值。1.檢索請求參數publicEnumerationgetParameterNames():返回一個Enumeration對象,它包含請求中所有的請求參數名,元素是String類型的。如果沒有請求參數,則返回一個空的Enumeration對象。publicMapgetParameterMap():返回一個包含所有請求參數的Map對象,該對象以參數名作為鍵、以參數值作為值。請求參數傳遞的方法(1)通過表單指定請求參數,每個表單域可以傳遞一個請求參數,這種方法適用于GET請求和POST請求。(2)通過查詢串指定請求參數,將參數名和值附加在請求的URL后面,這種方法只適用于GET請求。程序2.1login.jsp程序2.2LoginServlet.java2.檢索客戶端有關信息在HttpServletRequest接口中還定義了下面常用的方法用來檢索客戶端有關信息:publicStringgetMethod()publicStringgetRemoteHost()publicStringgetRemoteAddr()
publicint
getRemotePort()publicStringgetProtocol()
publicStringgetRequestURI()publicStringgetQueryString()
publicStringgetContentType()
publicStringgetCharacterEncoding()
程序2.3ClientInfoServlet.java2.檢索客戶端有關信息3.檢索HTTP請求頭HTTP請求頭是隨請求一起發送到服務器息,它是以“名/值”對的形式發送。請求頭內容User-Agent關于瀏覽器和它的平臺的信息Accept客戶能接受并處理的MIME類型Accept-Charset客戶可以接受的字符集Accept-Encoding客戶能處理的頁面編碼的方法Accept–Language客戶能處理的語言Host服務器的DNS名字Authorization訪問密碼保護的Web頁面時,客戶用這個請求頭來標識自己的身份Cookie將一個以前設置的Cookie送回服務器Date消息被發送的日期和時間Connection指示連接是否支持持續連接,值Keep-Alive表示支持持續連接publicStringgetHeader(Stringname):返回指定名稱的請求頭的值。publicEnumerationgetHeaders(Stringname):返回指定名稱的請求頭的Enumeration對象。publicEnumerationgetHeaderNames():返回一個Enumeration對象,它包含所有請求頭名。publicint
getIntHeader(Stringname):返回指定名稱的請求頭的整數值。publiclonggetDateHeader(Stringname):返回指定名稱的請求頭的日期值。程序2.4ShowHeadersServlet.java3.檢索HTTP請求頭2.3.5請求轉發在實際應用中可能需要將請求轉發(forward)到其他資源。使用ServletRequest接口中定義的方法,格式如下:RequestDispatcher
getRequestDispatcher(Stringpath)publicvoidforward(ServletRequestrequest,ServletResponseresponse):將請求轉發到服務器上的另一個動態或靜態資源(如Servlet、JSP頁面或HTML頁面)。publicvoidinclude(ServletRequestrequest,ServletResponseresponse):將控制轉發到指定的資源,并將其輸出包含到當前輸出中。RequestDispatcher接口定義了下面兩個方法2.3.6使用請求對象存儲數據voidsetAttribute(String
name,Object
obj)ObjectgetAttribute(Stringname)voidremoveAttribute(Stringname)程序2.5LoginServlet.java程序2.6welcome.jsp2.3.7實例:一個簡單的考試系統開發一個簡單的考試系統,在JSP頁面中建立一個表單,通過POST方法傳遞參數。程序2.7questions.jsp程序2.8SimpleTestServlet.java2.3.8文件上傳文件上傳是將客戶端的一個或多個文件傳輸到服務器上保存。實現文件上傳首先需要在客戶端的HTML頁面中通過一個表單打開一個文件,然后提交給服務器。上傳文件表單的<form>標簽中應該指定enctype屬性,它的值應該為“multipart/form-data”,<form>標簽的method屬性應該指定為“post”,同時表單應該提供一個<inputtype="file">的輸入域用于指定上傳的文件。2.3.8文件上傳在服務器端,可以使用請求對象的getInputStream()返回ServletInputStream輸入流對象,文件內容就包含在該對象中,另外其中還包含表單域的名稱和值、上傳的文件名、內容類型等信息。例如,假設上傳一個Java源文件,返回的輸入流的內容可能如下。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當表單提交時,瀏覽器將表單各部分的數據發送到服務器端,每個部分之間使用分隔符分隔開。通過請求對象的下面兩個方法來處理上傳的文件。publicPartgetPart(Stringname):返回用name指定名稱的Part對象。publicCollection<Part>getParts():返回所有Part對象的一個集合。Part是Servlet3.0API新增的一個接口,定義在javax.servlet.http包中。它提供了下面的常用方法:publicInputStream
getInputStream()throwsIOException:返回Part對象的輸入流對象。
2.3.8文件上傳publicStringgetContentType():返回Part對象的內容類型。publicStringgetName():返回Part對象的名稱。publiclonggetSize():返回Part對象的大小。publicStringgetHeader(Stringname):返回Part對象指定的MIME頭的值。publicCollection<String>getHeaders(Stringname):返回name指定的頭值的集合。2.3.8文件上傳publicCollection<String>getHeaderNames():返回Part對象頭名稱的集合。publicvoiddelete()throwsIOExceeption:刪除臨時文件。publicvoidwrite(String
fileName)throwsIOException:將Part對象寫到指定的文件中。程序2.10FileUploadServlet.java2.3.8文件上傳對實現文件上傳的Servlet類必須使用@MultipartConfig注解,使用該注解告訴容器該Servlet能夠處理multipart/form-data的請求。使用該注解,HttpServletRequest對象才可以得到表單數據的各部分。使用該注解可以配置容器存儲臨時文件的位置,文件和請求數據的大小限制以及閾值大小。該注解定義了如表2-10所示的元素。2.3.8文件上傳2.3.8文件上傳表2-10@MultipartConfig注解的常用元素元素名類型說明locationString指定容器臨時存儲文件的目錄位置maxFileSizelong指定允許上傳文件的最大字節數maxRequestSizelong指定允許整個請求的multipart/form-data數據的最大字節數fileSizeShresholdint指定文件寫到磁盤后閾值的大小除了在注解中指定文件的限制外,還可以在web.xml文件中使用<servlet>的子元素<multipart-config>指定這些限制,該元素包括4個子元素,分別為:<location>、<max-file-size>、<max-request-size>和<file-size-threshold>。在帶有multipart/form-data的表單中還可以包含一般的文本域,這些域的值仍然可以使用請求對象的getParameter()得到。2.3.8文件上傳2.4發送響應2.4.1HTTP響應結構2.4.2理解ServletResponse2.4.3理解HttpServletResponse2.4.4發送狀態碼和錯誤消息2.4.1HTTP響應結構由服務器向客戶發送的HTTP消息稱為HTTP響應(HTTPresponse)。一個典型的HTTP響應消息狀態行HTTP/1.1200OK
Date:Tue,01Sep200423:59:59GMT響應頭Content-Type:text/htmlContent-Length:52空行響應數據<html><body><h1>Hello,John!</h1></body></html>狀態行由三部分組成,各部分由空格分隔:HTTP版本說明請求結果的響應狀態碼描述狀態碼的短語
HTTP/1.1404NotFound//表示沒有找到與給定的URI匹配的資源HTTP/1.1500InternalError//表示服務器檢測到一個內部錯誤1.狀態行與狀態碼2.響應頭響應頭是服務器向客戶端發送的消息。Date響應頭表示消息發送的日期。Content-Type響應頭指定響應的內容類。Content-Length指示響應內容的長度。3.響應數據空行的后面是響應的數據。<html><body><h1>Hello,World!</h1></body></html>2.4.2輸出流與內容類型Servlet使用輸出流向客戶發送響應。通常,在發送響應數據之前還需通過響應對象的setContentType()方法設置響應的內容類型。publicPrintWriter
getWriter()
publicServletOutputStream
getOutputStream()throwsIOException
publicvoidsetContentType(Stringtype)
1.使用PrintWriterPrintWriter對象被Servlet用來動態產生頁面。調用響應對象的getWriter()方法返回PrintWriter類的對象,它可以向客戶發送文本數據。
PrintWriterout=response.getWriter();2.使用ServletOutputStream如果要向客戶發送二進制數據(如JAR文件),應該使用OutputStream對象。
ServletOutputStream
sos=
response.getOutputStream();3.設置內容類型在向客戶發送數據之前,一般應該設置發送數據的MIME(MultipurposeInternetMailExtensions)內容類型。MIME是描述消息內容類型的因特網標準。response.setContentType("text/html;charset=UTF-8");3.設置內容類型表2-11
常見的MIME內容類型類型名含義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.設置內容類型通過將響應內容類型設置為“application/vnd.ms-excel”可將輸出以Excel電子表格的形式發送給客戶瀏覽器,這樣客戶可將結果保存到電子表格中。輸出內容可以是用制表符分隔的數據或HTML表格數據等,并且還可以使用Excel內建的公式。下面的Servlet使用制表符分隔數據生成Excel電子表格。程序2.11ExcelServlet.java2.4.3設置響應頭響應頭是隨響應數據一起發送到瀏覽器的附加信息。
publicvoidsetHeader(Stringname,Stringvalue)
publicvoidsetIntHeader(Stringname,intvalue)
publicvoidsetDateHeader(Stringname,longdate)
publicvoidaddIntHeader(Stringname,intvalue)
publicvoidaddDateHeader(Stringname,longdate)
典型的響應頭名及其用途響應頭名稱說明Date指定服務器的當前時間Expires指定內容被認為過時的時間Last-Modified指定文檔被最后修改的時間Refresh告訴瀏覽器重新裝載頁面Content-Type指定響應的內容類型Content-Length指定響應的內容的長度Content-Disposition為客戶指定將響應的內容保存到磁盤上的名稱Content-Encoding指定頁面在傳輸過程中使用的編碼方式下面的ShowTimeServlet通過設置Refresh響應頭實現每5秒鐘刷新一次頁面。程序2.12ShowTimeServlet.java要告訴瀏覽器在5秒鐘后跳轉到http://host/path頁面,可以使用下面語句。response.setHeader("Refresh","5;URL=http://host/path/");2.4.3設置響應頭實際上,在HTML頁面中通過在<head>標簽內添加下面代碼也可以實現這個功能。<metahttp-equiv="Refresh"content="5;URL=http://host/path/">2.4.3設置響應頭2.4.4響應重定向Servlet可能決定不直接向瀏覽器發送響應,而是將響應重定向到其他資源。
publicvoidsendRedirect(Stringlocation)location為指定的新的資源的URL,該URL可以是絕對URL(如),也可以是相對URL。若路徑以“/”開頭,則相對于服務器根目錄(如,/helloweb/login.html),若不以“/”開頭,則相對于Web應用程序的文檔根目錄(如,login.jsp)。程序2.13RedirectServlet.java2.4.4響應重定向關于sendRedirect()方法,應該注意如果響應被提交,即響應頭已經發送到瀏覽器,就不能調用該方法,否則將拋出java.lang.IllegalStateException異常。
PrintWriterout=response.getWriter();out.println("<html><body>HelloWorld!</body></html>");out.flush();//響應在這一點被提交了response.sendRedirect("");2.4.5發送狀態碼和錯誤消息服務器向客戶發送的響應的第一行是狀態行,它由三部分組成:HTTP版本、狀態碼和狀態碼的描述信息,如下是一個典型的狀態行:
HTTP/1.1200OK
由于HTTP的版本是由服務器決定的,而狀態的消息與狀態碼有關,因此,在Servlet中一般只需要設置狀態碼。狀態碼200是系統自動設置的,Servlet不需要指定該狀態碼。對其他狀態碼,可以由系統自動設置,也可用響應對象的setStatus()方法設置,該方法的格式為:publicvoidsetStaus(intsc)可以設置任意的狀態碼。參數sc表示要設置的狀態碼對于404狀態碼,其消息為NotFound,HttpServletResponse接口中為該狀態碼定義的常量名為SC_NOT_FOUND。2.4.5發送狀態碼和錯誤消息在HTTP協議1.1版中定義了若干狀態碼,這些狀態碼由3位整數表示,一般分為5類狀態碼范圍含義示例100~199表示信息100表示服務器同意處理客戶的請求200~299表示請求成功200表示請求成功,204表示內容不存在300~399表示重定向301表示頁面移走了,304表示緩存的頁面仍然有效400~499表示客戶的錯誤403表示禁止的頁面,404表示頁面沒有找到500~599表示服務器的錯誤500表示服務器內部錯誤,503表示以后再試2.4.5發送狀態碼和錯誤消息HTTP為常見的錯誤狀態定義了狀態碼,這些錯誤狀態包括:資源沒有找到、資源被永久移動以及非授權訪問等。所有這些代碼都在接口HttpServletResponse中作為常量定義。HttpServletResponse也提供了sendError()方法用來向客戶發送狀態碼,該方法有兩個重載的形式,如下所示。publicvoidsendError(intsc)publicvoidsendError(intsc,Stringmsg)2.4.5發送狀態碼和錯誤消息第一個方法使用一個狀態碼,第二個方法同時指定顯示消息。服務器在默認情況下創建一個HTML格式的響應頁面,其中包含指定的錯誤消息。例如,如果Servlet發現客戶不應訪問其結果,它將調用sendError(HttpServletResponse.SC_UNAUTHORIZED)程序2.14StatusServlet.java2.4.5發送狀態碼和錯誤消息2.5Web應用程序及結構2.5.1Web應用程序2.5.2應用服務器2.5.3Web應用程序的結構2.5.1Web應用程序所謂Web應用程序是一種可以通過Web訪問的應用程序。一個Web應用程序是由完成特定任務的各種Web組件(WebComponents)構成的并通過Web將服務展示給外界。
2.5.2應用服務器Web應用程序駐留在應用服務器(ApplicationServer)上。應用服務器為Web應用程序提供一種簡單的和可管理的對系統資源的訪問機制。它也提供低級的服務,如HTTP協議的實現和數據庫連接管理。Servlet
容器僅僅是應用服務器的一部分。
2.5.2應用服務器市場上可以得到多種應用服務器,其中包括Apache的Tomcat
CauchoTechnology的ResinMacromedia的JRun
JBossOracle的WebLogicIBM的WebSphere其中有些如WebLogic、WebSphere不僅僅是Servlet容器,它們也提供對EJB、JMS以及其他JavaEE技術的支持。2.5.3Web應用程序的結構Web應用程序具有嚴格定義的目錄結構。一個Web應用程序的所有資源被保存在一個結構化的目錄中,目錄結構是按照資源和文件的位置嚴格定義的。Tomcat安裝目錄的webapps目錄是所有Web應用程序的根目錄。
1.理解文檔根目錄每個Web應用程序都有一個文檔根目錄(documentroot),它是應用程序所在的目錄。如果要訪問html目錄中的/hello.html
文件,應該使用下面的URL。http:///helloweb/html/hello.html
helloweb├css(存放級聯樣式表文件)├html(存放HTML文件)├images(存放GIF、JPEG或PNG文件)├js(存放JavaScript腳本文件)├jsp(存放JSP文件)├index.html(默認的歡迎文件)├WEB-INF├classes(類文件目錄)├com.demo.LoginServlet.class├lib(庫文件目錄)├*.jar(jdbcdriver.jar,mytaglib.jar)├web.xml(部署描述文件)2.理解WEB-INF目錄每個Web應用程序在它的根目錄中都必須有一個WEB-INF目錄。該目錄中主要存放供服務器訪問的資源。該目錄主要包含三個內容。
1)classes目錄2)lib目錄
3)web.xml文件3.Web歸檔文件一個Web應用程序包含許多文件,可以將這些文件打包成一個擴展名為.war的Web歸檔文件中,一般稱為WAR文件。可以直接把一個WAR文件放到Tomcat的webapps目錄中,Tomcat會自動把該文件的內容釋放到webapps目錄中并創建一個與WAR文件同名的應用程序。4.默認的Web應用程序除用戶創建的Web應用程序外,Tomcat服務器還維護一個默認的Web應用程序。<tomcat-install>\webapps\ROOT目錄被設置為默認的Web應用程序的文檔根目錄。它與其他的Web應用程序類似,只不過訪問它的資源不需要指定應用程序的名稱或上下文路徑。
2.6部署描述文件Web應用程序中包含多種組件,有些組件可使用注解配置,有些組件需使用部署描述文件配置。部署描述文件(DeploymentDescriptor,簡稱DD)可用來初始化Web應用程序的組件。程序2.15web.xml2.6.1DD文件的定義為了保證跨Web容器的可移植性,部署描述文件的文檔類型定義(DocumentTypeDefinition,DTD)的標準由Sun公司制定。DTD規定了XML文檔的語法和標簽的規則,這些規則包括一系列的元素和實體的聲明。下面列出了<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對應用程序的簡短描述display-name定義應用程序的顯示名稱context-param定義應用程序的初始化參數servlet定義Servletservlet-mapping定義Servlet映射welcome-file-list定義應用程序的歡迎文件session-config定義會話時間listener定義監聽器類filter定義過濾器filter-mapping定義過濾器映射error定義錯誤處理頁面security-constraint定義Web應用程序的安全約束mime-mapping定義常用文件擴展名的MIME類型2.6.2<servlet>元素<servlet>元素為Web應用程序定義一個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名稱,該元素是必選項。定義的名稱在DD文件中應該唯一。可以通過ServletConfig的getServletName()方法檢索Servlet名。2.<servlet-class>元素該元素指定Servlet類的完整名稱,即需要帶包的名稱,例如com.demo.HelloServlet。
容器將使用該類創建Servlet實例。Servlet類以及它所依賴的所有類都應該在Web應用程序的類路徑中。WEB-INF目錄中的classes目錄和lib目錄中的JAR文件被自動添加到容器的類路徑中,因此如果把類放到這兩個地方就不需要設置類路徑。3.<init-param>元素該元素定義向Servlet傳遞的初始化參數。在一個<servlet>元素中可以定義任意多個<init-param>元素。每個<init-param>元素必須有且僅有一組<param-name>和<param-value>子元素。Servlet可以通過ServletConfig接口的getInitParameter
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學年一年級下學期英語教學設計(牛津上海版(試用本))
- 12 干點家務活 (教學設計)2023-2024學年統編版道德與法治一年級下冊
- 核心價值觀友善教育
- 樹干兒童畫課件
- 三年級英語上冊 Unit 2 Friends and Colours Lesson 8 Letters教學設計 冀教版(三起)
- 七年級英語上冊 Unit 4 Food and Restaurants Lesson 22 In the Restaurant教學設計 (新版)冀教版
- Unit 7 Happy Birthday Section A(2a-2e)教學設計 2024-2025學年人教版(2024)七年級英語上冊
- 23《月跡》教學設計-2024-2025學年語文五年級上冊統編版
- 藝術培訓年終工作總結
- 七年級生物下冊 第四單元 生物圈中的人 第八章 人是生殖和發育 第二節 人的生長發育和青春期教學設計(1)(新版)蘇教版
- 仿生原理與創新設計課件
- 小學英語《I could eat a horse》優質教學課件
- 22、小便斗-工程建筑類
- 《滅火器維修》GA95-2015(全文)
- 學校學生特異體質調查表
- vmvare虛擬化平臺巡檢細則和方法
- 市政工程監理規劃范本(完整版)
- 剪刀式升降機
- 法院辦公室廉政風險防控責任清單
- 并聯高抗中性點小電抗補償原理分析及參數選擇方法
- 水蛭深加工提取天然水蛭素項目資金申請報告寫作模板
評論
0/150
提交評論