版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年溫州醫(yī)科大學(xué)仁濟(jì)學(xué)院單招職業(yè)傾向性測試模擬測試卷新版
- 2026年宜賓國企招聘經(jīng)營層管理人員備考題庫帶答案詳解
- 2026年許昌職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫新版
- 2026年甘孜職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試模擬測試卷必考題
- 2026年塔城地區(qū)水務(wù)集團(tuán)有限公司招聘備考題庫及完整答案詳解一套
- 2026年四川省岳池銀泰投資(控股)有限公司公開招聘急需緊缺專業(yè)人才備考題庫含答案詳解
- 2026年安陽市第二實驗中學(xué)招聘代課教師備考題庫及參考答案詳解
- 2026年恒豐銀行廣州分行社會招聘備考題庫完整答案詳解
- 2026年浙江省湖州市單招職業(yè)適應(yīng)性測試模擬測試卷新版
- 2026年海南歷年單招試題新版
- 肺癌中西醫(yī)結(jié)合診療指南
- 2024年居間服務(wù)合同:律師事務(wù)所合作與業(yè)務(wù)推廣
- 全球變暖課件高級
- 農(nóng)貿(mào)市場保潔服務(wù) 投標(biāo)方案(技術(shù)標(biāo) )
- 合作的合同書模板
- (正式版)FZ∕T 13061-2024 燈芯絨棉本色布
- 0.4kV配網(wǎng)不停電作業(yè)用工器具技術(shù)條件V11
- 滿腹經(jīng)綸相聲臺詞完整篇
- 2023年10月自考05678金融法試題及答案含評分標(biāo)準(zhǔn)
- 新蘇教版六年級科學(xué)上冊第一單元《物質(zhì)的變化》全部教案
- 城鎮(zhèn)道路工程施工與質(zhì)量驗收規(guī)范CJJ解析及質(zhì)量控制點
評論
0/150
提交評論