版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一、簡答題1.forward和redirect的區(qū)別forward是效勞器請求資源,效勞器直接訪問目標(biāo)地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道效勞器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。redirect就是效勞端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛剛請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。2.說出Servlet的生命周期,并說出Servlet和CGI的區(qū)別Servlet被效勞器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法〔doGet,doPost〕等,當(dāng)效勞器決定將實例銷毀的時候調(diào)用其destroy方法。與cgi的區(qū)別在于servlet處于效勞器進程中,它通過多線程方式運行其service方法,一個實例可以效勞于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產(chǎn)生新的進程,效勞完成后就銷毀,所以效率上低于servlet。3.JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?動態(tài)INCLUDE用jsp:include動作實現(xiàn)<jsp:includepage="included.jsp"flush="true"/>它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)。靜態(tài)INCLUDE用include偽碼實現(xiàn),并不會檢查所含文件的變化,適用于包含靜態(tài)頁面<%@includefile="included.htm"%>4.什么情況下調(diào)用doGet()和doPost()?Jsp頁面中的form標(biāo)簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()。5.servlet的生命周期web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法,根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束效勞,web容器調(diào)用servlet的destroy()方法。6.如何現(xiàn)實servlet的單線程模式<%@pageisThreadSafe="false"%>7.頁面間對象傳遞的方法request,session,application,cookie等8.JSP和Servlet有哪些相同點和不同點,他們之間的聯(lián)系是什么?JSP技術(shù)構(gòu)建在Servlet技術(shù)之上,是Servlet技術(shù)的擴展,本質(zhì)上是Servlet的簡易方式,JSP能做到的,Servlet都能做到,但是它們卻各有所長。JSP更強調(diào)應(yīng)用的外表表達。JSP編譯后是"類servlet"。Servlet比擬適合作為控制類組件,比方視圖控制器等。另外,Servlet還可以作為過濾器、監(jiān)聽器等。Servlet不僅可以動態(tài)生成HTML內(nèi)容,還可以動態(tài)生成圖形。Servlet和JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里別離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。總而言之,Servlet在工程中作為控制類的組件,并且處理一些后臺業(yè)務(wù),JSP那么作為顯示組件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。9.四種會話跟蹤技術(shù)會話作用域ServletsJSP頁面描述page否是代表與一個頁面相關(guān)的對象和屬性。一個頁面由一個編譯好的Javaservlet類〔可以帶有任何的include指令,但是沒有include動作〕表示。這既包括servlet又包括被編譯成servlet的JSP頁面request是是代表與Web客戶機發(fā)出的一個請求相關(guān)的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件〔由于forward指令和include動作的關(guān)系〕session是是代表與用于某個Web客戶機的一個用戶體驗相關(guān)的對象和屬性。一個Web會話可以也經(jīng)常會跨越多個客戶機請求application是是代表與整個Web應(yīng)用程序相關(guān)的對象和屬性。這實質(zhì)上是跨越整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個全局作用域10.Servlet執(zhí)行時一般實現(xiàn)哪幾個方法?Publicvoidinit(ServletConfigconfig)publicServletConfiggetServletConfig()publicStringgetServletInfo()publicvoidservice(ServletRequestrequest,ServletResponseresponse)publicvoiddestroy()11.url重寫有幾種方式?由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞回效勞器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把sessionid直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現(xiàn)形式為:///xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為:///xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764這兩種方式對于用戶來說是沒有區(qū)別的,只是效勞器在解析的時候處理的方式不同,采用第一種方式也有利于把sessionid的信息和正常程序參數(shù)區(qū)分開來。為了在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個sessionid。12.在jsp中引用使用<jsp:useBean
id="
"
...scope="
"/>來引用javabean.Ⅰscope的值有哪些,這些值的區(qū)別是什么?不同的jsp頁面中引用javabean時,id能否相同,如果能相同,對scope的值有什么要求?scope可以為:application|page|session|requeat這個東西就是指定ID的有效范圍。如果scope=page,那么useBean的有用范圍就只能在page內(nèi)有效,到了session|application|requeat就無效了??梢灾付╯cope屬性,使得Bean不只是與當(dāng)前頁面建立單關(guān)聯(lián)。如果共享了Bean,獲取對現(xiàn)有Bean的引用就很有用,因此jsp;useBean操作表示公當(dāng)不存在具有相同id和scope的對象時才實例化一個新對象。這樣就可以節(jié)約資源。二、問答題1.JSP的內(nèi)置對象及方法Request表示ServletRequest對象。它包含了有關(guān)瀏覽器請求的信息,并且提供了幾個用于獲取cookie,header,和session數(shù)據(jù)的有用的方法。Response表示ServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法〔如cookies,頭信息等〕out對象是的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。pageContext表示一個ontext對象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對象的API,并且包裝了通用的servlet相關(guān)功能的方法。Session表示一個請求的對象。Session可以存貯用戶的狀態(tài)信息applicaton表示一個javax.servlet.ServletContext對象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息config表示一個對象。該對象用于存取servlet實例的初始化參數(shù)。Page表示從該頁面產(chǎn)生的一個servlet實例2.JSP的常用指令<%@pagelanguage="scriptingLanguage":主要指定JSPContainer要用什么語言來編譯JSP網(wǎng)頁。JSP2.0標(biāo)準(zhǔn)中指出,目前只可以使用Java語言,不過未來不排除增加其他語言,如C、C++、Perl等等。默認值為Java
extends="className":主要定義此JSP網(wǎng)頁產(chǎn)生的Servlet是繼承哪個父類
import="importList":主要定義此JSP網(wǎng)頁可以使用哪些JavaAPI
session="true|false":決定此JSP網(wǎng)頁是否可以使用session對象。默認值為true
buffer="none|sizeinkb":決定輸出流(outputstream)是否有緩沖區(qū)。默認值為8KB的緩沖區(qū)
autoFlush="true|false":決定輸出流的緩沖區(qū)是否要自動去除,緩沖區(qū)滿了會產(chǎn)生異常(Exception)。默認值為true
isThreadSafe="true|false":主要是告訴JSPContainer,此JSP網(wǎng)頁能處理超過一個以上的請求。默認值為true,如果此值設(shè)為false,SingleThreadModel將會被使用。SingleThreadModel在Servlet2.4中已經(jīng)聲明不贊成使用(deprecate)
info="text":主要表示此JSP網(wǎng)頁的相關(guān)信息
errorPage="error_url":表示如果發(fā)生異常錯誤時,網(wǎng)頁會被重新指向那一個URL
isErrorPage="true|false":表示此JSPPage是否為處理異常錯誤的網(wǎng)頁
contentType="ctinfo":表示MIME類型和JSP網(wǎng)頁的編碼方式
pageEncoding="ctinfo":表示JSP網(wǎng)頁的編碼方式
isELIgnored="true|false":表示是否在此JSP網(wǎng)頁中執(zhí)行或忽略EL表達式。如果為true時,JSPContainer將忽略EL表達式;反之為false時,EL表達式將會被執(zhí)行注意:只有import這個屬性可以重復(fù)設(shè)定,其他那么否。%><%@includefile="filename"%><%@taglibprefix="c"uri="://……"%>3.Request對象的主要方法:setAttribute(Stringname,Object):設(shè)置名字為name的request的參數(shù)值getAttribute(Stringname):返回由name指定的屬性值getAttributeNames():返回request對象所有屬性的名字集合,結(jié)果是一個枚舉的實例getCookies():返回客戶端的所有Cookie對象,結(jié)果是一個Cookie數(shù)組getCharacterEncoding():返回請求中的字符編碼方式getContentLength():返回請求的Body的長度getHeader(Stringname):獲得協(xié)議定義的文件頭信息getHeaders(Stringname):返回指定名字的requestHeader的所有值,結(jié)果是一個枚舉的實例getHeaderNames():返回所以requestHeader的名字,結(jié)果是一個枚舉的實例getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù)getMethod():獲得客戶端向效勞器端傳送數(shù)據(jù)的方法getParameter(Stringname):獲得客戶端傳送給效勞器端的有name指定的參數(shù)值getParameterNames():獲得客戶端傳送給效勞器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例getParameterValues(Stringname):獲得有name指定的參數(shù)的所有值getProtocol():獲取客戶端向效勞器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱getQueryString():獲得查詢字符串getRequestURI():獲取發(fā)出請求字符串的客戶端地址getRemoteAddr():獲取客戶端的IP地址getRemoteHost():獲取客戶端的名字getSession([Booleancreate]):返回和請求相關(guān)SessiongetServerName():獲取效勞器的名字getServletPath():獲取客戶端所請求的腳本文件的路徑getServerPort():獲取效勞器的端口號removeAttribute(Stringname):刪除請求中的一個屬性4.jsp有哪些動作?作用分別是什么?JSP共有以下6種根本動作jsp:include:在頁面被請求的時候引入一個文件。Jsp:useBean:尋找或者實例化一個JavaBean。Jsp:setProperty:設(shè)置JavaBean的屬性。Jsp:getProperty:輸出某個JavaBean的屬性。Jsp:forward:把請求轉(zhuǎn)到一個新的頁面。Jsp:plugin:使您能插入所需的特定的瀏覽器的OBJECT或EMBED元素來指定瀏覽器運行一個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.過濾器監(jiān)聽servlet三者的區(qū)別和實際中主要的應(yīng)用場景過濾器〔Filter〕作為過濾器,在Servlet作為過濾器使用時,它可以對客戶的請求進行過濾處理,當(dāng)它處理完成后,它會交給下一個過濾器處理,就這樣,客戶的請求在過濾鏈里一個個處理,直到請求發(fā)送到目標(biāo)。舉個例子,某個網(wǎng)站里有提交"修改的注冊信息"的網(wǎng)頁,當(dāng)用戶填寫完成修改信息并提交后,效勞端在進行真正的處理時需要做兩個處理:客戶端的會話是否有效;對提交的數(shù)據(jù)進行統(tǒng)一的編碼,比方GB2312。這兩個處理可以在由兩個過濾器組成的過濾鏈里進行處理。當(dāng)過濾器處理成功后,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo);如果過濾器處理不成功〔比方客戶端的會話無效〕,它將把視圖派發(fā)到指定的錯誤頁面??梢钥闯?,過濾器就像一扇門,客戶端要和效勞端的某個目標(biāo)交互,必須通過這扇門。過濾器是用于過濾Servlet的請求和響應(yīng),過濾器是存在于請求和被請求資源之間的。
過濾器就像當(dāng)于一個中間件,請求要經(jīng)過過濾器,然后過濾器才去調(diào)用Servlet,Servlet的響應(yīng)也會被過濾器截獲并作相應(yīng)的處理。Filter是一個接口,要寫一個自己的Filter就只能實現(xiàn)Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比擬相似,也是會先調(diào)用init()方法,然后再調(diào)用核心的處理過濾的方法doFilter(),這個方法中可定義過濾規(guī)那么,然后是destory()方法銷毀Filter對象。dofilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
這個是過濾的核心方法,F(xiàn)ilterChain的方法doFilter(ServletRequestrequest,ServletResponseresponse)也就是過濾后的請求調(diào)用資源的方法,如果不寫這個方法,也就不會去調(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就是要過濾的Servlet的url-pattern-->
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
<!--上面的三個是過濾的范圍-->
</filter-mapping>
CharArrayWriter類,是一個將數(shù)據(jù)保存在字符數(shù)組中的輸出流,我們可以使用它來構(gòu)造一個PrintWriter對象,也就實現(xiàn)了向內(nèi)存輸出。CharArrayWriter類的toString()和toCharArray()方法就可以取得寫入內(nèi)存中的數(shù)據(jù)。
注意:CharArrayWriter類是一個不會真正輸出的類,他的write()方法只會將內(nèi)容寫入字符數(shù)組,而且這個字符數(shù)組是會自動增長的。例子:兩個JSP頁面,前一個頁面用戶輸入一些信息然后提交,后一個頁面顯示用戶提交的信息。在提交信息后,要經(jīng)過兩個過濾器的處理,一個檢查用戶是否登錄,一個把用戶的提交信息用GB2312進行重新編碼。
開發(fā)一個Filter,這個Filter需要實現(xiàn)Filter接口,F(xiàn)ilter接口定義了以下的方法:destroy()//由Web容器調(diào)用,銷毀此Filterinit(FilterConfigfilterConfig)///由Web容器調(diào)用,初始化此FilterdoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)//具體過濾處理代碼對提交信息用GB2312進行重新編碼的Filter:1
//====================ProgramDiscription=====================2
//程序名稱:例如14-7:EncodingFilter.java3
//程序目的:學(xué)習(xí)使用編碼過濾器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);//把請求用指定的方式編碼32
//把處理發(fā)送到下一個過濾器33
chain.doFilter(srequest,sresponse);
34
}36
publicvoiddestroy()37
{38
this.filterConfig=null;39
}41
publicvoidsetFilterConfig(finalFilterConfigfilterConfig)42
{43
this.filterConfig=filterConfig;44
}45
}【程序注解】
正如前面所說,EncodingFilter的目的是把客戶端的請求用指定的方式編碼,具體的處理在request.setCharacterEncoding(targetEncoding)完成了。LoginFilter判斷用戶在進入目標(biāo)之前是否登錄,if((isLog!=null)&&((isLog.equals("true"))||(isLog=="true")))將檢查用戶是否登錄,如果已登錄,那么把視圖讓過濾鏈繼續(xù)處理,如果沒有登錄,把視圖派發(fā)到登錄頁面,過濾鏈處理結(jié)束。
下面我們來看怎么在web.xml里配置這兩個過濾器,代碼如下所示:1
//====================ProgramDiscription=====================2
//程序名稱:例如14-7:EncodingFilter.java3
//程序目的:學(xué)習(xí)使用編碼過濾器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);//把請求用指定的方式編碼32
//把處理發(fā)送到下一個過濾器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時,首先指定Filter的名字和Filter的實現(xiàn)類,如果有必要,還要配置Filter的初始參數(shù);然后為Filter做映射,這個映射指定了需要過濾的目標(biāo)〔JSP、Servlet〕。在上面的例子中,指定了EncodingFilter為所有的JSP和Servlet做過濾,LoginFilter為target.jsp做過濾。這樣,當(dāng)客戶請求target.jsp時,首先要經(jīng)過EncodingFilter的處理,然后經(jīng)過LoginFilter的處理,最后才把請求傳遞給target.jsp?!具\行程序】
把程序部署到Web效勞器里〔比方Tomcat〕,然后啟動Web效勞器,在瀏覽器里輸入以下URL〔根據(jù)具體請求改變URL〕:://127.0.0.1:8080/ch14/target.jsp那么Filter將會把視圖派發(fā)到:://127.0.0.1:8080/ch14/init.jsp在init.jsp里,我們使用:<%session.setAttribute("isLog","true");%>來設(shè)置用戶已經(jīng)登錄〔這里是簡化的,在實際工程中,可能要經(jīng)過驗證處理〕。在init.jsp里,可以提交一些中文的信息。由于提交的信息被EncodingFilter使用GB2312統(tǒng)一編碼了,故在target.jsp里能夠正確顯示中文。您可以做一個試驗,把web.xml改為:<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/nothing</url-pattern>
</filter-mapping>然后重新啟動Web效勞器。那么在target.jsp里,中文將不能正確顯示。監(jiān)聽器Listener是Servlet的監(jiān)聽器,它可以監(jiān)聽客戶端的請求、效勞端的操作等。通過監(jiān)聽器,可以自動激發(fā)一些操作,比方監(jiān)聽在線的用戶的數(shù)量。當(dāng)增加一個Session時,就激發(fā)sessionCreated(SessionEventse)方法,這樣就可以給在線人數(shù)加1。以下是3個Listener接口。ServletContextAttributeListener:監(jiān)聽對ServletContext屬性的操作,比方增加、刪除、修改屬性ServletRequestListener:SessionListener:監(jiān)聽Session的操作。當(dāng)創(chuàng)立一個Session時,激發(fā)sessionCreated(SessionEventse)方法;當(dāng)銷毀一個Session時,激發(fā)sessionDestroyed(SessionEventse)方法SessionAttributeListener:監(jiān)聽Session中的屬性的操作。當(dāng)在Session增加一個屬性時,激發(fā)attributeAdded(SessionBindingEventse)方法;當(dāng)在Session刪除一個屬性時,激發(fā)attributeRemoved(SessionBindingEventse)方法;當(dāng)在Session屬性被重新設(shè)置時,激發(fā)attributeReplaced(SessionBindingEventse)方法ServletContextListener:監(jiān)聽ServletContext。當(dāng)創(chuàng)立ServletContext時,激發(fā)contextInitialized(ServletContextEventsce)方法;當(dāng)銷毀ServletContext時,激發(fā)contextDestroyed(ServletContextEventsce)方法這三個監(jiān)聽器接口,分別監(jiān)聽Servlet中3種比擬重要的對象的創(chuàng)立和銷毀。這三個接口中分別有監(jiān)聽該對象創(chuàng)立和銷毀事件的方法,效勞器本身就是事件源。listener的配置
<listener>
<listener-class>alan.servlet.listener.AlanContextListener</listener-class>
<!--listener-class也就是實現(xiàn)Listener接口的類-->
</listener>Servlet中的重要對象〔只針對應(yīng)用〕數(shù)量生命周期是否線程平安ServletContext1全局的。只有在應(yīng)用關(guān)閉時才銷毀不平安。需要加同步訪問Session和用戶的數(shù)量相同局部的。只在有效時間內(nèi)存在不平安。需要加同步訪問ServletRequest多個局部的。只在service()和doGet()、doPost()中存在線程平安下面我們開發(fā)一個具體的例子,這個監(jiān)聽器能夠統(tǒng)計在線的人數(shù)。在ServletContext初始化和銷毀時,在效勞器控制臺打印對應(yīng)的信息。當(dāng)ServletContext里的屬性增加、改變、刪除時,在效勞器控制臺打印對應(yīng)的信息。要獲得以上的功能,監(jiān)聽器必須實現(xiàn)以下3個接口:
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)立一個session時激發(fā)19
publicvoidsessionCreated(SessionEventse)20
{21
count++;22
setContext(se);
24
}25
//當(dāng)一個session失效時激發(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
//增加一個新的屬性時激發(fā)37
publicvoidattributeAdded(ServletContextAttributeEventevent){39
log("attributeAdded('"+event.getName()+"','"+40
event.getValue()+"')");42
}44
//刪除一個新的屬性時激發(fā)45
publicvoidattributeRemoved(ServletContextAttributeEventevent){47
log("attributeRemoved('"+event.getName()+"','"+48
event.getValue()+"')");50
}52
//屬性被替代時激發(fā)53
publicvoidattributeReplaced(ServletContextAttributeEventevent){55
log("attributeReplaced('"+event.getName()+"','"+56
event.getValue()+"')");57
}58
//context刪除時激發(fā)59
publicvoidcontextDestroyed(ServletContextEventevent){61
log("contextDestroyed()");62
this.context=null;64
}66
//context初始化時激發(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效勞器啟動時自動執(zhí)行。當(dāng)OnLineCountListener構(gòu)造好后,把count設(shè)置為0。每增加一個Session,OnLineCountListener會自動調(diào)用sessionCreated(SessionEventse)方法;每銷毀一個Session,OnLineCountListener會自動調(diào)用sessionDestroyed(SessionEventse)方法。當(dāng)調(diào)用sessionCreated(SessionEventse)方法時,說明又有一個客戶在請求,此時使在線的人數(shù)〔count〕加1,并且把count寫到ServletContext中。ServletContext的信息是所有客戶端共享的,這樣,每個客戶端都可以讀取到當(dāng)前在線的人數(shù)。為了使監(jiān)聽器生效,需要在web.xml里進行配置,如下所示:<listener>
<listener-class>OnLineCountListener</listener-class>
</listener>測試程序:<%@pagecontentType="text/html;charset=gb2312"%>目前在線人數(shù):<fontcolor=red><%=getServletContext().getAttribute("onLine")%></font><br>getServletContext().getAttribute("onLine")獲得了count的具體值??蛻舳苏{(diào)用退出會話:<formaction="exit.jsp"method=post><inputtype=submitvalue="exit"></form>客戶端調(diào)用:<%session.invalidate();%>使Session失效,這樣監(jiān)聽器就會使count減1。web.xml做好以上的配置,把OnLineCountListener放在WEB-INF/class目錄下,啟動Web效勞器,在瀏覽器里輸入以下URL〔根據(jù)具體情況不同〕:://127.0.0.1:8080/ch14/listener.jsp瀏覽器將會打印目前在線人數(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個數(shù)字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結(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.我們在web應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?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中存儲一個String變量,變量名稱為studentname,寫出在jsp中如何得到這個session變量的值的語句。<% StringstudentName=session.getAttribute(“studentname〞)==null?“〞:(String)session.getAttribute(“studentname〞);%>4.在Web應(yīng)用中,各舉POST請求和GET請求應(yīng)用場景的一個例子<formname=〞…〞method=〞get〞action=〞…〞></form><formname=〞…〞method=〞post〞action=〞…〞></form>5.編寫一個servlet。servlet的功能要求:記錄訪問該servlet的客戶端的ip和訪問時間,把記錄寫入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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度油氣田打井工程設(shè)計與施工總承包合同4篇
- 2025年度水塔供水工程進度與質(zhì)量保證合同4篇
- 2024節(jié)能燈購買合同
- 2024版權(quán)購買合同模板
- 2024版工程安全生產(chǎn)許可證協(xié)議
- 2025年度新型綠色建筑材料出口買賣合同4篇
- 2024版廣告公司承包經(jīng)營合同
- 2025年靜電場治療儀項目投資可行性研究分析報告
- 2024版模特隱私保密協(xié)議書范本
- 2024年起重機安裝與安全教育培訓(xùn)合同范本3篇
- 割接方案的要點、難點及采取的相應(yīng)措施
- 2025年副護士長競聘演講稿(3篇)
- 2025至2031年中國臺式燃氣灶行業(yè)投資前景及策略咨詢研究報告
- 原發(fā)性腎病綜合征護理
- (一模)株洲市2025屆高三教學(xué)質(zhì)量統(tǒng)一檢測 英語試卷
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級上冊
- 2025年中國電科集團春季招聘高頻重點提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 2024年考研英語一閱讀理解80篇解析
- 樣板間合作協(xié)議
評論
0/150
提交評論