JSP完整的知識課件_第1頁
JSP完整的知識課件_第2頁
JSP完整的知識課件_第3頁
JSP完整的知識課件_第4頁
JSP完整的知識課件_第5頁
已閱讀5頁,還剩131頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

JavaServerPages1*第一講JSP編程基礎(chǔ)2*JSPJSP(JavaServerPages)是由SunMicrosystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)是用Java語言作為腳本語言的,JSP網(wǎng)頁為整個(gè)服務(wù)器端的Java庫單元提供了一個(gè)接口來服務(wù)于HTTP請求的應(yīng)用程序在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP標(biāo)記(tag),就構(gòu)成了JSP頁面(*.jsp)3*JSP的優(yōu)點(diǎn)一次編譯,多次、多處運(yùn)行,代碼的執(zhí)行效率高組件的重用性將內(nèi)容的生成和顯示進(jìn)行分離4*JSP的編譯JSP的編譯JSP的頁面代碼不能直接運(yùn)行JSP的頁面代碼被編譯成Java的源代碼編譯生成的Java類實(shí)現(xiàn)javax.servlet.jsp.HttpJspPage接口HttpJspPage接口的繼承關(guān)系如下圖5*JSP與ServletJSP與Servlet的對應(yīng)6*JSP的運(yùn)行ⅠJSP處理請求之前,JSP頁面被翻譯為Servlet源文件7*JSP的運(yùn)行ⅡServlet源文件被編譯成Java的字節(jié)碼文件8*JSP的運(yùn)行Ⅲ載入Servlet類9*JSP的運(yùn)行Ⅳ創(chuàng)建Servlet的實(shí)例10*JSP的運(yùn)行ⅤWeb容器調(diào)用實(shí)例的jspInit方法;準(zhǔn)備階段完成11*JSP的運(yùn)行ⅥWeb容器調(diào)用_jspService方法處理相應(yīng)的請求12*JSP的運(yùn)行Ⅶ當(dāng)需要銷毀實(shí)例時(shí),Web容器調(diào)用jspDestroy方法13*JSP腳本元素Ⅰ腳本元素包括:注釋、聲明和表達(dá)式。HTML注釋(顯式注釋):用戶在客戶端能看到注釋內(nèi)容格式:<!--注釋語句[<%=表達(dá)式%>]-->隱藏注釋用戶在客戶端看不到注釋內(nèi)容,旨在增強(qiáng)程序的可讀性和可維護(hù)性格式:<%--注釋語句[<%=表達(dá)式%>]--%>14*JSP腳本元素Ⅱ聲明用來定義插入Servlet類的方法和成員變量。語法:<%!JavaCode%>表達(dá)式具備計(jì)算功能,并向JSP頁面輸出表達(dá)式的運(yùn)算結(jié)果。語法:<%=JavaExpression%>注:聲明中的Java語句必須以“;”結(jié)尾,但表達(dá)式不能用“;”結(jié)尾。JSP聲明僅對當(dāng)前頁面有效。演示:JSP基本元素

源代碼15*JSP指令Ⅰ格式:<%@指令名%>page指令:該指令作用于整個(gè)JSP頁面,同樣包括靜態(tài)的包含文件。但不能作用于動(dòng)態(tài)的包含文件。用來設(shè)定整個(gè)JSP網(wǎng)頁的屬性和相關(guān)功能該指令可以在頁面中出現(xiàn)多次,但每個(gè)屬性只能定義一次,不過也有個(gè)例外(import屬性)page指令理論上可以放在

JSP文件的任何地方,但

為了增強(qiáng)程序的可讀性,

我們建議放在JSP文件的

頂部16*JSP指令Ⅱinclude指令語法:<%@includefile="relativeURLspec"%>在JSP轉(zhuǎn)譯時(shí)包含(或插入)一個(gè)文件(JSP、HTML、文本和JAVA代碼等),這個(gè)包含過程是靜態(tài)(file屬性不能是動(dòng)態(tài)生成的,也不能是一個(gè)變量,file參數(shù)后也不能帶任何參數(shù))的。該指令在JSP轉(zhuǎn)譯成Servlet之前,將JSP代碼插入其中優(yōu)點(diǎn):插入的代碼可以從總體上影響主JSP頁面。如:屬性,方法的定義和文檔類型的設(shè)置缺點(diǎn):維護(hù)困難,被包含頁面更改就需要更改(手動(dòng)更新)主頁面(因?yàn)橹黜撁娌粫z查它是不是被更改)演示:Include指令17*JSP指令Ⅲtaglib指令語法:<%@tagliburi="tabLibraryURI"prefix="tagPrefix"%>作用:能夠讓用戶自定義新的標(biāo)簽屬性說明:uri–指定taglibrary的存放位置prefix–主要用來區(qū)分多個(gè)自定義標(biāo)簽18*JSP內(nèi)置對象ⅠJSP的九大內(nèi)置對象(隱含對象,隱式對象)JSP的內(nèi)置對象是不需要聲明,直接可以在JSP中使用的對象。由特定的Java類所產(chǎn)生的,在服務(wù)器運(yùn)行時(shí)根據(jù)情況自動(dòng)生成。下面給出他們的對應(yīng)關(guān)系:19*JSP內(nèi)置對象Ⅱ和Servlet相關(guān)的內(nèi)置對象page對象page對象代表JSP本身,更準(zhǔn)確的說,它代表JSP被轉(zhuǎn)譯后的Servlet。因此,他可以調(diào)用Servlet類所定義的方法。實(shí)際開發(fā)中很少使用config對象該對象里存放Servlet的初始參數(shù)值(初始數(shù)據(jù)結(jié)構(gòu))。和page對象一樣都很少被用到20*JSP內(nèi)置對象ⅢInput/Output有關(guān)的內(nèi)置對象out對象out對象代表了向客戶端發(fā)送數(shù)據(jù)的對象,與response對象不同,通過out對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容,是文本級的,可以通過out對象直接向客戶端寫一個(gè)由程序動(dòng)態(tài)生成的HTML文件request對象request對象代表了客戶端的請求信息(如請求的來源、cookies和請求相關(guān)的參數(shù)值等等),主要用于接受客戶端通過HTTP協(xié)議傳送給服務(wù)器端的數(shù)據(jù)。通過request可以查看請求參數(shù)的配置情況(調(diào)用getParameter()方法來實(shí)現(xiàn))、請求的類型(比如GET、POST、HEAD等等)以及請求的HTTP頭(cookie、referer等等)response對象response對象代表的是對客戶端的響應(yīng),也就是說可以用response對象來組織發(fā)送到客戶端的數(shù)據(jù)21*JSP內(nèi)置對象Ⅳ和Context有關(guān)的內(nèi)置對象session對象由服務(wù)器自動(dòng)創(chuàng)建,用于保存每個(gè)用戶的信息,以便跟蹤每個(gè)用戶的操作狀態(tài)。此對象內(nèi)部使用Map類保存數(shù)據(jù),因此保存數(shù)據(jù)的格式是“名/值”對,session中的值可以是復(fù)雜對象類型,而不僅限于字符串。我們在不同的JSP頁面中記錄用戶信息時(shí)使用session對象application對象該對象保存了一個(gè)應(yīng)用系統(tǒng)中公有的數(shù)據(jù),一旦創(chuàng)建了application對象將一直保存,并為所有客戶共享。與session對象不同的是,所有客戶的application對象都是同一個(gè),即所有客戶共享這個(gè)內(nèi)置的application對象pageContext對象該對象代表的是當(dāng)前頁面運(yùn)行的一些屬性。所有內(nèi)置對象都可以從pageContext中取得22*JSP內(nèi)置對象Ⅴ和Error有關(guān)的內(nèi)置對象(exception)exception對象是java.lang.Throwable類的一個(gè)實(shí)例存儲了JSP文件運(yùn)行時(shí)所產(chǎn)生的異常信息不能在一般的JSP文件中直接使用如果要使用該對象,這個(gè)頁面就必須是錯(cuò)誤顯示頁面,即要在頁面的page指令中設(shè)定:<%@pageisErroroPage=“true”%>exception對象經(jīng)常被用來捕捉JSP頁面中的異常23*request的主要方法request有60余個(gè)方法。可分以下4類:①能夠儲存和取得屬性的方法voidsetAttribute(Stringname,java.lang.Objectvalue):

