Java面試題全集(中)_第1頁
Java面試題全集(中)_第2頁
Java面試題全集(中)_第3頁
Java面試題全集(中)_第4頁
Java面試題全集(中)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

這部分主要是與JavaWeb和WebService相關(guān)的面試題。

96、闡述Servlet和CGI的區(qū)別?

答:Servlet與CGI的區(qū)別在于Servlet處于服務(wù)器進(jìn)程中,它通過多線程方式運行其service。方法,一個實例可以服務(wù)于多個請求,并

且其實例一般不會銷毀,而CGI對每個請求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷毀,所以效率上低于Servlet。

補充:SunMicrosystems公司在1996年發(fā)布Servlet技術(shù)就是為了和CGI進(jìn)行競爭,Servlet是一個特殊的Java程序,一個基于Java的Web應(yīng)用通常

包含一個或多個Servlet類。Servlet不能夠自行創(chuàng)建并執(zhí)行,它是在Servlet容器中運行的,容器將用戶的請求傳遞給Servlet程序,并將Servlet的響

應(yīng)回傳給用戶。通常一個Servlet會關(guān)聯(lián)一個或多個JSP頁面。以前CGI經(jīng)常因為性能開銷上的問題被詬病,然而FastCGI早就已經(jīng)解決了CGI效率

上的問題,所以面試的時候大可不必信口開河的詬病CGI,事實上有很多你熟悉的網(wǎng)站都使用了CGI技術(shù)。

97、Servlet接口中有哪些方法?

答:Servlet接口定義了5個方法,其中前三個方法與Servlet生命周期相關(guān):

-voidinit(ServletConfigconfig)throwsServletException

-voidservice(ServletRequestreq,ServletResponseresp)throwsServletException,java.io.lOException

-voiddestory()

-java.Iang.StringgetServletlnfoO

-ServletConfiggetServletConfigO

Web容器加載Servlet并將其實例化后,Servlet生命周期開始,容器運行其init()方法進(jìn)行Servlet的初始化;請求到達(dá)時調(diào)用Servlet的

service。方法,service。方法會根據(jù)需要調(diào)用與請求對應(yīng)的doGet或doPost等方法;當(dāng)服務(wù)器關(guān)閉或項目被卸載時服務(wù)器會將Servlet

實例銷毀,此時會調(diào)用Servlet的destroy。方法。

98、轉(zhuǎn)發(fā)(forward)和重定向(redirect)的區(qū)別?

答:forward是容器中控制權(quán)的轉(zhuǎn)向,是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后

把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。redirect就是服務(wù)

器端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,因此從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址,很明顯

redirect無法訪問到服務(wù)器保護(hù)起來資源,但是可以從一個網(wǎng)站redirect到其他網(wǎng)站。forward更加高效,所以在滿足需要時盡量使用

forward(通過調(diào)用RequestDispatcher對象的forward。方法,該對象可以通過ServletRequest對象的getRequestDispatcherO方法獲

得),并且這樣也有助于隱藏實際的鏈接;在有些情況下,比如需要訪問一個其它服務(wù)器上的資源,則必須使用重定向(通過

HttpServletResponse對象調(diào)用其sendRedirect。方法實現(xiàn))。

99、JSP有哪些內(nèi)置對象?作用分別是什么?

答:JSP有9個內(nèi)置對象:

-request:封裝客戶端的請求,其中包含來自GET或POST請求的參數(shù);

-response:封裝服務(wù)器對客戶端的響應(yīng);

-pageContext:通過該對象可以獲取其他對象;

-session:封裝用戶會話的對象;

-application:封裝服務(wù)器運行環(huán)境的對象;

-out:輸出服務(wù)器響應(yīng)的輸出流對象;

-config:Web應(yīng)用的配置對象;

-page:JSP頁面本身(相當(dāng)于Java程序中的this);

-exception:封裝頁面拋出異常的對象。

補充:如果用Servlet來生成網(wǎng)頁中的動態(tài)內(nèi)容無疑是非常繁瑣的工作,另一方面,所有的文本和HTML標(biāo)簽都是硬編碼,即使做出微小的修改,都

