版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、簡(jiǎn)答題1.forward和redirect的區(qū)別forward是效勞器請(qǐng)求資源,效勞器直接訪問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道效勞器發(fā)送的內(nèi)容是從哪兒來(lái)的,所以它的地址欄中還是原來(lái)的地址。redirect就是效勞端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址,一般來(lái)說(shuō)瀏覽器會(huì)用剛剛請(qǐng)求的所有參數(shù)重新請(qǐng)求,所以session,request參數(shù)都可以獲取。2.說(shuō)出Servlet的生命周期,并說(shuō)出Servlet和CGI的區(qū)別Servlet被效勞器實(shí)例化后,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doXXX方法〔doGet,doPost〕等,當(dāng)效勞器決定將實(shí)例銷毀的時(shí)候調(diào)用其destroy方法。與cgi的區(qū)別在于servlet處于效勞器進(jìn)程中,它通過(guò)多線程方式運(yùn)行其service方法,一個(gè)實(shí)例可以效勞于多個(gè)請(qǐng)求,并且其實(shí)例一般不會(huì)銷毀,而CGI對(duì)每個(gè)請(qǐng)求都產(chǎn)生新的進(jìn)程,效勞完成后就銷毀,所以效率上低于servlet。3.JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?動(dòng)態(tài)INCLUDE用jsp:include動(dòng)作實(shí)現(xiàn)<jsp:includepage="included.jsp"flush="true"/>它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù)。靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),并不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面<%@includefile="included.htm"%>4.什么情況下調(diào)用doGet()和doPost()?Jsp頁(yè)面中的form標(biāo)簽里的method屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()。5.servlet的生命周期web容器加載servlet,生命周期開始。通過(guò)調(diào)用servlet的init()方法進(jìn)行servlet的初始化。通過(guò)調(diào)用service()方法,根據(jù)請(qǐng)求的不同調(diào)用不同的do***()方法。結(jié)束效勞,web容器調(diào)用servlet的destroy()方法。6.如何現(xiàn)實(shí)servlet的單線程模式<%@pageisThreadSafe="false"%>7.頁(yè)面間對(duì)象傳遞的方法request,session,application,cookie等8.JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?JSP技術(shù)構(gòu)建在Servlet技術(shù)之上,是Servlet技術(shù)的擴(kuò)展,本質(zhì)上是Servlet的簡(jiǎn)易方式,JSP能做到的,Servlet都能做到,但是它們卻各有所長(zhǎng)。JSP更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。JSP編譯后是"類servlet"。Servlet比擬適合作為控制類組件,比方視圖控制器等。另外,Servlet還可以作為過(guò)濾器、監(jiān)聽器等。Servlet不僅可以動(dòng)態(tài)生成HTML內(nèi)容,還可以動(dòng)態(tài)生成圖形。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里別離開來(lái)。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。總而言之,Servlet在工程中作為控制類的組件,并且處理一些后臺(tái)業(yè)務(wù),JSP那么作為顯示組件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。9.四種會(huì)話跟蹤技術(shù)會(huì)話作用域ServletsJSP頁(yè)面描述page否是代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。一個(gè)頁(yè)面由一個(gè)編譯好的Javaservlet類〔可以帶有任何的include指令,但是沒(méi)有include動(dòng)作〕表示。這既包括servlet又包括被編譯成servlet的JSP頁(yè)面request是是代表與Web客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面,涉及多個(gè)Web組件〔由于forward指令和include動(dòng)作的關(guān)系〕session是是代表與用于某個(gè)Web客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè)Web會(huì)話可以也經(jīng)常會(huì)跨越多個(gè)客戶機(jī)請(qǐng)求application是是代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話的一個(gè)全局作用域10.Servlet執(zhí)行時(shí)一般實(shí)現(xiàn)哪幾個(gè)方法?Publicvoidinit(ServletConfigconfig)publicServletConfiggetServletConfig()publicStringgetServletInfo()publicvoidservice(ServletRequestrequest,ServletResponseresponse)publicvoiddestroy()11.url重寫有幾種方式?由于cookie可以被人為的禁止,必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把sessionid傳遞回效勞器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把sessionid直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現(xiàn)形式為:///xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為:///xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764這兩種方式對(duì)于用戶來(lái)說(shuō)是沒(méi)有區(qū)別的,只是效勞器在解析的時(shí)候處理的方式不同,采用第一種方式也有利于把sessionid的信息和正常程序參數(shù)區(qū)分開來(lái)。為了在整個(gè)交互過(guò)程中始終保持狀態(tài),就必須在每個(gè)客戶端可能請(qǐng)求的路徑后面都包含這個(gè)sessionid。12.在jsp中引用使用<jsp:useBean
id="
"
...scope="
"/>來(lái)引用javabean.Ⅰscope的值有哪些,這些值的區(qū)別是什么?不同的jsp頁(yè)面中引用javabean時(shí),id能否相同,如果能相同,對(duì)scope的值有什么要求?scope可以為:application|page|session|requeat這個(gè)東西就是指定ID的有效范圍。如果scope=page,那么useBean的有用范圍就只能在page內(nèi)有效,到了session|application|requeat就無(wú)效了。可以指定scope屬性,使得Bean不只是與當(dāng)前頁(yè)面建立單關(guān)聯(lián)。如果共享了Bean,獲取對(duì)現(xiàn)有Bean的引用就很有用,因此jsp;useBean操作表示公當(dāng)不存在具有相同id和scope的對(duì)象時(shí)才實(shí)例化一個(gè)新對(duì)象。這樣就可以節(jié)約資源。二、問(wèn)答題1.JSP的內(nèi)置對(duì)象及方法Request表示ServletRequest對(duì)象。它包含了有關(guān)瀏覽器請(qǐng)求的信息,并且提供了幾個(gè)用于獲取cookie,header,和session數(shù)據(jù)的有用的方法。Response表示ServletResponse對(duì)象,并提供了幾個(gè)用于設(shè)置送回瀏覽器的響應(yīng)的方法〔如cookies,頭信息等〕out對(duì)象是的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。pageContext表示一個(gè)ontext對(duì)象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對(duì)象的API,并且包裝了通用的servlet相關(guān)功能的方法。Session表示一個(gè)請(qǐng)求的對(duì)象。Session可以存貯用戶的狀態(tài)信息applicaton表示一個(gè)javax.servlet.ServletContext對(duì)象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息config表示一個(gè)對(duì)象。該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。Page表示從該頁(yè)面產(chǎn)生的一個(gè)servlet實(shí)例2.JSP的常用指令<%@pagelanguage="scriptingLanguage":主要指定JSPContainer要用什么語(yǔ)言來(lái)編譯JSP網(wǎng)頁(yè)。JSP2.0標(biāo)準(zhǔn)中指出,目前只可以使用Java語(yǔ)言,不過(guò)未來(lái)不排除增加其他語(yǔ)言,如C、C++、Perl等等。默認(rèn)值為Java
extends="className":主要定義此JSP網(wǎng)頁(yè)產(chǎn)生的Servlet是繼承哪個(gè)父類
import="importList":主要定義此JSP網(wǎng)頁(yè)可以使用哪些JavaAPI
session="true|false":決定此JSP網(wǎng)頁(yè)是否可以使用session對(duì)象。默認(rèn)值為true
buffer="none|sizeinkb":決定輸出流(outputstream)是否有緩沖區(qū)。默認(rèn)值為8KB的緩沖區(qū)
autoFlush="true|false":決定輸出流的緩沖區(qū)是否要自動(dòng)去除,緩沖區(qū)滿了會(huì)產(chǎn)生異常(Exception)。默認(rèn)值為true
isThreadSafe="true|false":主要是告訴JSPContainer,此JSP網(wǎng)頁(yè)能處理超過(guò)一個(gè)以上的請(qǐng)求。默認(rèn)值為true,如果此值設(shè)為false,SingleThreadModel將會(huì)被使用。SingleThreadModel在Servlet2.4中已經(jīng)聲明不贊成使用(deprecate)
info="text":主要表示此JSP網(wǎng)頁(yè)的相關(guān)信息
errorPage="error_url":表示如果發(fā)生異常錯(cuò)誤時(shí),網(wǎng)頁(yè)會(huì)被重新指向那一個(gè)URL
isErrorPage="true|false":表示此JSPPage是否為處理異常錯(cuò)誤的網(wǎng)頁(yè)
contentType="ctinfo":表示MIME類型和JSP網(wǎng)頁(yè)的編碼方式
pageEncoding="ctinfo":表示JSP網(wǎng)頁(yè)的編碼方式
isELIgnored="true|false":表示是否在此JSP網(wǎng)頁(yè)中執(zhí)行或忽略EL表達(dá)式。如果為true時(shí),JSPContainer將忽略EL表達(dá)式;反之為false時(shí),EL表達(dá)式將會(huì)被執(zhí)行注意:只有import這個(gè)屬性可以重復(fù)設(shè)定,其他那么否。%><%@includefile="filename"%><%@taglibprefix="c"uri="://……"%>3.Request對(duì)象的主要方法:setAttribute(Stringname,Object):設(shè)置名字為name的request的參數(shù)值getAttribute(Stringname):返回由name指定的屬性值getAttributeNames():返回request對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例getCookies():返回客戶端的所有Cookie對(duì)象,結(jié)果是一個(gè)Cookie數(shù)組getCharacterEncoding():返回請(qǐng)求中的字符編碼方式getContentLength():返回請(qǐng)求的Body的長(zhǎng)度getHeader(Stringname):獲得協(xié)議定義的文件頭信息getHeaders(Stringname):返回指定名字的requestHeader的所有值,結(jié)果是一個(gè)枚舉的實(shí)例getHeaderNames():返回所以requestHeader的名字,結(jié)果是一個(gè)枚舉的實(shí)例getInputStream():返回請(qǐng)求的輸入流,用于獲得請(qǐng)求中的數(shù)據(jù)getMethod():獲得客戶端向效勞器端傳送數(shù)據(jù)的方法getParameter(Stringname):獲得客戶端傳送給效勞器端的有name指定的參數(shù)值getParameterNames():獲得客戶端傳送給效勞器端的所有參數(shù)的名字,結(jié)果是一個(gè)枚舉的實(shí)例getParameterValues(Stringname):獲得有name指定的參數(shù)的所有值getProtocol():獲取客戶端向效勞器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱getQueryString():獲得查詢字符串getRequestURI():獲取發(fā)出請(qǐng)求字符串的客戶端地址getRemoteAddr():獲取客戶端的IP地址getRemoteHost():獲取客戶端的名字getSession([Booleancreate]):返回和請(qǐng)求相關(guān)SessiongetServerName():獲取效勞器的名字getServletPath():獲取客戶端所請(qǐng)求的腳本文件的路徑getServerPort():獲取效勞器的端口號(hào)removeAttribute(Stringname):刪除請(qǐng)求中的一個(gè)屬性4.jsp有哪些動(dòng)作?作用分別是什么?JSP共有以下6種根本動(dòng)作jsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。Jsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。Jsp:setProperty:設(shè)置JavaBean的屬性。Jsp:getProperty:輸出某個(gè)JavaBean的屬性。Jsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。Jsp:plugin:使您能插入所需的特定的瀏覽器的OBJECT或EMBED元素來(lái)指定瀏覽器運(yùn)行一個(gè)JAVAApplet所需的插件。根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記。<jsp:plugintype="bean|applet"code="classFileName"codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]>
[<jsp:params>
[<jsp:paramname="parameterName"
value="{parameterValue|<%=expression%>}"/>]+
</jsp:params>]
[<jsp:fallback>textmessageforuser</jsp:fallback>]
</jsp:plugin>舉例:<jsp:plugintype=appletcode="Molecule.class"codebase="/html">
<jsp:params>
<jsp:paramname="molecule"value="molecules/benzene.mol"/>
</jsp:params>
<jsp:fallback>
<p>Unabletoloadapplet</p>
</jsp:fallback>
</jsp:plugin>5.過(guò)濾器監(jiān)聽servlet三者的區(qū)別和實(shí)際中主要的應(yīng)用場(chǎng)景過(guò)濾器〔Filter〕作為過(guò)濾器,在Servlet作為過(guò)濾器使用時(shí),它可以對(duì)客戶的請(qǐng)求進(jìn)行過(guò)濾處理,當(dāng)它處理完成后,它會(huì)交給下一個(gè)過(guò)濾器處理,就這樣,客戶的請(qǐng)求在過(guò)濾鏈里一個(gè)個(gè)處理,直到請(qǐng)求發(fā)送到目標(biāo)。舉個(gè)例子,某個(gè)網(wǎng)站里有提交"修改的注冊(cè)信息"的網(wǎng)頁(yè),當(dāng)用戶填寫完成修改信息并提交后,效勞端在進(jìn)行真正的處理時(shí)需要做兩個(gè)處理:客戶端的會(huì)話是否有效;對(duì)提交的數(shù)據(jù)進(jìn)行統(tǒng)一的編碼,比方GB2312。這兩個(gè)處理可以在由兩個(gè)過(guò)濾器組成的過(guò)濾鏈里進(jìn)行處理。當(dāng)過(guò)濾器處理成功后,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo);如果過(guò)濾器處理不成功〔比方客戶端的會(huì)話無(wú)效〕,它將把視圖派發(fā)到指定的錯(cuò)誤頁(yè)面??梢钥闯觯^(guò)濾器就像一扇門,客戶端要和效勞端的某個(gè)目標(biāo)交互,必須通過(guò)這扇門。過(guò)濾器是用于過(guò)濾Servlet的請(qǐng)求和響應(yīng),過(guò)濾器是存在于請(qǐng)求和被請(qǐng)求資源之間的。
過(guò)濾器就像當(dāng)于一個(gè)中間件,請(qǐng)求要經(jīng)過(guò)過(guò)濾器,然后過(guò)濾器才去調(diào)用Servlet,Servlet的響應(yīng)也會(huì)被過(guò)濾器截獲并作相應(yīng)的處理。Filter是一個(gè)接口,要寫一個(gè)自己的Filter就只能實(shí)現(xiàn)Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比擬相似,也是會(huì)先調(diào)用init()方法,然后再調(diào)用核心的處理過(guò)濾的方法doFilter(),這個(gè)方法中可定義過(guò)濾規(guī)那么,然后是destory()方法銷毀Filter對(duì)象。dofilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
這個(gè)是過(guò)濾的核心方法,F(xiàn)ilterChain的方法doFilter(ServletRequestrequest,ServletResponseresponse)也就是過(guò)濾后的請(qǐng)求調(diào)用資源的方法,如果不寫這個(gè)方法,也就不會(huì)去調(diào)用相應(yīng)的資源。
Filter的配置Filter的配置和Servlet相似。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>alan.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
<!--這里的url-pattern就是要過(guò)濾的Servlet的url-pattern-->
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
<!--上面的三個(gè)是過(guò)濾的范圍-->
</filter-mapping>
CharArrayWriter類,是一個(gè)將數(shù)據(jù)保存在字符數(shù)組中的輸出流,我們可以使用它來(lái)構(gòu)造一個(gè)PrintWriter對(duì)象,也就實(shí)現(xiàn)了向內(nèi)存輸出。CharArrayWriter類的toString()和toCharArray()方法就可以取得寫入內(nèi)存中的數(shù)據(jù)。
注意:CharArrayWriter類是一個(gè)不會(huì)真正輸出的類,他的write()方法只會(huì)將內(nèi)容寫入字符數(shù)組,而且這個(gè)字符數(shù)組是會(huì)自動(dòng)增長(zhǎng)的。例子:兩個(gè)JSP頁(yè)面,前一個(gè)頁(yè)面用戶輸入一些信息然后提交,后一個(gè)頁(yè)面顯示用戶提交的信息。在提交信息后,要經(jīng)過(guò)兩個(gè)過(guò)濾器的處理,一個(gè)檢查用戶是否登錄,一個(gè)把用戶的提交信息用GB2312進(jìn)行重新編碼。
開發(fā)一個(gè)Filter,這個(gè)Filter需要實(shí)現(xiàn)Filter接口,F(xiàn)ilter接口定義了以下的方法:destroy()//由Web容器調(diào)用,銷毀此Filterinit(FilterConfigfilterConfig)///由Web容器調(diào)用,初始化此FilterdoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)//具體過(guò)濾處理代碼對(duì)提交信息用GB2312進(jìn)行重新編碼的Filter:1
//====================ProgramDiscription=====================2
//程序名稱:例如14-7:EncodingFilter.java3
//程序目的:學(xué)習(xí)使用編碼過(guò)濾器4
//==========================================================5
importjavax.servlet.FilterChain;6
importjavax.servlet.ServletRequest;7
importjavax.servlet.ServletResponse;8
importjava.io.IOException;9
importjavax.servlet.Filter;10
importjavax.servlet..ServletRequest;11
importjavax.servlet..ServletResponse;12
importjavax.servlet.ServletException;13
importjavax.servlet.FilterConfig;15
publicclassEncodingFilterimplementsFilter16
{18
privateStringtargetEncoding="gb2312";19
protectedFilterConfigfilterConfig;21
publicvoidinit(FilterConfigconfig)throwsServletException{22
this.filterConfig=config;23
this.targetEncoding=config.getInitParameter("encoding");24
}27
public
voiddoFilter(ServletRequestsrequest,ServletResponse
sresponse,FilterChainchain)28
throwsIOException,ServletException{30
ServletRequestrequest=(ServletRequest)srequest;31
request.setCharacterEncoding(targetEncoding);//把請(qǐng)求用指定的方式編碼32
//把處理發(fā)送到下一個(gè)過(guò)濾器33
chain.doFilter(srequest,sresponse);
34
}36
publicvoiddestroy()37
{38
this.filterConfig=null;39
}41
publicvoidsetFilterConfig(finalFilterConfigfilterConfig)42
{43
this.filterConfig=filterConfig;44
}45
}【程序注解】
正如前面所說(shuō),EncodingFilter的目的是把客戶端的請(qǐng)求用指定的方式編碼,具體的處理在request.setCharacterEncoding(targetEncoding)完成了。LoginFilter判斷用戶在進(jìn)入目標(biāo)之前是否登錄,if((isLog!=null)&&((isLog.equals("true"))||(isLog=="true")))將檢查用戶是否登錄,如果已登錄,那么把視圖讓過(guò)濾鏈繼續(xù)處理,如果沒(méi)有登錄,把視圖派發(fā)到登錄頁(yè)面,過(guò)濾鏈處理結(jié)束。
下面我們來(lái)看怎么在web.xml里配置這兩個(gè)過(guò)濾器,代碼如下所示:1
//====================ProgramDiscription=====================2
//程序名稱:例如14-7:EncodingFilter.java3
//程序目的:學(xué)習(xí)使用編碼過(guò)濾器4
//==========================================================5
importjavax.servlet.FilterChain;6
importjavax.servlet.ServletRequest;7
importjavax.servlet.ServletResponse;8
importjava.io.IOException;9
importjavax.servlet.Filter;10
importjavax.servlet..ServletRequest;11
importjavax.servlet..ServletResponse;12
importjavax.servlet.ServletException;13
importjavax.servlet.FilterConfig;14
15
publicclassEncodingFilterimplementsFilter16
{18
privateStringtargetEncoding="gb2312";19
protectedFilterConfigfilterConfig;21
publicvoidinit(FilterConfigconfig)throwsServletException{22
this.filterConfig=config;23
this.targetEncoding=config.getInitParameter("encoding");24
}27
public
voiddoFilter(ServletRequestsrequest,ServletResponse
sresponse,FilterChainchain)28
throwsIOException,ServletException{30
ServletRequestrequest=(ServletRequest)srequest;31
request.setCharacterEncoding(targetEncoding);//把請(qǐng)求用指定的方式編碼32
//把處理發(fā)送到下一個(gè)過(guò)濾器33
chain.doFilter(srequest,sresponse);
34
}36
publicvoiddestroy()37
{38
this.filterConfig=null;39
}40
41
publicvoidsetFilterConfig(finalFilterConfigfilterConfig)42
{43
this.filterConfig=filterConfig;44
}45
}【程序注解】
可以看出,配置Filter時(shí),首先指定Filter的名字和Filter的實(shí)現(xiàn)類,如果有必要,還要配置Filter的初始參數(shù);然后為Filter做映射,這個(gè)映射指定了需要過(guò)濾的目標(biāo)〔JSP、Servlet〕。在上面的例子中,指定了EncodingFilter為所有的JSP和Servlet做過(guò)濾,LoginFilter為target.jsp做過(guò)濾。這樣,當(dāng)客戶請(qǐng)求target.jsp時(shí),首先要經(jīng)過(guò)EncodingFilter的處理,然后經(jīng)過(guò)LoginFilter的處理,最后才把請(qǐng)求傳遞給target.jsp?!具\(yùn)行程序】
把程序部署到Web效勞器里〔比方Tomcat〕,然后啟動(dòng)Web效勞器,在瀏覽器里輸入以下URL〔根據(jù)具體請(qǐng)求改變URL〕:://127.0.0.1:8080/ch14/target.jsp那么Filter將會(huì)把視圖派發(fā)到:://127.0.0.1:8080/ch14/init.jsp在init.jsp里,我們使用:<%session.setAttribute("isLog","true");%>來(lái)設(shè)置用戶已經(jīng)登錄〔這里是簡(jiǎn)化的,在實(shí)際工程中,可能要經(jīng)過(guò)驗(yàn)證處理〕。在init.jsp里,可以提交一些中文的信息。由于提交的信息被EncodingFilter使用GB2312統(tǒng)一編碼了,故在target.jsp里能夠正確顯示中文。您可以做一個(gè)試驗(yàn),把web.xml改為:<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/nothing</url-pattern>
</filter-mapping>然后重新啟動(dòng)Web效勞器。那么在target.jsp里,中文將不能正確顯示。監(jiān)聽器Listener是Servlet的監(jiān)聽器,它可以監(jiān)聽客戶端的請(qǐng)求、效勞端的操作等。通過(guò)監(jiān)聽器,可以自動(dòng)激發(fā)一些操作,比方監(jiān)聽在線的用戶的數(shù)量。當(dāng)增加一個(gè)Session時(shí),就激發(fā)sessionCreated(SessionEventse)方法,這樣就可以給在線人數(shù)加1。以下是3個(gè)Listener接口。ServletContextAttributeListener:監(jiān)聽對(duì)ServletContext屬性的操作,比方增加、刪除、修改屬性ServletRequestListener:SessionListener:監(jiān)聽Session的操作。當(dāng)創(chuàng)立一個(gè)Session時(shí),激發(fā)sessionCreated(SessionEventse)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed(SessionEventse)方法SessionAttributeListener:監(jiān)聽Session中的屬性的操作。當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(SessionBindingEventse)方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(SessionBindingEventse)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(SessionBindingEventse)方法ServletContextListener:監(jiān)聽ServletContext。當(dāng)創(chuàng)立ServletContext時(shí),激發(fā)contextInitialized(ServletContextEventsce)方法;當(dāng)銷毀ServletContext時(shí),激發(fā)contextDestroyed(ServletContextEventsce)方法這三個(gè)監(jiān)聽器接口,分別監(jiān)聽Servlet中3種比擬重要的對(duì)象的創(chuàng)立和銷毀。這三個(gè)接口中分別有監(jiān)聽該對(duì)象創(chuàng)立和銷毀事件的方法,效勞器本身就是事件源。listener的配置
<listener>
<listener-class>alan.servlet.listener.AlanContextListener</listener-class>
<!--listener-class也就是實(shí)現(xiàn)Listener接口的類-->
</listener>Servlet中的重要對(duì)象〔只針對(duì)應(yīng)用〕數(shù)量生命周期是否線程平安ServletContext1全局的。只有在應(yīng)用關(guān)閉時(shí)才銷毀不平安。需要加同步訪問(wèn)Session和用戶的數(shù)量相同局部的。只在有效時(shí)間內(nèi)存在不平安。需要加同步訪問(wèn)ServletRequest多個(gè)局部的。只在service()和doGet()、doPost()中存在線程平安下面我們開發(fā)一個(gè)具體的例子,這個(gè)監(jiān)聽器能夠統(tǒng)計(jì)在線的人數(shù)。在ServletContext初始化和銷毀時(shí),在效勞器控制臺(tái)打印對(duì)應(yīng)的信息。當(dāng)ServletContext里的屬性增加、改變、刪除時(shí),在效勞器控制臺(tái)打印對(duì)應(yīng)的信息。要獲得以上的功能,監(jiān)聽器必須實(shí)現(xiàn)以下3個(gè)接口:
SessionListener
ServletContextListener
ServletContextAttributeListener//====================ProgramDiscription=====================2
//程序名稱:例如14-9:EncodingFilter.java3
//程序目的:學(xué)習(xí)使用監(jiān)聽器4
//==============================================================5
importjavax.servlet..*;6
importjavax.servlet.*;8
publicclassOnLineCountListenerimplementsSessionListener,ServletContextListener,ServletContextAttributeListener9
{10
privateintcount;11
privateServletContextcontext=null;13
publicOnLineCountListener()14
{15
count=0;16
//setContext();17
}18
//創(chuàng)立一個(gè)session時(shí)激發(fā)19
publicvoidsessionCreated(SessionEventse)20
{21
count++;22
setContext(se);
24
}25
//當(dāng)一個(gè)session失效時(shí)激發(fā)26
publicvoidsessionDestroyed(SessionEventse)27
{28
count--;29
setContext(se);30
}31
//設(shè)置context的屬性,它將激發(fā)attributeReplaced或attributeAdded方法32
publicvoidsetContext(SessionEventse)33
{34
se.getSession().getServletContext().setAttribute("onLine",newInteger(count));35
}36
//增加一個(gè)新的屬性時(shí)激發(fā)37
publicvoidattributeAdded(ServletContextAttributeEventevent){39
log("attributeAdded('"+event.getName()+"','"+40
event.getValue()+"')");42
}44
//刪除一個(gè)新的屬性時(shí)激發(fā)45
publicvoidattributeRemoved(ServletContextAttributeEventevent){47
log("attributeRemoved('"+event.getName()+"','"+48
event.getValue()+"')");50
}52
//屬性被替代時(shí)激發(fā)53
publicvoidattributeReplaced(ServletContextAttributeEventevent){55
log("attributeReplaced('"+event.getName()+"','"+56
event.getValue()+"')");57
}58
//context刪除時(shí)激發(fā)59
publicvoidcontextDestroyed(ServletContextEventevent){61
log("contextDestroyed()");62
this.context=null;64
}66
//context初始化時(shí)激發(fā)67
publicvoidcontextInitialized(ServletContextEventevent){69
this.context=event.getServletContext();70
log("contextInitialized()");72
}73
privatevoidlog(Stringmessage){75
System.out.println("ContextListener:"+message);76
}
77
}【程序注解】
在OnLineCountListener里,用count代表當(dāng)前在線的人數(shù),OnLineCountListener將在Web效勞器啟動(dòng)時(shí)自動(dòng)執(zhí)行。當(dāng)OnLineCountListener構(gòu)造好后,把count設(shè)置為0。每增加一個(gè)Session,OnLineCountListener會(huì)自動(dòng)調(diào)用sessionCreated(SessionEventse)方法;每銷毀一個(gè)Session,OnLineCountListener會(huì)自動(dòng)調(diào)用sessionDestroyed(SessionEventse)方法。當(dāng)調(diào)用sessionCreated(SessionEventse)方法時(shí),說(shuō)明又有一個(gè)客戶在請(qǐng)求,此時(shí)使在線的人數(shù)〔count〕加1,并且把count寫到ServletContext中。ServletContext的信息是所有客戶端共享的,這樣,每個(gè)客戶端都可以讀取到當(dāng)前在線的人數(shù)。為了使監(jiān)聽器生效,需要在web.xml里進(jìn)行配置,如下所示:<listener>
<listener-class>OnLineCountListener</listener-class>
</listener>測(cè)試程序:<%@pagecontentType="text/html;charset=gb2312"%>目前在線人數(shù):<fontcolor=red><%=getServletContext().getAttribute("onLine")%></font><br>getServletContext().getAttribute("onLine")獲得了count的具體值??蛻舳苏{(diào)用退出會(huì)話:<formaction="exit.jsp"method=post><inputtype=submitvalue="exit"></form>客戶端調(diào)用:<%session.invalidate();%>使Session失效,這樣監(jiān)聽器就會(huì)使count減1。web.xml做好以上的配置,把OnLineCountListener放在WEB-INF/class目錄下,啟動(dòng)Web效勞器,在瀏覽器里輸入以下URL〔根據(jù)具體情況不同〕:://127.0.0.1:8080/ch14/listener.jsp瀏覽器將會(huì)打印目前在線人數(shù)。在效勞器端有以下輸出:…ContextListener:contextInitialized()ContextListener:attributeReplaced('org.apache.catalina.WELCOME_FILES','[Ljava.lang.String;@1d98a')…ContextListener:attributeAdded('onLine','1')ContextListener:attributeReplaced('onLine','1')ContextListener:attributeReplaced('onLine','0')ContextListener:attributeReplaced('onLine','1')ContextListener:attributeReplaced('onLine','2')三、程序題1.現(xiàn)在輸入n個(gè)數(shù)字,以逗號(hào),分開;然后可選擇升或者降序排序;按提交鍵就在另一頁(yè)面顯示按什么排序,結(jié)果為,提供resetimportjava.util.*;publicclassbycomma{publicstaticString[]splitStringByComma(Stringsource){if(source==null||source.trim().equals(""))returnnull;StringTokenizercommaToker=newStringTokenizer(source,",");String[]result=newString[commaToker.countTokens()];inti=0;while(commaToker.hasMoreTokens()){result[i]=commaToker.nextToken();i++;}returnresult;}publicstaticvoidmain(Stringargs[]){String[]s=splitStringByComma("5,8,7,4,3,9,1");int[]ii=newint[s.length];for(intI=0;i<s.length;i++){ii[i]=Integer.parseInt(s[i]);}Arrays.sort(ii);//ascfor(inti=0;i<s.length;i++){System.out.println(ii[i]);}//descfor(inti=(s.length-1);i>=0;i--){System.out.println(ii[i]);}}}2.我們?cè)趙eb應(yīng)用開發(fā)過(guò)程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個(gè)某種編碼的字符串?PublicStringtranslate(Stringstr){StringtempStr="";try{tempStr=newString(str.getBytes("ISO-8859-1"),"GBK");tempStr=tempStr.trim();}catch(Exceptione){System.err.println(e.getMessage());}returntempStr;}3.Session中存儲(chǔ)一個(gè)String變量,變量名稱為studentname,寫出在jsp中如何得到這個(gè)session變量的值的語(yǔ)句。<% StringstudentName=session.getAttribute(“studentname〞)==null?“〞:(String)session.getAttribute(“studentname〞);%>4.在Web應(yīng)用中,各舉POST請(qǐng)求和GET請(qǐng)求應(yīng)用場(chǎng)景的一個(gè)例子<formname=〞…〞method=〞get〞action=〞…〞></form><formname=〞…〞method=〞post〞action=〞…〞></form>5.編寫一個(gè)servlet。servlet的功能要求:記錄訪問(wèn)該servlet的客戶端的ip和訪問(wèn)時(shí)間,把記錄寫入client_ip.log文件。client_ip.log里的格式大致如下:9:362005-4-89:362005-4-8packagecom.itjob.st;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.PrintWriter;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.servlet.ServletException;importjavax.servlet..Servlet;importjavax.servlet..ServletRequest;importjavax.servlet..ServletResponse;publicclassMyServletextendsServlet{ privateFileclientIp; privateFileOutputStreamfos; /** *Constructoroftheobject. */ publicMyServlet(){ super(); } /** *Destructionoftheservlet.<br> */ publicvoiddestroy(){ super.destroy();//Justputs"destroy"stringinlog //Putyourcodehere } publicvoidservice(javax.servlet..ServletRequestreq,javax.servlet..ServletResponseresp)throwsjavax.servlet.ServletException,java.io.IOException{ openFileOutputStream(); StringclientIp=req.getRemoteAddr(); SimpleDateFormatsdf=newSimpleDateFormat("HH:mmyyyy-MM-dd"); Datedate=newDate(); StringcurrDate=sdf.format(date); StringclientIpLog=clientIp+""+currDate; this.fos.write(clientIpLog.getBytes()); this.fos.flush(); closeFileOutputStream(); } /** *ThedoGetmethodoftheservlet.<
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 師德師風(fēng)提升年活動(dòng)簡(jiǎn)報(bào)范文(6篇)
- 農(nóng)村培訓(xùn)課件
- 開學(xué)第一課觀后感(匯編15篇)
- 2024年中國(guó)折扣零售行業(yè)市場(chǎng)現(xiàn)狀、前景分析研究報(bào)告(智研咨詢發(fā)布)
- 二零二五年度海上風(fēng)電項(xiàng)目土地租賃與海上平臺(tái)建設(shè)合同3篇
- 二零二五年度林業(yè)資源綜合開發(fā)承包協(xié)議3篇
- 2025版食用菌木屑研發(fā)與生產(chǎn)合作合同3篇
- 二零二五年度旅游線路設(shè)計(jì)與開發(fā)合作協(xié)議3篇
- 2025版環(huán)境執(zhí)法檢查相關(guān)方環(huán)境管理協(xié)議3篇
- 鼓勵(lì)幼兒自主探索的教學(xué)方法計(jì)劃
- 2025-2030年中國(guó)電動(dòng)高爾夫球車市場(chǎng)運(yùn)行狀況及未來(lái)發(fā)展趨勢(shì)分析報(bào)告
- 河南省濮陽(yáng)市2024-2025學(xué)年高一上學(xué)期1月期末考試語(yǔ)文試題(含答案)
- 2024年08月北京中信銀行北京分行社會(huì)招考(826)筆試歷年參考題庫(kù)附帶答案詳解
- 蘇教版二年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)
- 職業(yè)技術(shù)學(xué)院教學(xué)質(zhì)量監(jiān)控與評(píng)估處2025年教學(xué)質(zhì)量監(jiān)控督導(dǎo)工作計(jì)劃
- 金字塔原理與結(jié)構(gòu)化思維考核試題及答案
- 基礎(chǔ)護(hù)理學(xué)導(dǎo)尿操作
- 標(biāo)牌加工風(fēng)險(xiǎn)防范方案
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案解析
- 【字貼】人教PEP版-小學(xué)英語(yǔ)四年級(jí)上冊(cè)單詞表國(guó)標(biāo)體描紅字帖(含音標(biāo))
- 如何寫好賞析文章
評(píng)論
0/150
提交評(píng)論