設(shè)定name屬性的值為valuevoidremoveAttribute(Stringname):

移除name屬性的值ObjectgetAttribute(Stringname):

返回name屬性的值。若不存在name屬性,則返回nullEnumerationgetattributeNames():

返回request對象所有屬性的名字,結(jié)果集是一個(gè)Enumeration類的實(shí)例24*request的主要方法(cont.)②能夠取得請求參數(shù)的方法StringgetParameter(Stringname):

返回客戶端傳送給服務(wù)器端的某一個(gè)請求參數(shù)name的值。當(dāng)請求參數(shù)name不存在時(shí),則返回nullString[]getParameterValues(Stringname):

返回客戶端傳送給服務(wù)器端的某一個(gè)請求參數(shù)name的所有值。當(dāng)請求參數(shù)name不存在時(shí),則返回nullEnumerationgetParameterNames():

返回客戶端傳送給服務(wù)器端的所有的參數(shù)名,結(jié)果集是一個(gè)Enumeration類的實(shí)例。當(dāng)傳遞給此方法的參數(shù)名不存在時(shí),返回nullMapgetParameterMap():

取得一個(gè)請求參數(shù)的Map25*request的主要方法(cont.)③能夠取得請求HTTP標(biāo)頭的方法Cookie[]getCookies():返回與客戶端請求有關(guān)的cookie對象StringgetHeader(Stringname):

返回一個(gè)String類型的數(shù)據(jù),表示客戶端發(fā)送到服務(wù)器端的頭信息intgetIntHeader(Stringname):

返回一個(gè)int類型的數(shù)據(jù),表示客戶端發(fā)送到服務(wù)器端的頭信息中的某一個(gè)特定的信息longgetDateHeader(Stringname):

返回一個(gè)long類型的數(shù)據(jù),表示客戶端發(fā)送到服務(wù)器的頭信息中的時(shí)間信息EnumerationgetHeaders(Stringname):

取得所有客戶端發(fā)送到服務(wù)器端的頭信息EnumerationgetHeaderNames():

取得客戶端發(fā)送到服務(wù)器端的所有頭信息的名稱26*request的主要方法(cont.)④其他方法StringgetServerName():

獲得服務(wù)器的名字。如果沒有設(shè)定服務(wù)器名,則返回服務(wù)器IP地址intgetServerPort():

獲得服務(wù)器的端口號StringgetRemoteAddr():

獲得客戶端的IP地址StringgetRemoteHost():

獲得客戶端主機(jī)的名字。如果客戶端電腦沒有設(shè)定名字,則返回客戶端電腦的IP地址intgetRemotePort():

獲得客戶端主機(jī)的端口號StringgetRemoteUser():獲得用戶名27*request的主要方法(cont.)StringgetMethod():

獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法(GET、POST等)StringgetProtocol():

獲得客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱,如http/1.0、http/1.1StringgetQueryString():

獲得查詢字符串,該字符串由客戶端以GET方法向服務(wù)器端傳送StringgetRequestURI():

獲得發(fā)出請求字符串的客戶端URLvoidsetCharacterEncoding(Stringencoding):

設(shè)定編碼格式,用來解決窗體傳遞中文的問題28*request的主要方法(cont.)HttpSessiongetSession(booleancreate):

返回和當(dāng)前客戶端請求相關(guān)聯(lián)的HttpSession對象,如果當(dāng)前客戶端請求沒有和任何HttpSession對象關(guān)聯(lián),

那么當(dāng)create變量為true時(shí),則創(chuàng)建一個(gè)HttpSession對象并返回;反之,返回null。booleanisSecure():

如果客戶機(jī)是通過一個(gè)安全的訪問方式訪問的,就返回true;反之,返回falseStringgetServletPath():

獲得客戶端所請求的腳本文件的文件路徑StringgetContextPath():

返回上下文路徑。對于JSP來說,一般是當(dāng)前Web應(yīng)用程序的根目錄29*request的主要方法(cont.)StringgetRequestedSessionId():獲得客戶端的SessionIDbooleanisRequestedSessionIdValid():

返回一個(gè)指示客戶端請求發(fā)送SessionID是否仍然有效的布爾值booleanisRequestedSessionIdFromCookie():