需要進(jìn)行重新編譯。JSP解決了Servlet的這些問題,它是Servlet很好的補充,可以專門用作為用戶呈現(xiàn)視圖(View),而Servlet作為控制器

(Controller)專門負(fù)責(zé)處理用戶請求并轉(zhuǎn)發(fā)或重定向到某個頁面.基于Java的Web開發(fā)很多都同時使用了Servlet和JSP。JSP頁面其實是一個

Servlet,能夠運行Servlet的服務(wù)器(Servlet容器)通常也是JSP容器,可以提供JSP頁面的運行環(huán)境,Tomcat就是一個Servlet/JSP容器。第一次

請求一個JSP頁面時,Servlet/JSP容器首先將JSP頁面轉(zhuǎn)換成一個JSP頁面的實現(xiàn)類,這是一個實現(xiàn)了JspPage接口或其子接口HttpJspPage的

Java類。JspPage接口是Servlet的子接口,因此每個JSP頁面都是一個Servlet。轉(zhuǎn)換成功后,容器會編譯Servlet類,之后容器加載和實例化Java

字節(jié)碼,并執(zhí)行它通常對Servlet所做的生命周期操作。對同一個JSP頁面的后續(xù)請求,容器會查看這個JSP頁面是否被修改過,如果修改過就會重

新轉(zhuǎn)換并重新編譯并執(zhí)行。如果沒有則執(zhí)行內(nèi)存中已經(jīng)存在的Servlet實例。我們可以著一段JSP代碼對應(yīng)的Java程序就知道一切了,而且9個內(nèi)置

對象的神秘面紗也會被揭開。

JSP頁面:

<%@pagepageEncoding="UTF-8"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()

%>

<!DOCTYPEhtml>

<html>

<head>

<basehref="<%=basePath%>">

首頁</title〉

<styletype="text/css">

*{font-family:"Arial";}

</style>

</head>

<body>

<hl>Hello,World!</hl>

<hr/>

<h2>Currenttimeis:<%=newjava.util.Date().toString()%></h2>

</body>

</html>

對應(yīng)的Java代碼:

/*

*GeneratedbytheJaspercomponentofApacheTomcat

*Version:ApacheTomcat/7.0.52

*Generatedat:2014-10-1313:28:38UTC

*Note:Thelastmodifiedtimeofthisfilewassetto

*thelastmodifiedtimeofthesourcefileafter

*generationtoassistwithmodificationtracking.

*/

packageorg.apache.jsp;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.jsp.*;

publicfinalclassindex__jspextendsorg.apache.jasper.runtime.HttpJspBase

