版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Servlet入門1、軟件體系架構(gòu)層體系架構(gòu)模式層(layer):把應(yīng)用系統(tǒng)分解成子任務(wù)組,其中每個子任務(wù)組處于一個特定的抽象層次上。層架構(gòu)模式組織成一個層次結(jié)構(gòu),每一層為上層服務(wù)(ServiceProvider),同時也作為下層的客戶端。內(nèi)部層只對相鄰的層可見。層之間的調(diào)用通過決定層間如何交換的協(xié)議來定義。每一層最多只影響兩層,同時只要給相鄰兩層提供接口,允許每層不同的方法實(shí)現(xiàn),因此為軟件重用提供強(qiáng)大的支持??蛻魧覰層N-1層1使用解決的問題源碼的修改會影響整個系統(tǒng),應(yīng)該被限定在一個部件內(nèi)部而不影響其他模塊。接口應(yīng)當(dāng)穩(wěn)定,甚至要被規(guī)范化。系統(tǒng)的架構(gòu)應(yīng)該靈活,可以更換。系統(tǒng)的開發(fā)要被劃分為多個部分,比如團(tuán)隊開發(fā)或者異地開發(fā)。優(yōu)點(diǎn)與缺點(diǎn)優(yōu)點(diǎn)層次的復(fù)用性。如果每個層次有很好的抽象接口,那么它可以被其他環(huán)境復(fù)用。支持基于抽象程度遞增的系統(tǒng)設(shè)計,使設(shè)計者可以把一個復(fù)雜系統(tǒng)按遞增的步驟進(jìn)行分解,使系統(tǒng)更容易模塊化。支持功能增強(qiáng),因?yàn)槊恳粚又炼嗪拖噜彽纳舷聦咏换?,因此功能的改變最多影響相鄰上下層??商鎿Q性。因?yàn)楠?dú)立的層次設(shè)計很容易被功能相同的模塊替換。缺點(diǎn)效率低。通常比單層結(jié)構(gòu)效率低。因?yàn)橛袝r高層過分依賴底層的服務(wù),因此必須穿過許多中間層進(jìn)行數(shù)據(jù)的傳送,甚至多次。改變行為引起連鎖反映Client/Server體系架構(gòu)Server層Client層終端服務(wù)器終端終端表示業(yè)務(wù)邏輯數(shù)據(jù)庫Server層Client層PCDB服務(wù)器PCPC業(yè)務(wù)邏輯數(shù)據(jù)庫表示業(yè)務(wù)邏輯C/S架構(gòu)缺點(diǎn)軟件部署開銷很大。每個客戶端都需要進(jìn)行安裝和設(shè)置,一旦程序發(fā)生變化,就需要重新部署,這意味巨大開銷。業(yè)務(wù)邏輯混雜在客戶端。一旦業(yè)務(wù)需求發(fā)生變化,就需要修改客戶端代碼。改變數(shù)據(jù)結(jié)構(gòu)的開銷很大??蛻舳藨?yīng)用程序一般通過JDBC、ODBC或ADO等技術(shù)直接訪問數(shù)據(jù)庫,如果改變數(shù)據(jù)結(jié)構(gòu)來處理新的過程,就需要修改客戶端程序并重新部署每個客戶端。改變數(shù)據(jù)庫的類型的開銷很大。由于客戶端直接使用特定數(shù)據(jù)庫的API和特定的存儲過程、觸發(fā)器等,因此如果數(shù)據(jù)庫類型的改變,也會引起很多修改。三層體系架構(gòu)Server層Client層PC應(yīng)用服務(wù)器PCPCDatabase層數(shù)據(jù)庫表示業(yè)務(wù)邏輯數(shù)據(jù)庫業(yè)務(wù)邏輯層資源層多層體系結(jié)構(gòu)表示層客戶端層PC應(yīng)用服務(wù)器PCPC數(shù)據(jù)庫業(yè)務(wù)邏輯表示多層描述客戶端層代表訪問系統(tǒng)的人員、應(yīng)用程序或系統(tǒng)的客戶端。它是整個系統(tǒng)的對外接口,可以是Web瀏覽器、Java應(yīng)用程序、WAP、其他設(shè)備等。表示層該層封裝了用來訪問系統(tǒng)的所有客戶端的表示層邏輯。該層解釋客戶端的請求,提供登陸,實(shí)現(xiàn)會話管理,控制對業(yè)務(wù)的訪問(權(quán)限控制),構(gòu)造客戶端的響應(yīng),以及把響應(yīng)傳遞給客戶端。業(yè)務(wù)邏輯層提供業(yè)務(wù)服務(wù),包括業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯。通常應(yīng)用程序的大多數(shù)業(yè)務(wù)處理集中在本層。同時它管理事務(wù)。集成層負(fù)責(zé)與外部系統(tǒng)和外部資源通信,它有多種方式,例如數(shù)據(jù)庫連接使用JDBC等。資源層包括業(yè)務(wù)數(shù)據(jù)源和外部系統(tǒng)資源,如數(shù)據(jù)庫,JMSServer和其他遺留系統(tǒng)等。J2EE架構(gòu)2、HTTP基礎(chǔ)HTTP協(xié)議超文本傳輸協(xié)議(HTTP)是一個簡單的、無狀態(tài)的協(xié)議。Web瀏覽器發(fā)出一個請求Web服務(wù)器接收請求,處理并發(fā)出響應(yīng)Web瀏覽器接收響應(yīng),結(jié)束!無狀態(tài):它沒有為服務(wù)器提供內(nèi)置方法--識別一系列的請求源自同一個用戶。Web服務(wù)器ClientrequestresponserequestresponseHTTP請求請求(request)用來告訴Web服務(wù)器需要執(zhí)行的活動,它通過一個HTTP命令method來區(qū)分。請求也包括參數(shù)和HTTP版本。GET/index.htmlHTTP/1.0請求也可以包含一些可選的頭信息,告訴Web服務(wù)器一些關(guān)于請求的額外信息。User-Agent:Mozilla/4.0(compatible;MSIE4.0;Windows95)告訴關(guān)于客戶端軟件的信息GET方法GET方法用來從Web服務(wù)器獲取信息(如文檔,圖表,數(shù)據(jù)庫查詢結(jié)果等)。當(dāng)在瀏覽器中直接輸入URL,或單擊一個hyperlink時候,就向Web服務(wù)器發(fā)出了一個GET請求。GET請求可以在URL后面添加一些參數(shù),所謂的查詢串(querystring)。這些參數(shù)可以發(fā)送給Web服務(wù)器。http://localhost/getuserinfo.html?id=100&name=abcGET方法也可以用來提交HTML表單(form)。POST方法POST方法用來向Web服務(wù)器發(fā)送信息(如信用卡號,文件等)。POST請求一般和HTML的表單標(biāo)記使用,用于錄入數(shù)據(jù),并傳遞給Web服務(wù)器。POST請求用于向Web服務(wù)器發(fā)送大量的信息。<formaction=“xxx”method=POST>FirstName:<inputtype=textsize=20name=firstname><br>LastName:<inputtype=textsize=20name=lastname><br><inputtype=submit></form>其他方法HEAD方法用于獲取響應(yīng)的頭信息,判斷文檔大小、更新時間等。PUT方法在Web服務(wù)器上直接放置文檔。DELETE方法刪除Web服務(wù)器上的文檔。TRACE方法用于調(diào)試。OPTIONS方法查詢服務(wù)器支持哪些方法。HTTP響應(yīng)客戶發(fā)出請求后,服務(wù)器處理請求,并送回一個響應(yīng)(response),表示處理結(jié)果。第一行表示狀態(tài)信息,如服務(wù)器使用的HTTP版本、狀態(tài)代碼和描述。HTTP/1.1200OK響應(yīng)的頭信息,告訴客戶server端使用的軟件、響應(yīng)的內(nèi)容的類型等。Date:Saturday,23-May-0003:25:12GMTServer:TomcatWebServer/3.2MIME-version:1.0Content-type:text/htmlContent-length:1029最后是結(jié)果的內(nèi)容,如HTML頁面的內(nèi)容。3、介紹ServletServlet做什么?Servlet是用Java代碼編寫的服務(wù)器端軟件程序,用于處理客戶機(jī)和服務(wù)器之間的消息傳遞。Servlet可以通過動態(tài)構(gòu)造一個發(fā)回客戶機(jī)的響應(yīng)來響應(yīng)客戶機(jī)請求。Servlet可以訪問整個JavaAPI集合。非常適合實(shí)現(xiàn)復(fù)雜的商業(yè)應(yīng)用邏輯??梢远啻握{(diào)用一個Servlet來響應(yīng)來自多個客戶機(jī)的請求。一個Servlet可以同時處理多個請求,并且可以使這些請求同步。Servlet可以將請求轉(zhuǎn)發(fā)到其他服務(wù)器和Servlet。Web服務(wù)器和應(yīng)用服務(wù)器Web服務(wù)器用于處理靜態(tài)HTML頁面請求,它可以將靜態(tài)的HTML頁面作為響應(yīng)返回給客戶端。Apache,IIS等。一些商業(yè)Web服務(wù)器包含一個簡單的Servlet容器,可以用來運(yùn)行Servlet。應(yīng)用服務(wù)器擴(kuò)展了Web服務(wù)器的功能,它可以處理Servlet、EJB和Web應(yīng)用程序的請求它包含相應(yīng)的容器:Servlet/JSP容器,EJB容器等。BEAWebLogic,IBMWebSphere,SuniPlanet,ApacheTomcat,JBoss等。Servlet如何工作?Servlet在支持Java的應(yīng)用服務(wù)器中運(yùn)行。服務(wù)器自己裝入、執(zhí)行和管理Servlet,服務(wù)器使用JRE來運(yùn)行Servlet??蛻魴C(jī)將請求發(fā)送到服務(wù)器;服務(wù)器實(shí)例化(裝入)Servlet,并為Servlet創(chuàng)建線程;(Servlet是在出現(xiàn)第一個請求時裝入的,服務(wù)器在關(guān)閉前不會卸載它)服務(wù)器將請求信息發(fā)送到Servlet;Servlet創(chuàng)建一個響應(yīng),并將它傳遞到服務(wù)器;服務(wù)器將響應(yīng)發(fā)回客戶機(jī)。應(yīng)用服務(wù)器ServletClientResourcese.g.DatabaserequestresponseJavaAPIsuchasJDBC如何運(yùn)行ServletServlet可以作為顯式URL引用調(diào)用,或者嵌入在HTML中并從Web應(yīng)用程序調(diào)用。Servlet在應(yīng)用服務(wù)器的機(jī)器上的某一個目錄中,這個目錄可以配置到不同的位置。當(dāng)?shù)谝淮螐目蛻魴C(jī)調(diào)用Servlet時,將裝入這些Servlet?;蛘?,可以在應(yīng)用服務(wù)器啟動的時候裝入它們。應(yīng)用服務(wù)器必須支持編寫JavaServlet的版本級別。JavaServlet版本2.1、2.2、2.3等什么是JavaServletAPI?JavaServletAPI是一組類,用于定義Web客戶機(jī)和Servlet之間的標(biāo)準(zhǔn)接口。JavaServletAPI有兩個包:javax.servlet:包含了支持普通協(xié)議無關(guān)的Servlet的類;javax.servlet.http:包含了對HTTP協(xié)議的特別支持。Servlet接口類定義了管理Servlet一起它與客戶機(jī)通信的方法。HttpServlet類是基于HTTP協(xié)議的Servlet實(shí)現(xiàn);HttpServletRequest類代表發(fā)送到Servlet的請求;HttpServletResponse類代表從Servlet發(fā)回客戶端的響應(yīng)。處理HTTPServlet的關(guān)鍵方法GET請求:是Web頁面的典型瀏覽器請求,它是在用戶輸入URL或使用鏈接時發(fā)出的。POST請求:是用戶提交指定發(fā)出的HTML表單時生成的。HttpServlet的子類必須至少覆蓋一個方法:doGet或doPost來處理請求。service:實(shí)現(xiàn)Servlet的最低級標(biāo)準(zhǔn)方法doPut:用于HTTPPUT請求doPost:用于HTTPPOST請求init和destroy:用于管理Servlet的生命周期裝入和初始化第一次請求服務(wù)時,服務(wù)器將動態(tài)裝入并實(shí)例化Servlet。還可以將Servlet配置成應(yīng)用服務(wù)器啟動的時候裝入和實(shí)例化特定的Servlet。Servlet的init方法被自動調(diào)用。在處理任何請求之前,都會為每個Servlet實(shí)例調(diào)用它一次。init方法執(zhí)行的示例包括裝入配置數(shù)據(jù)或建立數(shù)據(jù)庫連接等。處理多線程Servlet由應(yīng)用服務(wù)器裝入。同一時間只有一個Servlet對象的實(shí)例,并且它在Servlet的使用期間將一直保留。兩個客戶同時請求Servlet的服務(wù)。服務(wù)器會根據(jù)實(shí)例對象為每個請求創(chuàng)建一個處理程序線程。每個線程都可以訪問裝入Servlet時初始化的變量。每個線程處理它自己的請求。服務(wù)器將響應(yīng)發(fā)送回相應(yīng)的客戶機(jī)。應(yīng)用服務(wù)器ServletinstanceClient1Client2Thread1Thread24、Web應(yīng)用概述Web應(yīng)用Web應(yīng)用是Web或應(yīng)用服務(wù)器的動態(tài)擴(kuò)展Presentation-oriented:為響應(yīng)用戶的請求,產(chǎn)生交互的Web頁面,包含各種標(biāo)記語言(如HTML、XML等)和動態(tài)內(nèi)容Service-oriented:實(shí)現(xiàn)WebService的一端。Presentation-oriented的Web應(yīng)用通常作為它的客戶端Web組件Web組件(components)為Web服務(wù)器提供動態(tài)擴(kuò)展的能力JavaservletsJSPpagesWebServiceendpointsWeb容器Web容器(Webcontainer)是支持Web組件運(yùn)行提供訪問的平臺Web容器提供一些服務(wù),如:RequestdispatchingSecurityConcurrencyLife-cyclemanagementWeb容器也為Web組件提供訪問naming、transactions和e-mail的APIWeb應(yīng)用被安裝(部署deploye)時,它的配置信息在一個XML文件中進(jìn)行維護(hù),該文件稱為Web應(yīng)用部署描述符:deploymentdescriptorWeb應(yīng)用生命周期Web應(yīng)用程序由下列組件構(gòu)成:Web組件(servlet、jsp等)靜態(tài)資源文件(html、images等)幫助類和庫Web應(yīng)用程序開發(fā)過程:1、開發(fā)Web組件代碼2、開發(fā)Web應(yīng)用部署描述文件3、編譯Web組件和幫助類4、將應(yīng)用打包成一個可部署單元(可選)5、將應(yīng)用部署到Web容器6、通過URL訪問Web應(yīng)用Web模塊Web組件和靜態(tài)Web內(nèi)容文件被稱為Web資源(Webresources)Web模塊(WebModules)是最小的、可部署的、可運(yùn)行的Web資源單元。Web模塊還可以包括以下內(nèi)容:服務(wù)端工具類:JavaBean客戶端工具類:applets等Web模塊結(jié)構(gòu)Web模塊有一個規(guī)范的結(jié)構(gòu)Web模塊有兩種方式進(jìn)行部署:不打包的目錄結(jié)構(gòu)打包成Webarchive文件(WAR)DocumentRootWEB-INFlibclassestagsjsp,htmlimages等web.xmllibraryfilesserver-sideclassestagfiles5、ServletAPIServlet接口Servlet接口是servletAPI的核心所有servlets都直接或間接地實(shí)現(xiàn)該接口ServletAPI中的類GenericServlet和HttpServlet都實(shí)現(xiàn)了Servlet接口開發(fā)者應(yīng)該集成HttpServlet來實(shí)現(xiàn)直接的servlets處理請求的方法Servlet接口定義了service方法來處理用戶的請求當(dāng)請求到來時,servlet容器調(diào)用該方法請求并發(fā)請求時,在不同線程中并發(fā)執(zhí)行service方法HttpServlet添加了其他方法用于處理HTTP請求,這些方法被service方法調(diào)用:doGetdoPostdoPutdoDeletedoHead等Servlet實(shí)例的數(shù)量通常,servlet容器僅為每個servlet實(shí)例化一個實(shí)例實(shí)現(xiàn)SingleThreadModel接口的servelt可以有多個實(shí)例Servlet
生命周期生命周期定義了Servlet如何被載入和實(shí)例化,初始化,處理來自用戶的請求,以及如何取消它的服務(wù)Init、service、destroy載入和實(shí)例化容器負(fù)責(zé)載入和實(shí)例化servlet可以在容器啟動時,或延遲到請求到來時初始化容器調(diào)用init方法,傳入一個ServletConfig對象,通過該對象可以訪問servert的初始化參數(shù)和ServletContext對象讀入配置信息,初始化昂貴資源(JDBC連接),執(zhí)行其他一次性動作處理請求HttpServletRequest對象代表請求,HttpServletResponse對象代表應(yīng)答結(jié)束服務(wù)Servlet對象可以在容器中維持一段時間,或容器的壽命容器調(diào)用destroy方法,釋放資源,保存持久性數(shù)據(jù)調(diào)用destroy之前,容器保證正在執(zhí)行的線程執(zhí)行完成Servlet
上下文ServletContext接口定義了Web應(yīng)用程序的一個servlet視圖通過它,servlet可以把事件記入日志,獲得指向資源的URL引用,設(shè)置和存儲其他servlet可以訪問的屬性每個部署到容器中的Web應(yīng)用程序只有一個ServletContext實(shí)例初始化參數(shù)初始化參數(shù)是部署描述文件中為Web應(yīng)用程序定義的系列初始化參數(shù)ServletContext提供下面方法訪問這些參數(shù):getInitParametergetInitParameterNames上下文屬性一個servlet可以在context中通過名字綁定一個對象屬性綁定到context中的屬性對同一個Web應(yīng)用程序中的任何其他servlet都是可見的ServletContext提供下面方法訪問:setAttributegetAttributegetAttributeNamesremoveAttribute資源Web應(yīng)用程序包含一些靜態(tài)資源HTML,GIF,JPEG等ServletContext提供直接訪問這些資源的方法:getResourcegetResourceAsStream方法需要一個String參數(shù),以”/”開頭,給出資源的路徑(相對于context的root)不能通過這種方式獲得動態(tài)內(nèi)容例如“/index.jsp”返回JSP的源碼,而不是它的執(zhí)行結(jié)果Request對象Request對象封裝了來自用戶請求的所有信息HTTP協(xié)議參數(shù)Servlet的請求參數(shù)是用戶發(fā)送給servlet容器的請求的一部分(字符串形式)來自URI查詢串或POST-ed數(shù)據(jù)參數(shù)以name-value對的方式存儲,一個參數(shù)名可以有多個值和它對應(yīng)通過下列方法可以獲得這些參數(shù):getParametergetParameterNamesgetParameterValues查詢串參數(shù)位于POST數(shù)據(jù)之前Querystring:a=hello,Postdata:a=goodbye&a=worlda=(hello,goodbye,world)屬性屬性是和一個request相關(guān)的對象可以有兩種方式設(shè)置屬性容器設(shè)置:表達(dá)一些不能通過API表達(dá)的信息Servlet設(shè)置:用于和其他servlet通信屬性名和屬性值是一一對應(yīng)的關(guān)系以”java.”、”javax.”、”sun.”、“com.sun.”為前綴的屬性是保留的ServletRequest提供下列方法訪問屬性:getAttributegetAttributeNamessetAttributeHTTP頭可以通過HttpServletRequest的下列方法訪問HTTP請求的頭getHeadergetHeadersgetHeaderNamesgetIntHeadergetDateHeader請求路徑requestRUI=contextPath+servletPath+pathInfocontextPath:服務(wù)器上的每個Web應(yīng)用程序被映射到一個URI前綴getContextPathservletPath:處理該請求的servlet的映射路徑getServletPathpathInfo:其他路徑信息用于標(biāo)示服務(wù)器上的一個文件,servlet可能使用它完成某些功能getPathInfo、getPathTranslated、getRealPath路徑實(shí)例ContextPath/catalogServletMappingPattern:/lawn/*Servlet:LawnServletServletMappingPattern:/garden/*Servlet:GardenServletServletMappingPattern:*.jspServlet:JSPServletRequestPathPathElements/catalog/lawn/index.htmlContextPath:/catalogServletPath:/lawnPathInfo:/index.html/catalog/garden/implements/ContextPath:/catalogServletPath:/gardenPathInfo:/implements//catalog/help/feedback.jspContextPath:/catalogServletPath:/help/feedback.jspPathInfo:nullResponse對象Response對象封裝了服務(wù)器返回給用戶的所有信息Response可以向?yàn)g覽器返回任何格式的內(nèi)容,如純文本,HTML,圖像,二進(jìn)制文件等通過setContentType設(shè)置類型,如:res.setContentType(“text/html”);如何向?yàn)g覽器返回數(shù)據(jù)?有兩種方式可以向?yàn)g覽器返回數(shù)據(jù):getWriter():返回一個PrintWriter對象,用于返回文本數(shù)據(jù)getOutputStream():返回ServletOutputStream對象,用于返回二進(jìn)制數(shù)據(jù)重定向請求使用另外URL來響應(yīng)用戶的請求將用戶引向一個新的位置負(fù)載均衡通過sendRedirect(Stringlocation)方法<ahref="/goto/http://www.servlets.com">Servlets.com</a>
publicclassGoToextendsHttpServlet{publicvoiddoGet(HttpServletRequest
req,HttpServletResponse
res)throwsServletException,IOException{//DeterminethesitewheretheywanttogoStringsite=req.getPathInfo();Stringquery=req.getQueryString();//Cutofftheleading"/"andappendthequerystring//We'reassumingthepathinfoURLisalwaysabsoluteStringurl=site.substring(1)+(query==null?"":"?"+query);
res.sendRedirect(url);}}錯誤處理當(dāng)錯誤發(fā)生時,我們怎么辦?告訴用戶什么?錯誤碼?錯誤頁面?問題解釋?堆棧信息?如何記錄這些問題?記錄到文件?服務(wù)器日志?發(fā)送給用戶?忽略?如何恢復(fù)?Servlet還能處理隨后請求嗎?還是需要重新載入?6、SessionHTTP協(xié)議的問題HTTP協(xié)議是一個無狀態(tài)協(xié)議,這意味:服務(wù)端沒有內(nèi)置機(jī)制來識別一系列請求來自同一用戶兩種解決方式:服務(wù)端在每個響應(yīng)(response)中返回所有信息(這些信息和當(dāng)前用戶有關(guān)),這些信息將作為下次請求的一部分回送到服務(wù)端服務(wù)端將狀態(tài)信息保存在服務(wù)端,只返回給用戶端一個標(biāo)示符,標(biāo)示符作為下次請求的一部分回送到服務(wù)端,服務(wù)端通過該標(biāo)示符來定位保存在服務(wù)端的信息會話Session指用戶的Web瀏覽器和一個特定Web服務(wù)器之間的一組交換會話從最初瀏覽器調(diào)用Web服務(wù)器的URL開始,到Web服務(wù)器結(jié)束會話,這個會話“超時”,或當(dāng)用戶關(guān)閉瀏覽器時結(jié)束。Servlet與特定的HTTPURL一一對應(yīng),servlet自己是無狀態(tài)的。每個Servlet類的一個單獨(dú)實(shí)例為它的特定URL處理所有的doGet和doPost請求。每一個HTTP請求都在一個運(yùn)行該實(shí)例的service方法的唯一線程上處理。因?yàn)槊總€servlet實(shí)例都是共享資源,你不能在servlet本身存儲客戶會話數(shù)據(jù),會話數(shù)據(jù)必須存儲在servlet之外。CookiesCookie是被Web服務(wù)器發(fā)送到用戶瀏覽器的一段信息,這段信息以后可以被讀回瀏覽器接收到cookie后,保存。以后,瀏覽器每次訪問該Web服務(wù)器上的頁面時,將把cookie送回給Web服務(wù)器javax.servlet.http.Cookie創(chuàng)建:publicCookie(Stringname,Stringvalue)發(fā)送:response.addCookie(Cookiecookie)讀回:Cookie[]request.getCookies()Cookie.setMaxAge(intexpiry)Cookie.setPath(Stringuri)URLRewriting用戶單擊的本地URL被動態(tài)修改(或重寫),來包含而外的信息http://server/servlet/a 原始URLhttp://server/servlet/a/123 添加extrapathinformationhttp://server/servlet/a?sessionid=123 添加參數(shù)http://server/servlet/a;jsessionid=123server-specificURLchange隱藏域添加一些Fields到HTML的form里面,但是并不顯示給用戶<FORMACTION=“/servlet/abc”METHOD=“POST”>…<INPUTTYPE=hiddenName=“sessionid”value=“123”>…</FORM>示意圖Session實(shí)現(xiàn)方式應(yīng)用服務(wù)器通過分配一個存儲在用戶瀏覽器里的一個專用cookie中的會話標(biāo)示符來確定那個HttpSession實(shí)例屬于一個特定的用戶。要使會話工作,瀏覽器必須啟用cookie。會話cookie不是永久保存的,在瀏覽器關(guān)閉的時候就會過期。如果用戶關(guān)閉cookie,另一種做法是:使用URL重寫技術(shù)存儲會話標(biāo)識符。要使用URL重寫,你要使用HttpResponse接口的encodeUrl方法向你的servlet或JSP生成的URL附加一個唯一的會話標(biāo)識符。不論使用那種存儲會話標(biāo)識符的方法,HttpSession實(shí)例最初都保存在應(yīng)用服務(wù)器的JVM的內(nèi)存中,只有標(biāo)識符保存在客戶機(jī)上。HttpSession對象javax.servlet.http.HttpSession創(chuàng)建:request.getSession()添加數(shù)據(jù):setAttribute(Stringname,Objectvalue)檢索數(shù)據(jù):getAttribute(Stringname)刪除數(shù)據(jù):removeAttribute(Stringname)Session如何工作?當(dāng)用于第一次訪問Web應(yīng)用程序,用戶被指定一個新的HttpSession對象和一個唯一的SessionIDSessionID標(biāo)示該用戶,在隨后的請求中,用于匹配該用戶和他的HttpSession對象SessionID通過Cookie或URL重新技術(shù)實(shí)現(xiàn)Cookie:JSESSIONIDURL重寫:http://server/servlet/abc;jsessionid=123通過HttpSession.getId()可以獲得該ID7、DispatchingRequests概述我們經(jīng)常需要將request的處理傳遞給另外一個Servlet我們也經(jīng)常需要在response中包含其他servlet的輸出RequestDispatcher接口用于完成這些任務(wù)RequestDispatcherjavax.servlet.RequestDispatcher獲?。簉equest.getRequestDispatcher(path)ServletContext.getRequestDispatcher(path)ServletContext.getNamedDispatcher(name)傳遞請求:forword(request,response)比較:HttpServletResponse.sendRedirect()包含響應(yīng):include(request,response)ForwardpublicvoiddoGet(HttpServletRequest
req,HttpServletResponse
res)throwsServletException,IOException{//Wedon'tsetthecontenttypeorgetawriter//GetthestringtosearchforStringsearch=req.getParameter("search");//CalculatetheURLscontainingthestringString[]results=getResults(search);//Specifytheresultsasarequestattribute
req.setAttribute("results",results);//ForwardtoadisplaypageStringdisplay="/servlet/SearchView";
RequestDispatcherdispatcher=req.getRequestDispatcher(display);
dispatcher.forward(req,res);}//Inrealusethismethodwouldcallactualsearchenginelogic//andreturnmoreinformationabouteachresultthanaURLString[]getResults(Stringsearch){returnnewString[]{"http://","http://"};}IncludepublicvoiddoGet(HttpServletRequest
req,HttpServletResponse
res)throwsServletException,IOException{
res.setContentType("text/html");
PrintWriterout=res.getWriter();
out.println("<HTML><HEAD><TITLE>WelcometoNile</TITLE></HEAD>");
out.println("<BODY>");//Showaniteminanonlinecatalog
out.println("Feastyoureyesonthisbeauty:");
RequestDispatcherdispatcher=
req.getRequestDispatcher("/servlet/NileItem?item=0596000405");
dispatcher.include(req,res);
out.println("And,sinceIlikeyou,it's20%off!");
out.println("</BODY></HTML>");}8、Filter&ListenerFilter過濾器(Filter)是轉(zhuǎn)換request或修改response的對象它工作在兩個位置:Request到達(dá)servlet之前Response離開servlet之后它可以應(yīng)用于一個特定的servlet或匹配一個URL模式的所有request一個Se
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 磚塊合同范本
- 機(jī)械零件加工報價合同范本
- 齊齊哈爾大學(xué)《環(huán)境工程原理實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 水電合伙合同范本
- 飯店經(jīng)營接管協(xié)議:2024年協(xié)議示例
- 玻璃定制合同范本
- 代訂車合同范本
- 婚前結(jié)婚合同范本
- 鋼釘鐵釘年度采購協(xié)議(2024年)
- 詳細(xì)的合同范本
- 縣人民醫(yī)院藥事管理與藥物治療學(xué)委員會會議紀(jì)要五篇
- 酒店預(yù)訂確認(rèn)函
- 走開大黑兔“十校聯(lián)賽”一等獎
- 腫瘤科運(yùn)用PDCA降低癌痛患者爆發(fā)性疼痛發(fā)生率品管圈成果匯報
- 動脈血?dú)夥治霾杉n件
- 10KV供配電工程施工組織設(shè)計
- 《小學(xué)教育政策與法規(guī)》總資料
- 張愛玲及《金鎖記》
- 云南花燈教案
- 信任五環(huán):超級銷售拜訪技巧
- 2023年國家電網(wǎng)公司電力安全工作規(guī)程版
評論
0/150
提交評論