返回一個(gè)指示客戶端請求發(fā)送SessionID是否存在于Cookie中的布爾值booleanisRequestedSessionIdFromURL():

返回一個(gè)指示客戶端請求發(fā)送SessionID是否存在于URL中的布爾值30*response的主要方法response有近40個(gè)方法。主要方法如下:void

addCookie(Cookiecookie)

向客戶端寫入一個(gè)cookievoid

addHeader(Stringname,Stringvalue)

添加HTTP文件頭,該header將會傳送到客戶端booleancontainsHeader(Stringname)

判斷名為name的header文件頭是否存在,返回值是boolean類型void

sendError(intsc)

向客戶端發(fā)送錯(cuò)誤信息(數(shù)字代號)void

setHeader(Stringname,Stringvalue)

設(shè)定指定名字的HTTP文件頭的值,如response.setHeader(“Refresh”,“10”),客戶端瀏覽器會隔10秒刷新一次31*response的主要方法(cont.)voidsendRedirect(Stringurl)

重定向客戶的請求void

setContentLength(“attribute”)

設(shè)置實(shí)體數(shù)據(jù)的大小voidsetContentType(Stringtype)

設(shè)置響應(yīng)的MIME類型ServletOutputStreamgetOutputStream()

獲得客戶端的輸出流對象StringencodeURL(Stringurl)

把sessionID作為URL的參數(shù)返回給客戶端,實(shí)現(xiàn)URL的重寫voidflushBuffer()

強(qiáng)制把當(dāng)前緩沖區(qū)的內(nèi)容發(fā)送到客戶端32*session的主要方法sesssion對象的主要方法如下:voidsetAttribute(Stringname,java.lang.Objectvalue)

設(shè)置指定名字name的屬性值value,并將其存儲在session對象中ObjectgetAttribute(Stringname)

獲得指定名字name相關(guān)聯(lián)的屬性值voidremoveAttribute(Stringname)

刪除一個(gè)名為name的配對longgetCreationTime() session對象創(chuàng)建的時(shí)間StringgetId()

得到當(dāng)前的sessionID33*session的主要方法(cont.)longgetLastAccessTime()

返回當(dāng)前session最后一次被操作的時(shí)間,從1970.01.01開始的毫秒數(shù)voidinvalidate()

使session無效booleanisNew()

檢查客戶端是否參加了會話演示:request和session的作用范圍的區(qū)別演示:對用戶登錄進(jìn)行驗(yàn)證創(chuàng)建session34*pageContext的主要方法pageContext對象的主要方法如下:voidforward(StringrelativeUrlpath)把頁面重定向到一個(gè)頁面或者Servlet組件上voidsetAttribute()

設(shè)置page范圍之中的屬性對象ObjectgetAttribute(Stringname)

獲取一個(gè)page范圍內(nèi)指定名字name相關(guān)聯(lián)的屬性值ExceptiongetException()

獲得目前頁面的異常對象(Exception),頁面一定要是錯(cuò)誤顯示頁面才可,即<%@pageisErrorPage="true"%>HttpServletRequestgetRequest()

返回當(dāng)前的request對象HttpServletResponsegetResponse()

返回當(dāng)前的response對象35*pageContext的主要方法(cont.)ServletConfiggetServletConfig()

返回當(dāng)前的servletConfig對象ServletContextgetServletContext()

返回servletContext對象,這個(gè)對象對所有頁面都是共享的HttpSessiongetSession()

返回當(dāng)前頁面的session對象ObjectfindAttribute(Stringname)

尋找在所有范圍中屬性名稱為name的屬性對象voidremoveAttribute(Stringname)

刪除默認(rèn)頁面范圍或特定對象范圍之中的已命名對象EnumerationgetAttributeNamesInScope(intscope)36*application的主要方法application對象的主要方法如下:voidsetAttribute(Stringname,java.lang.Objectvalue)

將設(shè)置指定名字name的屬性值value,并將其存儲在application對象中ObjectgetAttribute(Stringname)

獲取application對象中名為name的對象EnunmerationgetAttributeNames()

返回所有屬性的名字,返回類型為EnunmerationStringgetInitParameter(Stringname)

返回name屬性的初始值StringgetServerInfo()

獲得當(dāng)前servlet容器的版本信息StringgetRealPath() 獲取實(shí)際路徑演示:網(wǎng)頁訪問計(jì)數(shù)器37*out的主要方法out對象的主要方法如下:voidclear()

清除輸出緩沖區(qū)的內(nèi)容,但不會把數(shù)據(jù)輸出到客戶端voidclearBuffer()

清除輸出緩沖區(qū)的內(nèi)容,同時(shí)把數(shù)據(jù)輸出到客戶端voidclose()

關(guān)閉輸出流,清除所有內(nèi)容intgetBufferSize() 取得目前緩沖區(qū)的大小(KB)intgetRemaining() 取得目前使用后還剩余的緩沖區(qū)的大小(KB)booleanisAutoFlush()

返回布爾值,若為true,且緩沖區(qū)已滿,則自動(dòng)清除;若為false,且緩沖區(qū)已滿,則不會自動(dòng)清除,而會進(jìn)行異常處理voidprint()、voidprintln()輸出某一類型的數(shù)據(jù)38*JSP對表單的處理提交演示:JSP對表單的處理39*第二講JSP標(biāo)準(zhǔn)動(dòng)作

和JavaBean40*JSP標(biāo)準(zhǔn)動(dòng)作語法:<jsp:動(dòng)作名…>JSP2.0規(guī)范中定義了很多個(gè)動(dòng)作,以下幾個(gè)常用:forwardincludeuseBeansetPropertygetPropertyparam41*param用來提供key/value值,與include、forward等標(biāo)簽一起使用,用來設(shè)置屬性該標(biāo)簽有兩個(gè)屬性:name=“ParameterName”:該屬性表示設(shè)置的參數(shù)的名稱value=“ParameterValue”:該屬性表示設(shè)置的參數(shù)的值param動(dòng)作42*forward語法:<jsp:forwardpage="URL|一個(gè)JSP表達(dá)式"/>將客戶端的請求從一個(gè)JSP頁面轉(zhuǎn)到另一個(gè)JSP頁面,如果和param