implementsorg.apache.jasper.runtime.JspSourceDependent{

privatestaticfinaljavax.servlet.jsp.JspFactory_jspxFactory=javax.servlet.jsp.JspFactory

.getDefaultFactory();

privatestaticjava.util.Map<java.lang.String,java.lang.Long>_jspx_dependants;

privatejavax.el.ExpressionFactory_el_expressionfactory;

privateorg.apache.tomcat.InstanceManager_jsp_instancemanager;

publicjava.util.Map<java.lang.String,java.lang.Long>getDependants(){

return_jspx_dependants;

}

publicvoid_jsplnit(){

_el_expressionfactory=_jspxFactory.getJspApplicationContext(

getServletConfig().getServletContext()).getExpressionFactory();

_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory

.getlnstanceManager(getServletConfig());

}

publicvoid_jspDestroy(){

}

publicvoid_jspService(

finaljavax.servlet.http.HttpServletRequestrequest,

finaljavax.servlet.http.HttpServletResponseresponse)

throwsjava.io.lOException,javax.servlet.ServletException{

//內(nèi)置對象就是在這里定義的

finaljavax.servlet.jsp.PageContextpagecontext;

javax.servlet.http.HttpSessionsession=null;

finaljavax.servlet.ServletContextapplication;

finaljavax.servlet.ServletConfigconfig;

javax.servlet.jsp.JspWriterout=null;

finaljava.lang.Objectpage=this;

javax.servlet.jsp.JspWriter_jspx_out=null;

javax.servlet.jsp.PageContext_jspx_page_context=null;

try{

response.setContentType("text/html;charset=UTF-8");

pageContext=_jspxFactory.getPageContext(this,request,response,

null,true,8192,true);

_jspx_page_context=pageContext;

application=pageContext.getServletContext();

config=pageContext.getServletConfigf);

session=pageContext.getSession();

out=pageContext.getOut();

_jspx_out=out;

out.write('\r');

out.write('\n');

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+"://"

+request.getServerName()+":"+request.getServerPort()

+path+"/";

//以下代碼通過輸出流將HTML標(biāo)簽輸出到瀏覽器中

out.write("\r\n");

out.write("\r\n");

out.write("<!DOCTYPEhtml>\r\n");

out.write("<html>\r\n");

out.write("<head>\r\n");

out.write("<basehref=\"");

out.print(basePath);

out.write("\">\r\n");

out.write("首頁;

out.write("<styletype=\"text/css\,,>\r\n");

out.write("\t*{font-family:\"Arial\";}\r\n");

out.write("</style>\r\n");

out.write(*'?</head>\r\n");

out.write("\r\n");

out.write("?<body>\r\n");

out.write("<hl>Hello,World!</hl>\r\n");

out.write("<hr/>\r\n");

out.write("<h2>Currenttimeis:");

out.print(newrjava.util.Date().toString());

out.write("</h2>\r\n");

out.write("</body>\r\n");

out.write("</html>\r\n,');

}catch(java.lang.Throwablet){

if(!(tinstanceofjavax.servlet.jsp.SkipPageException)){

out=_jspx_out;

if(out!=null&&out.getBufferSize()!=0)

try(

out.clearBuffer();

}catch(java.io.lOExceptione){

}

if(_jspx_page_context!=null)

_jspx_page_context.handlePageException(t);

else

thrownewServletException(t);

}

}finally{

_jspxFactory.releasePageContext(_jspx_page_context);

}

}

}

100、get和post請求的區(qū)別?

答:

①get請求用來從服務(wù)器上獲得資源,而post是用來向服務(wù)器提交數(shù)據(jù);

②get將表單中數(shù)據(jù)按照name=value的形式,添加到action所指向的URL后面,并且兩者使用連接,而各個變量之間使用“&“連

接;post是將表單中的數(shù)據(jù)放在HTTP協(xié)議的請求頭或消息體中,傳遞到action所指向URL;

③get傳輸?shù)臄?shù)據(jù)要受到URL長度限制(1024字節(jié));而post可以傳輸大量的數(shù)據(jù),上傳文件通常要使用post方式;

④f吏用get時參數(shù)會顯示在地址欄上,如果這些數(shù)據(jù)不是敏感數(shù)據(jù),那么可以使用get;對于敏感數(shù)據(jù)還是應(yīng)用使用post;

⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數(shù),保證被傳送的參數(shù)

由遵循規(guī)范的文本組成,例如一個空格的編碼是“%20”。

101、常用的Web服務(wù)器有哪些?

答:Unix和Linux平臺下使用最廣泛的免費HTTP服務(wù)器是Apache服務(wù)器,而Windows平臺的服務(wù)器通常使用IIS作為Web服務(wù)器。選

擇Web服務(wù)器應(yīng)考慮的因素有:性能、安全性、日志和統(tǒng)計、虛擬主機、代理服務(wù)器、緩沖服務(wù)和集成應(yīng)用程序等。下面是對常見服

務(wù)器的簡介:

-IIS:Microsoft的Web服務(wù)器產(chǎn)品,全稱是InternetInformationServices。US是允許在公共Intranet或Internet上發(fā)布信息的Web服

務(wù)器。US是目前最流行的Web服務(wù)器產(chǎn)品之一,很多著名的網(wǎng)站都是建立在IIS的平臺上。IIS提供了一個圖形界面的管理工具,稱為

Internet服務(wù)管理器,可用于監(jiān)視配置和控制Internet服務(wù)。IIS是一種Web服務(wù)組件,其中包括Web服務(wù)器、FTP服務(wù)器、NNTP服務(wù)

器和SMTP服務(wù)器,分別用于網(wǎng)頁瀏覽、文件傳輸、新聞服務(wù)和郵件發(fā)送等方面,它使得在網(wǎng)絡(luò)(包括互聯(lián)網(wǎng)和局域網(wǎng))上發(fā)布信息

成了一件很容易的事。它提供ISAPlQntranetServerAPI)作為擴展Web服務(wù)器功能的編程接口;同時,它還提供一個Internet數(shù)據(jù)庫

連接器,可以實現(xiàn)對數(shù)據(jù)庫的查詢和更新。

-Kangle:KangleWeb服務(wù)器是一款跨平臺、功能強大、安全穩(wěn)定、易操作的高性能Web服務(wù)器和反向代理服務(wù)器軟件。此外,

Kangle也是一款專為做虛擬主機研發(fā)的Web服務(wù)器。實現(xiàn)虛擬主機獨立進(jìn)程、獨立身份運行。用戶之間安全隔離,一個用戶出問題不

影響其他用戶。支持PHP、ASP、ASP.NET、Java、Ruby等多種動態(tài)開發(fā)語言。

-WebSphere:WebSphereApplicationServer是功能完善、開放的Web應(yīng)用程序服務(wù)器,是IBM電子商務(wù)計劃的核心部分,它是基

于Java的應(yīng)用環(huán)境,用于建立、部署和管理Internet和IntranetWeb應(yīng)用程序,適應(yīng)各種Web應(yīng)用程序服務(wù)器的需要。

-WebLogic:WebLogicServer是一款多功能、基于標(biāo)準(zhǔn)的Web應(yīng)用服務(wù)器,為企業(yè)構(gòu)建企業(yè)應(yīng)用提供了堅實的基礎(chǔ)。針對各種應(yīng)用

開發(fā)、關(guān)鍵性任務(wù)的部署,各種系統(tǒng)和數(shù)據(jù)庫的集成、跨Internet協(xié)作等Weblogic都提供了相應(yīng)的支持。由于它具有全面的功能、對

開放標(biāo)準(zhǔn)的遵從性、多層架構(gòu)、支持基于組件的開發(fā)等優(yōu)勢,很多公司的企業(yè)級應(yīng)用都選擇它來作為開發(fā)和部署的環(huán)境。WebLogic

Server在使應(yīng)用服務(wù)器成為企業(yè)應(yīng)用架構(gòu)的基礎(chǔ)方面一直處于領(lǐng)先地位,為構(gòu)建集成化的企業(yè)級應(yīng)用提供了穩(wěn)固的基礎(chǔ)。

-Apache:目前Apache仍然是世界上用得最多的Web服務(wù)器,其市場占有率很長時間都保持在60%以上(目前的市場份額約40%左

右)。世界上很多著名的網(wǎng)站都是Apache的產(chǎn)物,它的成功之處主要在于它的源代碼開放、有一支強大的開發(fā)團(tuán)隊、支持跨平臺的應(yīng)

用(可以運行在幾乎所有的Unix、Windows,Linux系統(tǒng)平臺上)以及它的可移植性等方面。

-Tomcat:Tomcat是一個開放源代碼、運行Servlet和JSP的容器。Tomcat實現(xiàn)了Servlet和JSP規(guī)范。此外,Tomcat還實現(xiàn)了

Apache-Jakarta規(guī)范而且比絕大多數(shù)商業(yè)應(yīng)用軟件服務(wù)器要好,因此目前也有不少的Web服務(wù)器都選擇了Tomcat。

-Nginx:讀作"enginex",是一個高性能的HTTP和反向代理服務(wù)器,也是一個IMAP/POP3/SMTP代理服務(wù)器。Nginx是由Igor

Sysoev為俄羅斯訪問量第二的Rambler站點開發(fā)的,第一個公開版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類BSD許可證的形式