動(dòng)作一起使用可以向轉(zhuǎn)向的頁面中發(fā)送一個(gè)或多個(gè)參數(shù)(前提:轉(zhuǎn)向的頁面一定需要是動(dòng)態(tài)頁面),在轉(zhuǎn)向的頁面中使用request可以取出傳入的對象注:頁面中該標(biāo)簽下面的語句將得不到執(zhí)行forward動(dòng)作演示:forward動(dòng)作43*include語法:<jsp:includepage="relativeURLspec"flush="true|false">主頁面被請求時(shí)將次頁面的輸出包含進(jìn)來盡管被包含的頁面輸出中不能含有JSP,但這些頁面可以是其他資源所產(chǎn)生的結(jié)果,服務(wù)器按照正常的方式對指向被包含的資源的URL進(jìn)行解釋,因此這個(gè)URL可以是Servlet或者JSP,服務(wù)器以通常的方式運(yùn)行被包含的頁面,將產(chǎn)生的輸出放到主頁面中,這種方式和RequestDispatcher

類的include方法是一致的flush屬性:是一個(gè)可選的次屬性,默認(rèn)是false,該屬性用來設(shè)定將頁面包含進(jìn)來之前是否應(yīng)該清空主頁面的輸出流優(yōu)點(diǎn):被包含的頁面發(fā)生更改的時(shí)候,無需對主頁面作出修改缺點(diǎn):包含的是次頁面的輸出,而非次頁面的實(shí)際代碼,所以次頁面中不能使用任何有可能在整體上影響主頁面的JSP構(gòu)造一個(gè)小應(yīng)用:include動(dòng)作是實(shí)現(xiàn)包含機(jī)制的一種較為理想的方式,它可以包含相對與當(dāng)前頁面或當(dāng)前web應(yīng)用的頁面及其其它資源,因?yàn)閜age屬性中的相對URL是有服務(wù)器來解釋的,因此我們可以包含放在WEB-INF目錄下的資源,以達(dá)到資源保護(hù)的作用include動(dòng)作演示:include動(dòng)作include動(dòng)作和include指令比較44*JavaBean定義JavaBean是一種Java語言編寫的可重用組件構(gòu)成定義私有的屬性(成員)無參的構(gòu)造器與屬性對應(yīng)的getters、setters方法演示:在Eclipse中快速開發(fā)JavaBean

45*useBean動(dòng)作語法:<jsp:useBean屬性1屬性2…/>作用:實(shí)例化一個(gè)JavaBean。屬性:id:Bean在頁面中別名(標(biāo)識),區(qū)分大小寫scope:指定Bean的作用域class:設(shè)定Bean的完整類名這三個(gè)是常用組合演示:scope的用法

演示:useBean的用法

46*useBean處理過程47*setProperty和getProperty動(dòng)作setProperty動(dòng)作功能:設(shè)置Bean的屬性語法:<jsp:setPropertyname=“BeanId”property=“propertyName”/>

<jsp:setPropertyname=“BeanId”property=“*”/>getProperty動(dòng)作功能:獲取Bean的屬性語法:<jsp:getPropertyname=“BeanId”property=“propertyName”/>演示:useBeansetPropertygetProperty配合使用JavaBean的自省機(jī)制:當(dāng)服務(wù)器接受到請求時(shí),它根據(jù)請求的參數(shù)名稱,自動(dòng)設(shè)定與javaBean相同屬性名稱的值,實(shí)現(xiàn)方式如上48*第三講再講JDBC數(shù)據(jù)庫編程49*為什么需要JDBC當(dāng)前所有的B/S系統(tǒng)無一不和數(shù)據(jù)庫之間有交互JDBC(JavaDatabaseConnectivity)是一種可用于執(zhí)行SQL語句的JavaAPIJDBC的應(yīng)用模型如下圖所示:Java應(yīng)用程序JDBC客戶端數(shù)據(jù)庫服務(wù)器50*JDBC驅(qū)動(dòng)JDBC驅(qū)動(dòng)的4種類型TYPE1:JDBC-ODBC橋驅(qū)動(dòng)程序適用于快速的原型系統(tǒng),沒有提供JDBC驅(qū)動(dòng)的數(shù)據(jù)庫如AccessTYPE2:Native-API驅(qū)動(dòng)程序利用開發(fā)商提供的本地庫來直接與數(shù)據(jù)庫通信。比Type1性能略好TYPE3:JDBC通過網(wǎng)絡(luò)的純Java驅(qū)動(dòng)程序具有最大的靈活性,通常由那些非數(shù)據(jù)庫廠商提供,是四種類型中最小的TYPE4:原生協(xié)議以及純Java驅(qū)動(dòng)程序最高的性能,通過自己的本地協(xié)議直接與數(shù)據(jù)庫引擎通信,具備在Internet裝配的能力51*JDBC的工作原理JDBCAPI供程序員調(diào)用的類和接口被包裝在java.sql和javax.sql包中如:DriverManager類Connection接口Statement接口ResultSet接口DriverManager作用:載入不同的JDBC驅(qū)動(dòng)JDBC驅(qū)動(dòng)作用:負(fù)責(zé)連接各種不同的數(shù)據(jù)庫SqlServerOracleJDBCAPI

JDBCDriverManager

JDBC驅(qū)動(dòng)

JDBC驅(qū)動(dòng)

Java應(yīng)用程序

52*使用JDBCAPIJDBCAPI可幫我們建立與數(shù)據(jù)庫的連接、執(zhí)行SQL語句并能得到SQL語句執(zhí)行后的結(jié)果ConnectionDriverManagerStatementResultSetDriverManager:依據(jù)數(shù)據(jù)庫的不同,管理JDBC驅(qū)動(dòng)Connection:負(fù)責(zé)連接數(shù)據(jù)庫并擔(dān)任傳送數(shù)據(jù)的任務(wù)

Statement:由Connection產(chǎn)生、負(fù)責(zé)執(zhí)行SQL語句ResultSet:負(fù)責(zé)保存Statement執(zhí)行后所產(chǎn)生的查詢結(jié)果客戶端數(shù)據(jù)庫服務(wù)器123453*演示示例54*JDBC接口類和對象ⅠDriverManager類Class.forName()顯式加載并注冊驅(qū)動(dòng)程序類驅(qū)動(dòng)程序被加載后就出現(xiàn)在DriverManager的驅(qū)動(dòng)程序列表中,并可用于創(chuàng)建連接55*JDBC接口類和對象ⅡConnection對象建立連接DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD);JDBCURLjdbc:<子協(xié)議>:<子名稱>如:jdbc:mysql://localhost:3306/test發(fā)送SQL語句StatementPreparedStatementCallableStatement56*JDBC接口類和對象ⅢStatement對象創(chuàng)建Statement對象Statementstmt=conn.createStatement();使用Statement對象執(zhí)行語句executeQuery()參數(shù)是查詢語句(DQL)executeUpdate()參數(shù)是DML或DDL語句execute()執(zhí)行可能返回多種結(jié)果的語句(DQL、DMLorSP)關(guān)閉Statement對象作為一種良好的編程風(fēng)格,應(yīng)在不需要的時(shí)候顯式關(guān)閉他們,stmt.close()57*JDBC接口類和對象ⅣPreparedStatement接口創(chuàng)建對象:PreparedStatementpstmt=conn.preparedStatement(“updatetestseta=?Whereb=?”)其中使用參數(shù)占位符(?)傳遞IN參數(shù):pstmt.setLong(1,1);[序號,值]該方法中的setXxx類型是Java類型58*JDBC接口類和對象ⅤCallableStatement對象創(chuàng)建conn.prepareCall()CallableStatement對象用于執(zhí)行SQL儲存過程[一組可通過名稱來調(diào)用(就象函數(shù)的調(diào)用那樣)的SQL語句]。CallableStatement對象從PreparedStatement中繼承了用于處理IN參數(shù)的方法,而且還增加了用于處理OUT參數(shù)和INOUT參數(shù)的方法59*JDBC接口類和對象ⅥResultSet對象ResultSet對象又稱結(jié)果集行和光標(biāo)初始光標(biāo)停在第一行之前,rs.next()會使光標(biāo)向下移一行列resultSet中的getXxx()方法提供了對當(dāng)前行某列值的訪問getXxx(String列名)列名不區(qū)分大小寫getXxx(int列編號)編號從1

開始60*JDBC接口類和對象Ⅶ事務(wù)事務(wù)默認(rèn)是自動(dòng)提交編寫并演示61*JDBC連接幾種常見數(shù)據(jù)庫62*JSP中使用JDBC可以在JSP中直接使用Java代碼的形式可以使用JavaBean封裝JDBC數(shù)據(jù)庫訪問代碼(推薦)(不推薦)63*擴(kuò)展學(xué)習(xí)

jsp自定義標(biāo)簽庫64*自定義標(biāo)簽常用到的幾個(gè)接口和類包:javax.servlet.jsp.tagextInterfaceTag、SimpleTagClassTagSupport、SimpleTagSupport65*創(chuàng)建一個(gè)用來輸出Hello!的標(biāo)簽<my:hello/>第一步:在src下編寫一個(gè)類extendsTagSupport66*創(chuàng)建一個(gè)用來輸出Hello!的標(biāo)簽<my:hello/>第二步:在WEB-INF/taglibs/下創(chuàng)建mytaglibs.tld文件67*創(chuàng)建一個(gè)用來輸出Hello!的標(biāo)簽<my:hello/>第三步:在JSP頁面中使用<my:hello/>標(biāo)簽注意!注意!68*開發(fā)簡單自定義標(biāo)簽用來查找任意多個(gè)數(shù)的最大值要實(shí)現(xiàn)的類和接口javax.servlet.jsp.tagext.SimpleTagSupport(class)javax.servlet.jsp.tagext.DynamicAttributes(interface)

DynamicAttributes有一個(gè)方法:

setDynamicAttribute(String

uri,String

localName,Object

value)

69*第一步:產(chǎn)生自定義類SimpleTagclassSimpleTagextendsSimpleTagSupportimplementsDynamicAttributes70*第二步:書寫mytags.tld文件71*第三步:編寫測試頁面index.jsp72*第四講EL和JSTL73*EL簡介EL:ExpressionLanguage語法結(jié)構(gòu):${表達(dá)式}EL變量如:${userName}他的意思是取出某一范圍中名稱為userName的變量。由于沒有指定范圍,故他默認(rèn)會從Page范圍找,若找不到,再依次在Request,Session,Application范圍查找,假如途中找到userName,就直接回傳,否則繼續(xù)找下去,若所有范圍都沒找到則回傳null。也可以指定作用域74*EL隱含對象演示:EL隱含對象隱式對象的用法和JSP的隱式對象基本一樣EL中的隱式對象有以下11種75*EL運(yùn)算符Ⅰ.和[]運(yùn)算符作用:存取數(shù)據(jù)有相同的地方也有一定的區(qū)別${sessionScope.user.sex}等價(jià)與${sessionScope.user["sex"]}也可以混用當(dāng)要存取的屬性名稱中包含一些特殊字符,如.或–等并非字母或數(shù)字的符號,就一定要使用[]。如:${user["My-Name"]}${sessionScope.user[data]}

此時(shí),data是一個(gè)變量,假若data的值為“sex”時(shí),那上述的例子等于${sessionScope.user.sex};假若data的值為“name”時(shí),它就等于${sessionS}。因此,如果要?jiǎng)討B(tài)取值時(shí),就可以用上述的方法來做,但.號無法做到動(dòng)態(tài)取值76*EL運(yùn)算符Ⅱ算術(shù)運(yùn)算符77*EL運(yùn)算符Ⅲ關(guān)系運(yùn)算符78*EL運(yùn)算符Ⅳ邏輯運(yùn)算符79*EL運(yùn)算符Ⅴ其他運(yùn)算符empty運(yùn)算符:主要用來判斷值是否為null或空的例:${empty}條件運(yùn)算符:${A?B:C}括號運(yùn)算符:主要用來改變執(zhí)行優(yōu)先權(quán)例:${A*(B+C)}80*JSTL標(biāo)準(zhǔn)標(biāo)記庫JSTL:JavaServerPagesStandardTagLibraryJSTL分為以下5類:演示:JSTL版“HelloWorld”81*核心標(biāo)簽庫Ⅰ核心標(biāo)記庫主要有以下幾種82*核心標(biāo)簽庫Ⅱc:set標(biāo)簽有兩種不同的設(shè)置:var和target。var“版本”用于設(shè)置作用域?qū)傩裕瑃arget“版本”用于設(shè)置bean屬性或Map值。這兩個(gè)版本都有兩種形式:有體和沒有體。有體的只是放入值的另一種途徑。83*核心標(biāo)簽庫Ⅲc:out標(biāo)簽value:用來定義需要求解的表達(dá)式default:缺省值。當(dāng)求解后的表達(dá)式為null或者String為空時(shí)將打印這個(gè)缺省值。演示:set和out標(biāo)簽效果84*核心標(biāo)簽庫Ⅳ<c:if>標(biāo)簽<c:iftest=“testCondition”[var=“varName”]