發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。在2014年下半年,Nginx的市場份額達(dá)到了14%。

102、JSP和Servlet是什么關(guān)系?

答:其實這個問題在上面已經(jīng)闡述過了,Servlet是一個特殊的Java程序,它運行于服務(wù)器的JVM中,能夠依靠服務(wù)器的支持向瀏覽器

提供顯示內(nèi)容。JSP本質(zhì)上是Servlet的一種簡易形式,JSP會被服務(wù)器處理成一個類似于Servlet的Java程序,可以簡化頁面內(nèi)容的生

成。Servlet和JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML分離開來。而JSP的情況

是Java和HTML可以組合成一個擴展名為.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當(dāng)

然這個說法是很片面且不夠準(zhǔn)確的。JSP側(cè)重于視圖,Servlet更側(cè)重于控制邏輯,在MVC架構(gòu)模式中,JSP適合充當(dāng)視圖(view)而

Servlet適合充當(dāng)控制器(controller)。

103、講解JSP中的四種作用域。

答:JSP中的四種作用域包括page、request,session和application,具體來說:

-page代表與一個頁面相關(guān)的對象和屬性。

-request代表與Web客戶機發(fā)出的一個請求相關(guān)的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的

臨時數(shù)據(jù)可以置于此作用域。

-session代表與某個用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬性。跟某個用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中。

-application代表與整個Web應(yīng)用程序相關(guān)的對象和屬性,它實質(zhì)上是跨越整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個全

局作用域。

104、如何實現(xiàn)JSP或Servlet的單線程模式?

答:

對于JSP頁面,可以通過page指令進(jìn)行設(shè)置。

<%@pageisThreadSafe=//false/z%>

對于Servlet,可以讓自定義的Servlet實現(xiàn)SingleThreadModel標(biāo)識接口。

說明:如果將JSP或Servlet設(shè)置成單線程工作模式,會導(dǎo)致每個請求創(chuàng)建一個Servlet實例,這種實踐將導(dǎo)致嚴(yán)重的性能問題(服務(wù)器的內(nèi)存壓力

很大,還會導(dǎo)致頻繁的垃圾回收),所以通常情況下并不會這么做。

105、實現(xiàn)會話跟蹤的技術(shù)有哪些?

答:由于HTTP協(xié)議本身是無狀態(tài)的,服務(wù)器為了區(qū)分不同的用戶,就需要對用戶會話進(jìn)行跟蹤,簡單的說就是為用戶進(jìn)行登記,為用

戶分配唯一的ID,下一次用戶在請求中包含此ID,服務(wù)器據(jù)此判斷到底是哪一個用戶。

①URL重寫:在URL中添加用戶會話的信息作為請求的參數(shù),或者將唯一的會話ID添加到URL結(jié)尾以標(biāo)識一個會話。

②設(shè)置表單隱藏域:將和會話跟蹤相關(guān)的字段添加到隱式表單域中,這些信息不會在瀏覽器中顯示但是提交表單時會提交給服務(wù)器。

這兩種方式很難處理跨越多個頁面的信息傳遞,因為如果每次都要修改URL或在頁面中添加隱式表單域來存儲用戶會話相關(guān)信息,事

情將變得非常麻煩。

③cookie:cookie有兩種,一種是基于窗口的,瀏覽器窗口關(guān)閉后,cookie就沒有了;另一種是將信息存儲在一個臨時文件中,并設(shè)

置存在的時間。當(dāng)用戶通過瀏覽器和服務(wù)器建立一次會話后,會話ID就會隨響應(yīng)信息返回存儲在基于窗口的cookie中,那就意味著只

要瀏覽器沒有關(guān)閉,會話沒有超時,下一次請求時這個會話ID又會提交給服務(wù)器讓服務(wù)器識別用戶身份。會話中可以為用戶保存信

息、。會話對象是在服務(wù)器內(nèi)存中的,而基于窗口的cookie是在客戶端內(nèi)存中的。如果瀏覽器禁用了cookie,那么就需要通過下面兩種