[scope=“{page|request|session|application}”]>

具體內(nèi)容

</c:if><c:if>標(biāo)簽必須要有test屬性,當(dāng)test中的表達(dá)式結(jié)果為true時(shí),則會執(zhí)行本體內(nèi)容;如果為false,則不會執(zhí)行。演示效果85*核心標(biāo)簽庫Ⅴ<c:choose><c:choose>本身只當(dāng)做<c:when>的父標(biāo)簽<c:choose>

內(nèi)容(<when>)

</c:choose><c:when><c:whentest=“testCondition”>

本體內(nèi)容

</c:when>演示:choosewhen標(biāo)簽86*核心標(biāo)簽庫Ⅵ迭代標(biāo)簽<c:forEach><c:forEach>為循環(huán)控制,它可以將集合(Collection)中的成員循序?yàn)g覽一遍。運(yùn)作方式為當(dāng)條件符合時(shí),就會持續(xù)重復(fù)執(zhí)行<c:forEach>的標(biāo)簽體內(nèi)容屬性:87*演示:運(yùn)行效果88*格式化標(biāo)簽庫Ⅰ用于格式化數(shù)字的<fmt:formatNumber>標(biāo)簽<fmt:formatNumber>標(biāo)簽用于格式化數(shù)字。演示:格式化數(shù)字成貨幣89*格式化標(biāo)簽庫Ⅱ用于格式化日期的<fmt:formatDate>標(biāo)簽演示:格式化日期90*格式化標(biāo)簽庫Ⅲ<fmt:formatDate>標(biāo)簽與<fmt:timeZone>、<fmt:setTimeZone>兩組標(biāo)簽的關(guān)系密切。若沒有指定timeZone屬性,也可以通過<fmt:timeZone>、<fmt:setTimeZone>兩組標(biāo)簽設(shè)定的時(shí)區(qū)來格式化最后的結(jié)果type:

可以是time,date或both。控制是否只生成時(shí)間,只生成日期,或者時(shí)間日期都生成dateStyle:

可以是short,

medium,

long

full(default)。控制打印日期使用的具體格式timeStyle:

可以是short,

medium,

long

full(default)。控制打印時(shí)間使用的具體格式value:

這是一個(gè)java.util.Date

類型的值,用于生成日期和時(shí)間91*第五講Filter92*過濾器簡介過濾器是向Web應(yīng)用程序的請求和響應(yīng)處理添加功能的Web服務(wù)組件過濾器的工作原理:Web資源用戶發(fā)送請求過濾器將用戶的請求發(fā)送至Web資源資源將響應(yīng)發(fā)送至過濾器過濾器將Web資源的響應(yīng)發(fā)送給用戶用戶過濾器93*過濾器的生命周期過濾器生命周期的各個(gè)階段實(shí)例化

初始化過濾銷毀init(…)doFilter(…)destory()Filter接口94*過濾器方法介紹過濾器必須實(shí)現(xiàn)javax.servlet.Filter接口,該接口中有init(…)參數(shù)類型:FilterConfig(初始化參數(shù)對象)doFilter(…)參數(shù)有三個(gè)類型分別是:ServletRequest,ServletResponse,F(xiàn)ilterChaindestroy()95*過濾器開發(fā)Ⅰinit方法示例(若沒有初始化參數(shù)該方法可以為空)以下內(nèi)容必須配置在web.xml中<filter>標(biāo)簽內(nèi)96*doFilter方法示例過濾器開發(fā)Ⅱ97*過濾器鏈FilterChain接口用于調(diào)用過濾器鏈中的一系列過濾器用戶過濾器1過濾器2過濾器3Web資源過濾器鏈98*過濾器鏈實(shí)例Ⅰ99*過濾器鏈實(shí)例Ⅱ演示過濾器鏈效果過濾器鏈在web.xml中的配置100*一個(gè)重要的過濾器(字符集過濾器)如果要使用這個(gè)過濾器需要做什么設(shè)置呢?101*什么是ListenerListener是Servlet的監(jiān)聽器,它可以監(jiān)聽客戶端的請求、服務(wù)端的操作等。通過監(jiān)聽器,可以自動(dòng)激發(fā)一些操作,比如監(jiān)聽在線的用戶的數(shù)量。當(dāng)增加一個(gè)HttpSession時(shí),就激發(fā)sessionCreated(HttpSessionEventse)方法,這樣就可以給在線人數(shù)加1。常用的監(jiān)聽接口有以下幾個(gè):ServletContextAttributeListenerServletContextListenerHttpSessionListenerHttpSessionAttributeListener102*Listener接口介紹ServletContextAttributeListener監(jiān)聽對ServletContext屬性的操作,比如增加、刪除、修改屬性。ServletContextListener監(jiān)聽ServletContext。當(dāng)創(chuàng)建ServletContext時(shí),激發(fā)contextInitialized(ServletContextEventsce)方法;當(dāng)銷毀ServletContext時(shí),激發(fā)contextDestroyed(ServletContextEventsce)方法。103*Listener接口介紹HttpSessionListener監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)sessionCreated(HttpSessionEventse)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed(HttpSessionEventse)方法。HttpSessionAttributeListener監(jiān)聽HttpSession中的屬性的操作。當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEventse)方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEventse)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEventse)方法。104*Servlet上下文監(jiān)聽在Web應(yīng)用中可以部署監(jiān)聽程序,這個(gè)監(jiān)聽程序能夠監(jiān)聽ServletContext的信息,比如ServletContext的創(chuàng)建和銷毀,ServletContext屬性的增加、刪除、修改等。為了實(shí)現(xiàn)這樣的功能,這種監(jiān)聽程序需要實(shí)現(xiàn)ServletContextListener和ServletContextAttributeListener接口。下面的程序?qū)崿F(xiàn)了對ServletContext和它的屬性的監(jiān)聽105*Servlet上下文監(jiān)聽MyServletContextListener.java106*Servlet上下文監(jiān)聽上面的程序?qū)崿F(xiàn)了ServletContextListener、ServletContextAttributeListener接口,所以它能夠監(jiān)聽ServletContext創(chuàng)建、銷毀及它的屬性改變的信息。下面部署這個(gè)監(jiān)聽器,在web.xml中在網(wǎng)頁中測試107*監(jiān)聽HTTP會話在Web應(yīng)用中,可以監(jiān)聽HTTP會話活動(dòng)情況、HTTP會話中的屬性設(shè)置情況,也可以監(jiān)聽HTTP會話的active、passivate情況等。可以通過HttpSessionListener接口監(jiān)聽HTTP會話創(chuàng)建、銷毀的信息;通過HttpSessionActivationListener監(jiān)聽HTTP會話的active、passivate情況;通過HttpSessionBindingListener監(jiān)聽HTTP會話中對象的綁定信息;通過HttpSessionAttributeListener監(jiān)聽HTTP會話中屬性的設(shè)置請求。108*監(jiān)聽HTTP會話SessionListener.java109*監(jiān)聽HTTP會話上面的程序?qū)崿F(xiàn)了HttpSessionListener接口,它還有一個(gè)屬性,就是Hashtable,用來保存所有的登錄信息。當(dāng)創(chuàng)建一個(gè)Session時(shí),就調(diào)用sessionCreate()方法將登錄會話信息保存到Hashtable中;當(dāng)銷毀一個(gè)Session時(shí),就調(diào)用sessionDestroyed()方法將登錄會話信息從Hashtable中移除,這樣就實(shí)現(xiàn)了管理在線用戶登錄會話信息的目的。我們需要下面幾個(gè)頁面程序來測試這個(gè)監(jiān)聽器的工作并深入體會Session的會話管理機(jī)制:

index.jsp、display.jsp、session.jsp、logout.jsp110*監(jiān)聽HTTP會話index.jsp111*監(jiān)聽HTTP會話display.jsp112*監(jiān)聽HTTP會話session.jsplogout.jsp113*對請求監(jiān)聽在Servlet2.4規(guī)范中,新增加了一個(gè)技術(shù),就是可以監(jiān)聽客戶端的請求。一旦能夠在監(jiān)聽程序中獲得客戶端的請求,就可以對請求進(jìn)行統(tǒng)一處理。比如做一個(gè)Web管理程序,如果在本機(jī)訪問,就可以不登錄,如果是遠(yuǎn)程訪問,就需要登錄。這樣我們就可以監(jiān)聽客戶端的請求,從請求中獲得客戶端的地址,并通過這個(gè)地址做出對應(yīng)的處理。114*對請求監(jiān)聽MyRequestListener.java115*對請求監(jiān)聽MyRequestListener中,實(shí)現(xiàn)了對客戶端請求和請求中參數(shù)設(shè)置的監(jiān)聽。要實(shí)現(xiàn)這兩個(gè)監(jiān)聽功能,需要實(shí)現(xiàn)ServletRquestListener和ServletRequestAttributeListener接口。我們看它的requestInitialized()方法,在這個(gè)方法里,它獲得客戶端請求對象,然后通過這個(gè)請求對象獲得訪問的客戶端IP地址。如果這個(gè)地址以“127”開始,那么認(rèn)為它是從本機(jī)訪問的,就在請求中設(shè)置一個(gè)isLogin的屬性,并且這個(gè)屬性的值為Boolean(true)對象;如果不是從本機(jī)訪問,那么必須把這個(gè)屬性設(shè)置成Boolean(false)對象。116*第六講會話跟蹤117*主要內(nèi)容WEB應(yīng)用中的會話與會話狀態(tài)會話跟蹤的意義會話跟蹤的實(shí)現(xiàn)方式CookieURL重寫隱藏表單域Session118*會話與會話狀態(tài)簡介在日常生活中,從撥通電話到掛斷電話之間的一連串的你問我答的過程就是一個(gè)會話。WEB應(yīng)用中的會話是指一個(gè)客戶端瀏覽器與WEB服務(wù)器之間連續(xù)發(fā)生的一系列請求和響應(yīng)過程。WEB應(yīng)用的會話狀態(tài)是指WEB服務(wù)器與瀏覽器在會話過程中產(chǎn)生的狀態(tài)信息,借助會話狀態(tài),WEB服務(wù)器能夠把屬于同一會話中的一系列的請求和響應(yīng)過程關(guān)聯(lián)起來。