方式進(jìn)行會話跟蹤。當(dāng)然,在使用cookie時要注意幾點:首先不要在cookie中存放敏感信息;其次cookie存儲的數(shù)據(jù)量有限(4k),

不能將過多的內(nèi)容存儲cookie中;再者瀏覽器通常只允許一個站點最多存放20個cookie。當(dāng)然,和用戶會話相關(guān)的其他信息(除了會

話ID)也可以存在cookie方便進(jìn)行會話跟蹤。

④HttpSession:在所有會話跟蹤技術(shù)中,HttpSession對象是最強大也是功能最多的。當(dāng)一個用戶第一次訪問某個網(wǎng)站時會自動創(chuàng)建

HttpSession,每個用戶可以訪問他自己的HttpSession。可以通過HttpServletRequest對象的getSession方法獲得HttpSession,通

過HttpSession的setAttribute方法可以將一個值放在HttpSession中,通過調(diào)用HttpSession對象的getAttribute方法,同時傳入屬性

名就可以獲取保存在HttpSession中的對象。與上面三種方式不同的是,HttpSession放在服務(wù)器的內(nèi)存中,因此不要將過大的對象放

在里面,即使目前的Servlet容器可以在內(nèi)存將滿時將HttpSession中的對象移到其他存儲設(shè)備中,但是這樣勢必影響性能。添加到

HttpSession中的值可以是任意Java對象,這個對象最好實現(xiàn)了Serializable接口,這樣Servlet容器在必要的時候可以將其序列化到文

件中,否則在序列化時就會出現(xiàn)異常。

**補充:**HTML5中可以使用WebStorage技術(shù)通過JavaScript來保存數(shù)據(jù),例如可以使用localstorage和sessionstorage來保存用戶會話的信

息,也能夠?qū)崿F(xiàn)會話跟蹤。

106、過濾器有哪些作用和用法?

答:JavaWeb開發(fā)中的過濾器(filter)是從Servlet2.3規(guī)范開始增加的功能,并在Servlet2.4規(guī)范中得到增強。對Web應(yīng)用來說,

過濾器是一個駐留在服務(wù)器端的Web組件,它可以截取客戶端和服務(wù)器之間的請求與響應(yīng)信息,并對這些信息進(jìn)行過濾。當(dāng)Web容器

接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關(guān)聯(lián)。如果有,那么容器將把請求交給過濾器進(jìn)行處理。在過濾器

中,你可以改變請求的內(nèi)容,或者重新設(shè)置請求的報頭信息,然后再將請求發(fā)送給目標(biāo)資源。當(dāng)目標(biāo)資源對請求作出響應(yīng)時候,容器

同樣會將響應(yīng)先轉(zhuǎn)發(fā)給過濾器,在過濾器中你可以對響應(yīng)的內(nèi)容進(jìn)行轉(zhuǎn)換,然后再將響應(yīng)發(fā)送到客戶端。

常見的過濾器用途主要包括:對用戶請求進(jìn)行統(tǒng)一認(rèn)證、對用戶的訪問請求進(jìn)行記錄和審核、對用戶發(fā)送的數(shù)據(jù)進(jìn)行過濾或替換、轉(zhuǎn)

換圖象格式、對響應(yīng)內(nèi)容進(jìn)行壓縮以減少傳輸量、對請求或響應(yīng)進(jìn)行加解密處理、觸發(fā)資源訪問事件、對XML的輸出應(yīng)用XSLT等。

和過濾器相關(guān)的接口主要有:Filter,FilterConfig和Filterchain。

編碼過濾器的例子:

importjava.io.lOException;

importjavax.servlet.Filter;

importjavax.servlet.Filterchain;

importjavax.servlet.FilterConfig;

importjavax.servlet.ServletException;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.annotation.WebFilter;

importjavax.servlet.annotation.WeblnitParam;

^WebFilter(urlPatterns={"*"},

initParams={'VJebInitParam(name="encoding",value="utf-8")})

publicclassCodingFilterimplementsFilter{

privateStringdefaultEncoding="utf-8";

@Override

publicvoiddestroy(){

}

@Override

publicvoiddoFilter(ServletRequestreq,ServletResponseresp.

Filterchainchain)throwslOException,ServletException{

req.setCharacterEncoding(defaultEncoding);

resp.setCharacterEncoding(defaultEncoding);

chain.doFilter(req,resp);

}

@Override

publicvoidinit(FilterConfigconfig)throwsServletException{

Stringencoding=config.getlnitParameter("encoding");

if(encoding!=null){

defaultEncoding=encoding;

}

}

}

下載計數(shù)過濾器的例子:

importjava.io.File;

importjava.io.FileReader;

importjava.io.Filewriter;

importjava.io.lOException;

importjava.util.Properties;

importjava.util.concurrent.Executorservice;

importjava.util.concurrent.Executors;

importjavax.servlet.Filter;

importjavax.servlet.Filterchain;

importjavax.servlet.FilterConfig;

importjavax?servlet.ServletException;

importjavax.servlet,ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.annotation.WebFilter;

importjavax?servlet?http.HttpServletRequest;

gV?ebFilter(urlPatterns={"/*"})

publicclassDownloadCounterFilterimplementsFilter{

privateExecutorServiceexecutorService=Executors.newSingleThreadExecutor();

privatePropertiesdownloadLog;

privateFilelogFile;

@Override

publicvoiddestroy(){

executorservice.shutdown();

}

@Override

publicvoiddoFilter(ServletRequestreq,ServletResponseresp,

Filterchainchain)throwslOException,ServletException{

HttpServletRequestrequest=(HttpServletRequest)req;

finalStringuri=request.getRequestURI();

executorService.execute(newRunnable(){

^Override

publicvoidrun(){

Stringvalue=downloadLog.getProperty(uri);

if(value==null){

downloadLog.setProperty(uri,"1");

}

else{

intcount=Integer.parselnt(value);

downloadLog.setProperty(uri,String.valueOf(++count));

)

try{

downloadLog.store(newFilewriter(logFile)f"");

)

catch(lOExceptione){

e.printStackTrace();

}

}

});

chain.doFilter(req,resp);

}

@Override

publicvoidinit(FilterConfigconfig)throwsServletException{

StringappPath=config.getServletContext().getRealPath(";

logFile=newFile(appPath,"downloadLog.txt");

if(!logFile.exists()){

try{

logFile.createNewFile();

}

catch(lOExceptione){

e.printStackTrace();

}

}

downloadLog=newProperties();

try{

downloadLog.load(newFileReader(logFile));

}catch(lOExceptione){

e.printStackTrace();

}

)

)

說明:這里使用了Servlet3規(guī)范中的注解來部署過濾器,當(dāng)然也可以在web.xml中使用<hlter>和<filter-mapping>標(biāo)簽部署過濾器,如108題中所

7J\<>

107,監(jiān)聽器有哪些作用和用法?

答:JavaWeb開發(fā)中的監(jiān)聽器(listener)就是application、session、request三個對象創(chuàng)建、銷毀或者往其中添加修改刪除屬性時

自動執(zhí)行代碼的功能組件,如下所示:

?ServletContextListener:對Servlet上下文的創(chuàng)建和銷毀進(jìn)行監(jiān)聽。

?ServletContextAttributeListener:監(jiān)聽Servlet上下文屬性的添加、刪除和替換。

?HttpSessionListener:對Session的創(chuàng)建和銷毀進(jìn)行監(jiān)聽。

補充:session的銷毀有兩種情況:1).session超時(可以在web.xml中通過〈535$20-81169>/<$網(wǎng)5211—奸11^。仇>標(biāo)簽配置超時時間);2).通過

調(diào)用session對象的invalidate。方法使session失效。

?HttpSessionAttributeListener:對Session對象中屬性的添加、刪除和替換進(jìn)行監(jiān)聽。

⑤ServletRequestListener:對請求對象的初始化和銷毀進(jìn)行監(jiān)聽。

?ServletRequestAttributeListener:對請求對象屬性的添加、刪除和替換進(jìn)行監(jiān)聽。

下面是一個統(tǒng)計網(wǎng)站最多在線人數(shù)監(jiān)聽器的例子。

importjavax.servlet.ServletContextEvent;

importjavax.servlet.ServletContextListener;

importjavax?servlet.annotation?WebListener;

/**

上下文監(jiān)聽器,在服務(wù)器啟動時初始化。nLineCount和maxOnLineCount兩個變量

并將其置于服務(wù)器上下文(Servletcontext)中,其初始值都是0

*/

^WebListener

publicclassInitListenerimplementsServletContextListener{

@Override

publicvoidcontextDestroyed(ServletContextEventevt){

)

@Override

publicvoidcontextlnitialized(ServletContextEventevt){

evt.getServletContext().setAttribute("onLineCount",0);

evt.getServletContext(),setAttribute("maxOnLineCount”,0);

}

}

importjava.text.DateFormat;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjavax.servlet,ServletContext;

importjavax.servlet.annotation.WebListener;

importjavax,servlet?http.HttpSessionEvent;

importjavax.servlet.http.HttpSessionListener;

/**

會話監(jiān)聽器,在用戶會話創(chuàng)建和銷毀的時候根據(jù)情況

修改。nLineCount?和maxOnLineCount的值

*/

0WebListener

publicclassMaxCountListenerimplementsHttpSessionListener{

@Override

publicvoidsessionCreated(HttpSessionEventevent){

ServletContextctx=event.getSession().getServletContext();

intcount=Integer.parselnt(ctx.getAttribute("onLineCount").toString());

count++;

ctx.setAttribute("onLineCount",count);

intmaxOnLineCount=Integer.parseInt(ctx.getAttribute("maxOnLineCount").toString());

if(count>maxOnLineCount){

ctx.setAttribute("maxOnLineCount”,count);

DateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");

ctx.setAttribute("date",df.format(newDate()));

)

}

@Override

publicvoidsessionDestroyed(HttpSessionEventevent){

ServletContextapp=event.getSession().getServletContext();

intcount=Integer.parselnt(app.getAttribute("onLineCount").toString());

count——;

app.setAttribute("onLineCount",count);

}

}

說明:這里使用了Servlet3規(guī)范中的@\/\/613U$16(16注解配置監(jiān)聽器,當(dāng)然你可以在web.xml文件中用vlisteneo標(biāo)簽配置監(jiān)聽器,如108題中所

7J\o

108、web.xml文件中可以配置哪些內(nèi)容?

答:web.xml用于配置Web應(yīng)用的相關(guān)信息,如:監(jiān)聽器(listener)、過濾器(filter)、Servlet,相關(guān)參數(shù)、會話超時時間、安全

驗證方式、錯誤頁面等,下面是一些開發(fā)中常見的配置:

①配置Spring上下文加載監(jiān)聽器加載Spring配置文件并創(chuàng)建loC容器:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationcontext.xml</param-value>

</context-param>

<listener>

<listener-class>

org,springframework.web.context?ContextLoaderListener

</listener-class>

</listener>

②配置Spring的OpenSessionlnView過濾器來解決延遲加載和Hibernate會話關(guān)閉的矛盾:

<filter>

<filter-name>openSessionInView</filter-name>

<filter-class>

org?springframework.orm.hibernate3?support?OpenSessionlnViewFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>openSessionInView</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

③配置會話超時時間為10分鐘:

<session-config>

<session-timeout>10</session-timeout>

</session-config>

④配置404和Exception的錯誤頁面:

<error>

<error-code>404</error-code>

<location>/error.jsp</location>

</error>

<error>

<exception-type>java.lang.Exception</exception-type>

<location>/error.jsp</location>

</error>

⑤配置安全認(rèn)證方式:

<security-constraint>

<web-resource-collection>

<web-resource-name>ProtectedArea</web-resource-name>

<url-pattern>/admin/*</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<role-name>admin</role-name>

</auth-constraint>

</security-constraint>

<login-config>

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論