119*為什么需要會話跟蹤?HTTP協(xié)議是無狀態(tài)協(xié)議,請求資源的時(shí)候,服務(wù)器響應(yīng)完了以后就關(guān)閉了連接現(xiàn)實(shí)情況:網(wǎng)上購物需求需要通過不同的請求購買不同的商品,并放入購物車支付的時(shí)候服務(wù)器需要知道“車”中到底有什么。并且還要知道當(dāng)前用戶是誰HTTP連接是一個(gè)請求一個(gè)響應(yīng),獨(dú)立連接,無法解決這個(gè)問題120*會話跟蹤的實(shí)現(xiàn)方式會話跟蹤技術(shù)Session隱藏表單域URL重寫Cookie121*如何實(shí)現(xiàn)有狀態(tài)的會話某個(gè)用戶從網(wǎng)站的登錄頁面登入后,再進(jìn)入購物頁面購物時(shí),負(fù)責(zé)處理購物請求的服務(wù)器程序必須知道處理上一次請求的程序所得到的用戶信息。HTTP協(xié)議是一種無狀態(tài)的協(xié)議,WEB服務(wù)器本身不能識別出哪些請求是同一個(gè)瀏覽器發(fā)出的,瀏覽器的每一次請求都是完全孤立的。WEB服務(wù)器端程序要能從大量的請求消息中區(qū)分出哪些請求消息屬于同一個(gè)會話,即能識別出來自同一個(gè)瀏覽器的訪問請求,這需要瀏覽器對其發(fā)出的每個(gè)請求消息都進(jìn)行標(biāo)識,屬于同一個(gè)會話中的請求消息都附帶同樣的標(biāo)識號,而屬于不同會話的請求消息總是附帶不同的標(biāo)識號,這個(gè)標(biāo)識號就稱之為會話ID(SessionID)。122*如何實(shí)現(xiàn)有狀態(tài)的會話會話ID可以通過一種稱之為Cookie的技術(shù)在請求消息中進(jìn)行傳遞,也可以作為請求URL的附加參數(shù)進(jìn)行傳遞。會話ID是WEB服務(wù)器為每客戶端瀏覽器分配的一個(gè)唯一代號,它通常是在WEB服務(wù)器接收到某個(gè)瀏覽器的第一次訪問時(shí)產(chǎn)生,并且隨同響應(yīng)消息一道發(fā)送給瀏覽器。會話過程由WEB服務(wù)器端的程序開啟,一旦開啟了一個(gè)會話,服務(wù)器端程序就要為這個(gè)會話創(chuàng)建一個(gè)獨(dú)立的存儲結(jié)構(gòu)來保存該會話的狀態(tài)信息,同一個(gè)會話中的訪問請求都可以且只能訪問屬于該會話的存儲結(jié)構(gòu)中的狀態(tài)信息。123*什么是CookieCookie是一種在客戶端保持HTTP狀態(tài)信息的技術(shù),它好比商場發(fā)放的優(yōu)惠卡。Cookie是在瀏覽器訪問WEB服務(wù)器的某個(gè)資源時(shí),由WEB服務(wù)器在HTTP響應(yīng)消息頭中附帶傳送給瀏覽器的一片數(shù)據(jù),WEB服務(wù)器傳送給各個(gè)客戶端瀏覽器的數(shù)據(jù)是可以各不相同的。一旦WEB瀏覽器保存了某個(gè)Cookie,那么它在以后每次訪問該WEB服務(wù)器時(shí),都應(yīng)在HTTP請求頭中將這個(gè)Cookie回傳給WEB服務(wù)器。WEB服務(wù)器通過在HTTP響應(yīng)消息中增加Set-Cookie響應(yīng)頭字段將Cookie信息發(fā)送給瀏覽器,瀏覽器則通過在HTTP請求消息中增加Cookie請求頭字段將Cookie回傳給WEB服務(wù)器。一個(gè)Cookie只能標(biāo)識一種信息,它至少含有一個(gè)標(biāo)識該信息的名稱(NAME)和設(shè)置值(VALUE)。一個(gè)WEB站點(diǎn)可以給一個(gè)WEB瀏覽器發(fā)送多個(gè)Cookie,一個(gè)WEB瀏覽器也可以存儲多個(gè)WEB站點(diǎn)提供的Cookie。瀏覽器一般只允許存放300個(gè)Cookie,每個(gè)站點(diǎn)最多存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB。124*Session的跟蹤機(jī)制ServletAPI規(guī)范中定義了一個(gè)HttpSession接口,HttpSession接口定義了各種管理和操作會話狀態(tài)的方法。HttpSession對象是保持會話狀態(tài)信息的存儲結(jié)構(gòu),一個(gè)客戶端在WEB服務(wù)器端對應(yīng)一個(gè)各自的HttpSession對象。WEB服務(wù)器并不會在客戶端開始訪問它時(shí)就創(chuàng)建HttpSession對象,只有客戶端訪問某個(gè)能與客戶端開啟會話的Servlet程序時(shí),WEB應(yīng)用程序才會創(chuàng)建一個(gè)與該客戶端對應(yīng)的HttpSession對象。WEB服務(wù)器為HttpSession對象分配一個(gè)獨(dú)一無二的會話標(biāo)識號,然后在響應(yīng)消息中將這個(gè)會話標(biāo)識號傳遞給客戶端。客戶端需要記住會話標(biāo)識號,并在后續(xù)的每次訪問請求中都把這個(gè)會話標(biāo)識號傳送給WEB服務(wù)器,WEB服務(wù)器端程序依據(jù)回傳的會話標(biāo)識號就知道這次請求是哪個(gè)客戶端發(fā)出的,從而選擇與之對應(yīng)的HttpSession對象。125*Session的跟蹤機(jī)制WEB應(yīng)用程序創(chuàng)建了與某個(gè)客戶端對應(yīng)的HttpSession對象后,只要沒有超出一個(gè)限定的空閑時(shí)間段,HttpSession對象就駐留在WEB服務(wù)器內(nèi)存之中,該客戶端此后訪問任意的Servlet程序時(shí),它們都使用與客戶端對應(yīng)的那個(gè)已存在的HttpSession對象。HttpSession接口中專門定義了一個(gè)setAttribute方法來將對象存儲到HttpSession對象中,還定義了一個(gè)getAttribute方法來檢索存儲在HttpSession對象中的對象,存儲進(jìn)HttpSession對象中的對象可以被屬于同一個(gè)會話的各個(gè)請求的處理程序共享。Session是實(shí)現(xiàn)網(wǎng)上商城的購物車的最佳方案,存儲在某個(gè)客戶Session中的一個(gè)集合對象就可充當(dāng)該客戶的一個(gè)購物車。126*Session的超時(shí)管理WEB服務(wù)器無法判斷當(dāng)前的客戶端瀏覽器是否還會繼續(xù)訪問,也無法檢測客戶端瀏覽器是否關(guān)閉,所以,即使客戶已經(jīng)離開或關(guān)閉了瀏覽器,WEB服務(wù)器還要保留與之對應(yīng)的HttpSession對象。隨著時(shí)間的推移而不斷增加新的訪問客戶端,WEB服務(wù)器內(nèi)存中將會因此積累起大量的不再被使用的HttpSession對象,并將最終導(dǎo)致服務(wù)器內(nèi)存耗盡。WEB服務(wù)器采用“超時(shí)限制”的辦法來判斷客戶端是否還在繼續(xù)訪問,如果某個(gè)客戶端在一定的時(shí)間之內(nèi)沒有發(fā)出后續(xù)請求,WEB服務(wù)器則認(rèn)為客戶端已經(jīng)停止了活動(dòng),結(jié)束與該客戶端的會話并將與之對應(yīng)的

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論