jsp和servlet面试题
生活随笔
收集整理的這篇文章主要介紹了
jsp和servlet面试题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.講下servlet的執(zhí)行流程。doGet和doPost的區(qū)別
? Servlet的執(zhí)行流程也就是servlet的生命周期,當(dāng)服務(wù)器啟動(dòng)的時(shí)候生命周期開(kāi)始,然后通過(guò)init()《啟動(dòng)順序根據(jù)web.xml里的startup-on-load來(lái)確定加載順序》方法初始化servlet,再根據(jù)不同請(qǐng)求調(diào)用doGet或doPost方法,最后再通過(guò)destroy()方法進(jìn)行銷毀。
doGet和doPost都是接受用戶請(qǐng)求的方法,doGet處理get請(qǐng)求,doPost處理post請(qǐng)求,doGet用于地址欄提交,doPost用于表單提交,在頁(yè)面提交數(shù)據(jù)時(shí),get的數(shù)據(jù)大小有限制4k,post沒(méi)有限制,get請(qǐng)求提交的數(shù)據(jù)會(huì)在地址欄顯示,post不顯示,所以post比get安全.
2.當(dāng)service有一個(gè)實(shí)例變量,doGet和doPost去調(diào)用這個(gè)變量,會(huì)出現(xiàn)什么問(wèn)題,你是如何解決的。
會(huì)出現(xiàn)線程不安全問(wèn)題。無(wú)論是doGet還是doPost去調(diào)用,服務(wù)器端處理的過(guò)程都是一樣的,那么我們可以把處理過(guò)程單獨(dú)寫(xiě)在另外一個(gè)方法handle里,讓兩個(gè)方法都去調(diào)用handle,根據(jù)不同請(qǐng)求去調(diào)用不同的方法。
3.有三臺(tái)服務(wù)器,如果在一臺(tái)服務(wù)器上登陸了這個(gè)用戶,其他兩臺(tái)就不能再登陸這個(gè)用戶,使用session共享,你是怎么做的。
把所有的session的數(shù)據(jù)保存到Mysql服務(wù)器上,所有Web服務(wù)器都來(lái)這臺(tái)Mysql服務(wù)器來(lái)獲取Session數(shù)據(jù)。
4.寫(xiě)一個(gè)自定義標(biāo)簽要繼承什么類
SimpleTagSupport,一般調(diào)用doTag方法
或者實(shí)現(xiàn)SimpleTag接口
5.Jsp如何處理json
在 jsp 中處理 JSON,通常需要配套使用 JQuery 控件,并且導(dǎo)入一些 Common jar 包。使用 JQuery 控件是因?yàn)樗苡行У慕馕霾⑶艺故?JSON 數(shù)據(jù),導(dǎo)入Common 則是因?yàn)?Java 中的對(duì)象并不是純粹的數(shù)據(jù),需要通過(guò)這些 Jar 包的處理使之轉(zhuǎn)化成真實(shí)數(shù)據(jù)。
6.如何處理servlet的線程不安全問(wèn)題
線程安全就是多線程操作同一個(gè)對(duì)象不會(huì)有問(wèn)題,線程同步一般來(lái)保護(hù)線程安全,所以可以在Servlet的線程里面加上同步方法或同步塊。(Synchronized)可以保證在同一時(shí)間只有一個(gè)線程訪問(wèn),(使用同步塊會(huì)導(dǎo)致性能變差,最好不去使用實(shí)例變量)
7.Jsp的重定向和轉(zhuǎn)發(fā)的流程有什么區(qū)別
重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器端行為
重定向時(shí)服務(wù)器產(chǎn)生兩次請(qǐng)求,轉(zhuǎn)發(fā)產(chǎn)生一次請(qǐng)求,重定向時(shí)可以轉(zhuǎn)發(fā)到項(xiàng)目以外的任何網(wǎng)址,轉(zhuǎn)發(fā)只能在當(dāng)前項(xiàng)目里轉(zhuǎn)發(fā)
重定向會(huì)導(dǎo)致request對(duì)象信息丟失。轉(zhuǎn)發(fā)則不會(huì)
轉(zhuǎn)發(fā)的url不會(huì)變,request.getRequestDispatch()。forward()
重定向的url會(huì)改變,response.getRedirect();
8.Jsp和servlet的區(qū)別
jsp的可讀性強(qiáng),容易維護(hù),并且jsp在最后會(huì)編譯成servlet
servlet容易調(diào)試
9.下面符合jsp代碼的是:3
1).Var a = document.getElemetnById("id");
2).Var a = document.getElementById("name");
3).If(course("如果是對(duì)的")return false
4).for(int i=0;i<10;i++){}
10.jsp可以操作窗口嗎?
Jsp不能夠直接調(diào)用窗口,只能先 生成打開(kāi)窗口的js,再由js調(diào)用
11.session的主要幾個(gè)方法的區(qū)別
Session不能通過(guò)new創(chuàng)建,需要通過(guò)調(diào)用getSession()或者getSession(true)方法創(chuàng)建,getSession()是自動(dòng)創(chuàng)建session,getSession(true)是強(qiáng)制創(chuàng)建session,setAttribute()方法可以用于傳值,getAttribute()可以用于取值
(第一次創(chuàng)建session的時(shí)候,就是訪問(wèn)第一次一個(gè)jsp頁(yè)面<這個(gè)頁(yè)面的page指令 沒(méi)有設(shè)置session=false>)
銷毀session調(diào)用invalidate方法
通過(guò)setMaxInactiveInterval()可以設(shè)定session的生存時(shí)間(web.xml可以設(shè)置session的生存時(shí)間)
12.jsp的九大內(nèi)置對(duì)象,三大指令,七大動(dòng)作的具體功能
JSP九大內(nèi)置對(duì)象:
pageContext :只對(duì)當(dāng)前jsp頁(yè)面有效,里面封裝了基本的request和session的對(duì)象
Request :對(duì)當(dāng)前請(qǐng)求進(jìn)行封裝
Session :瀏覽器會(huì)話對(duì)象,瀏覽器范圍內(nèi)有效
Application :應(yīng)用程序?qū)ο?#xff0c;對(duì)整個(gè)web工程都有效
Out :頁(yè)面打印對(duì)象,在jsp頁(yè)面打印字符串
Response :返回服務(wù)器端信息給用戶
Config :單個(gè)servlet的配置對(duì)象,相當(dāng)于servletConfig對(duì)象
Page :當(dāng)前頁(yè)面對(duì)象,也就是this
Exception :錯(cuò)誤頁(yè)面的exception對(duì)象,如果指定的是錯(cuò)誤頁(yè)面,這個(gè)就是異常對(duì)象
三大指令:
Page :指令是針對(duì)當(dāng)前頁(yè)面的指令
Include :用于指定如何包含另一個(gè)頁(yè)面
Taglib :用于定義和指定自定義標(biāo)簽
七大動(dòng)作:
Forward,執(zhí)行頁(yè)面跳轉(zhuǎn),將請(qǐng)求的處理轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面
Param :用于傳遞參數(shù)
Include :用于動(dòng)態(tài)引入一個(gè)jsp頁(yè)面
Plugin :用于下載javaBean或applet到客戶端執(zhí)行
useBean :使用javaBean
setProperty :修改javaBean實(shí)例的屬性值
getProperty :獲取javaBean實(shí)例的屬性值
13.獲取頁(yè)面的元素和值有幾種方式,分別說(shuō)一下
request.getParameter() 返回客戶端的請(qǐng)求參數(shù)與值
request.getParameterNames() 返回所有可用屬性名的枚舉
request.getParameterValues() 返回包含參數(shù)的所有值的數(shù)組
14.servlet和javaScript的區(qū)別,他們分別是什么作用
一個(gè)是服務(wù)端,一個(gè)是客戶端
Servlet是獨(dú)立于平臺(tái)和協(xié)議的服務(wù)器端的java應(yīng)用程序,可以動(dòng)態(tài)生成web頁(yè)面,并采用響應(yīng)--請(qǐng)求的模式提供web服務(wù)
javaScript是一種解釋性語(yǔ)言,用于向html頁(yè)面提供交互行為,通常被直接嵌入在html頁(yè)面中
servlet是java語(yǔ)言編寫(xiě)的web應(yīng)用
js是基于html上的一種解釋語(yǔ)言
15.jsp的執(zhí)行原理
?客戶端發(fā)出請(qǐng)求(request),jsp引擎將jsp頁(yè)面翻譯成servlet的java源文件,在Tomcat中將源文件編譯成class文件,并加載到內(nèi)存中執(zhí)行,把結(jié)果返回(response)給客戶端。
16.轉(zhuǎn)發(fā)http請(qǐng)求一般有兩種方法,response.sendRedirect和request.forward。resquest.setAttribute()中設(shè)置的值不會(huì)丟失?(B)
A.sendRedirect B.forward C.兩個(gè)都不能 D.兩個(gè)都可以
17.HTML和Servlet的異同
不同:
Html是靜態(tài),servlet是動(dòng)態(tài)
html頁(yè)面由服務(wù)器直接返回,
servlet是用來(lái)處理客戶請(qǐng)求,并返回html頁(yè)面
//servlet需要服務(wù)器調(diào)用servlet方法生成動(dòng)態(tài)html頁(yè)面,且需要在web.xml中配置url路徑
18.會(huì)話跟蹤有哪些,他們的區(qū)別是什么
Cookie,session和application,
Cookie是http對(duì)象,客戶端與服務(wù)端都可以操縱
cookie是在客戶端保持狀態(tài),session是在服務(wù)器端保持狀態(tài),由于cookie是保存在客戶端本地的,所以數(shù)據(jù)很容易被竊取,當(dāng)訪問(wèn)量很多時(shí),使用session則會(huì)降低服務(wù)器的性能,application的作用域是整個(gè)工程里只有一個(gè),可以在不同瀏覽器之間共享數(shù)據(jù),所有人都可以共享,因此application也是不安全的
19.session和application的作用
Session用于客戶端與服務(wù)器之間保持狀態(tài)的解決方案,數(shù)據(jù)保存在服務(wù)器內(nèi)存中,底層是有cookie實(shí)現(xiàn)的
Application的作用域是整個(gè)工程里只有一個(gè),可以在不同瀏覽器之間共享數(shù)據(jù),所有人都可以共享,因此application是不安全的
20.說(shuō)說(shuō)jsp的隱藏對(duì)象有哪些
Request,out,response , pageContext , session , application , config , page , exception,也即jsp的九大內(nèi)置對(duì)象
21.request ,response,session 和 application是怎么用的
Request是客戶端向服務(wù)端發(fā)送請(qǐng)求
Response是服務(wù)端對(duì)客戶端請(qǐng)求做出響應(yīng)
Session在servlet中不能直接使用,需要通過(guò)getSession()創(chuàng)建,如果沒(méi)有設(shè)定它的生命周期,或者通過(guò)invildate()方法銷毀,關(guān)閉瀏覽器session就會(huì)消失
Application不能直接創(chuàng)建,存在于服務(wù)器的內(nèi)存中,由服務(wù)器創(chuàng)建和銷毀
22.為什么在session少放對(duì)象
因?yàn)閟ession底層是由cookie實(shí)現(xiàn)的,當(dāng)客戶端的cookie被禁用后,session也會(huì)失效,且應(yīng)盡量少向session中保存信息,session的數(shù)據(jù)保存在服務(wù)器端,當(dāng)有大量session時(shí),會(huì)降低服務(wù)器的性能
23.服務(wù)端怎么判斷瀏覽器是否支持cookie
可以使用javaScript的方法navigator.cookieEnabled判斷瀏覽器是否支持cookie
24.Request和session的取值區(qū)別,以及出現(xiàn)亂碼的解決方式(不能在java代碼中設(shè)置)
Request可以通過(guò)getAttribute()方法直接取值,也可通過(guò)getParameter()取值
Session需要通過(guò)request.getSession().getAttribute()才能取值
Request是針對(duì)一次請(qǐng)求,session是針對(duì)整個(gè)會(huì)話
????? 在頁(yè)面通過(guò)contentType,pageEncoding,content設(shè)置編碼格式,必須要一致
25.jsp頁(yè)面跳轉(zhuǎn)
Jsp頁(yè)面跳轉(zhuǎn)有兩種方式,forward和redirect(轉(zhuǎn)發(fā)和重定向)
Forward只能在當(dāng)前項(xiàng)目里跳轉(zhuǎn),只產(chǎn)生一次請(qǐng)求,request保存的變量不會(huì)丟失,url地址不會(huì)改變
Redirect可跳轉(zhuǎn)到項(xiàng)目以外的任何頁(yè)面,產(chǎn)生兩次請(qǐng)求,request保存的變量會(huì)全部丟失,url地址會(huì)發(fā)生改變,變化為第二個(gè)請(qǐng)求的地址
26說(shuō)出jsp內(nèi)置對(duì)象以及方法
Request:客戶端發(fā)送請(qǐng)求
setCharacterEncoding(String arg0):設(shè)置編碼格式
getCharacterEncoding():獲取編碼格式
getRequestDispatcher(String path):返回一個(gè)RequestDispatcher對(duì)象
Response:服務(wù)器端返回信息給用戶
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
setCharacterEncoding(String charset):設(shè)置編碼格式
getCharacterEncoding():獲取編碼格式
sendRedirect(String location):返回對(duì)包裝的響應(yīng)對(duì)象調(diào)用
pageContext:網(wǎng)頁(yè)的屬性是在這里管理的
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
Session:與請(qǐng)求有關(guān)的會(huì)話期
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
invalidate():使當(dāng)前會(huì)話失效
setMaxInactiveInterval():指定在Servlet容器使此會(huì)話失效之前客戶端請(qǐng)求之間的時(shí)間間隔,以秒為單位。負(fù)數(shù)時(shí)間指示會(huì)話永遠(yuǎn)不會(huì)超時(shí)
getMaxInactivelnterval():返回servlet 容器在客戶端訪問(wèn)之間將使此會(huì)話保持打開(kāi)狀態(tài)的最大時(shí)間間隔,以秒為單位。在此間隔之后,servlet 容器將使會(huì)話無(wú)效
Application:Servlet正在執(zhí)行的內(nèi)容
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
Out:用來(lái)傳送回應(yīng)的輸出
print():打印信息
println():換行打印信息
Config:Servlet的構(gòu)架部件
getInitParameter(String paramNarne):從web.xml中獲取指定名稱的值
getInitParameterNames():從web.xml中獲取所有的名稱
Page:JSP頁(yè)面本身
Exception:針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外
getMessage():返回異常的詳細(xì)信息
getClass():返回異常的名稱
27.有幾種方式將頁(yè)面的值傳到后臺(tái)
可通過(guò)form表單的get或post將值傳遞到后臺(tái),也可通過(guò)setAttribute()方法將值傳遞到后臺(tái)
28.一個(gè)form表單的值如何獲取
在servlet中通過(guò)request.getParameter()方法可以獲取表單的值
或者是request.getParameterValuse();
29.傳遞參數(shù)到后臺(tái)有幾種方式
表單傳參,url傳參,jquery.ajax傳參
30.Jsp中父頁(yè)面中怎么拿到子頁(yè)面的表單元素,不是拿值怎么拿
通過(guò)設(shè)置屬性setAttribute(),通過(guò)getAttribute()拿值,getParameter()方法可以做到
31.定義一個(gè)String類型的字符串,如果重定向之后還能不能獲得這個(gè)數(shù)據(jù)
不能
32.404和500是什么意思
404 :找不到url請(qǐng)求的路徑,一般是工程名不對(duì)或者拼寫(xiě)錯(cuò)誤
500 :服務(wù)器內(nèi)部錯(cuò)誤,一般是服務(wù)器內(nèi)部代碼編寫(xiě)錯(cuò)誤,也有可能是拋異常導(dǎo)致
33.寫(xiě)出5種JSTL常用標(biāo)簽
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
34.在項(xiàng)目名和頁(yè)面路徑都沒(méi)有錯(cuò)的情況下為什么會(huì)報(bào)404錯(cuò)誤,它有什么原理在里面
工程名不對(duì)或者拼寫(xiě)錯(cuò)誤,404錯(cuò)誤一般是找不到客戶端請(qǐng)求的文件
35.說(shuō)出servlet的生命周期
當(dāng)web服務(wù)器啟動(dòng)的時(shí)候,servlet生命周期開(kāi)始,通過(guò)init方法初始化servlet,通過(guò)不同的請(qǐng)求調(diào)用doGet或doPost方法,最后通過(guò)destroy()方法進(jìn)行銷毀
36.Jsp頁(yè)面把一個(gè)元素隱藏的方法
通過(guò)使用屬性hidden可以將元素隱藏
37.Session,application,cookie的區(qū)別
Session不能通過(guò)new創(chuàng)建,要通過(guò)調(diào)用getSession()方法創(chuàng)建,數(shù)據(jù)保存在服務(wù)器端,單個(gè)客戶端session是共享的,底層是由cookie實(shí)現(xiàn)的,大小沒(méi)有限制
Application的作用域是整個(gè)工程只有共享一個(gè),生命周期比session大
Cookie需要通過(guò)new創(chuàng)建,數(shù)據(jù)保存在客戶端中,cookie保存的數(shù)據(jù)不能超過(guò)4k,不安全
38.我們?cè)趙eb應(yīng)用開(kāi)發(fā)過(guò)程中經(jīng)常遇到輸出某種編碼的字符,如ISO-8859-1,如何輸出一個(gè)某種編碼的字符串
如將ISO-8859-1輸出為GBK格式的字符, 通過(guò)new String(byte[] bytes,String charset) 構(gòu)造器設(shè)置編碼構(gòu)造一個(gè)新的String(new String("ISO-8859-1","GBK"));
39.Jsp里有那些標(biāo)簽
jsp:include等
40.怎么判斷用戶請(qǐng)求時(shí)是第一次,如果客戶端和服務(wù)端斷開(kāi)怎么連到上一次操作
通過(guò)session中的isNew()可以判斷是否是新用戶
41.請(qǐng)說(shuō)下會(huì)話跟蹤技術(shù)
會(huì)話跟蹤技術(shù)是用于維持客戶端和服務(wù)器端通信的技術(shù)。
通過(guò)session,cookie或者application可實(shí)現(xiàn)會(huì)話跟蹤
42.如果創(chuàng)建servlet實(shí)例不用構(gòu)造方法,怎么創(chuàng)建一個(gè)servlet實(shí)例
Web容器會(huì)自動(dòng)為servlet寫(xiě)一個(gè)無(wú)參的構(gòu)造器,它使用class.forName("").newInstance()反射來(lái)創(chuàng)建servlet實(shí)例的
43.Servlet是安全的嗎?當(dāng)service有一個(gè)實(shí)例變量,doGet和doPost去調(diào)用這個(gè)變量,會(huì)出現(xiàn)什么問(wèn)題,你是如何解決的
是線程不安全的,因?yàn)閟ervlet是單例模式,當(dāng)多個(gè)客戶端共同訪問(wèn)的時(shí)候線程不安全。
盡量用局部變量,同步塊,如果當(dāng)前字段是不會(huì)改變的,用final修飾
44.Servlet和過(guò)濾器的區(qū)別
Servlet:是用來(lái)處理客戶端發(fā)送的請(qǐng)求,然后生成響應(yīng)并將其傳給server服務(wù)器,
最后服務(wù)器將響應(yīng)返回給客戶端
過(guò)濾器:是用于 對(duì)servlet容器調(diào)用servlet的過(guò)程進(jìn)行攔截
可以在servlet進(jìn)行響應(yīng)處理前后做一些特殊的處理
45說(shuō)明一下jsp中<jsp: include page..>和<%@ include file%>的區(qū)別
<jsp:include page=""/> 動(dòng)態(tài)導(dǎo)入
? 是行為元素、是在請(qǐng)求處理階段引入的,引入執(zhí)行頁(yè)面或servlet所生成的應(yīng)答文本
先編譯,后包含,就是將每個(gè)jsp頁(yè)面都單獨(dú)轉(zhuǎn)化成html頁(yè)面,最后再將所有的html頁(yè)面相加,如果有相同變量不會(huì)沖突
<%@ include file="" %> 靜態(tài)導(dǎo)入
是指令元素
是編譯時(shí)包含,引入靜態(tài)文本(html,jsp),在JSP頁(yè)面被轉(zhuǎn)化成servlet之前和它融和到一起。先包含,后編譯
就是將多個(gè)jsp一起解析,最后再一起生成html頁(yè)面,如果有相同變量會(huì)沖突
46. pageContext有什么作用
可以使用pageContext對(duì)象來(lái)設(shè)定屬性,并指定屬性的作用范圍,提供了對(duì)JSP頁(yè)面內(nèi)所有的對(duì)象及名字空間的訪問(wèn)
48.Servlet是單例還是多例
是單例的,可以提高性能
49.Filter與攔截器怎么執(zhí)行的
首先初始化過(guò)濾器,然后服務(wù)器組織過(guò)濾器鏈,所有的請(qǐng)求都必須需要先通過(guò)過(guò)濾器鏈,
過(guò)濾器鏈?zhǔn)且粋€(gè)棧,遵循先進(jìn)后出的原則 ,所有的請(qǐng)求需要經(jīng)過(guò)一個(gè)一個(gè)的過(guò)濾器,執(zhí)行順序要根據(jù)web.xml里配置的<filter-mapping>的位置前后執(zhí)行,每個(gè)過(guò)濾器之間通過(guò)chain.doFilter連接, 最后抵達(dá)真正請(qǐng)求的資源,執(zhí)行完后再?gòu)倪^(guò)濾器鏈退出
50.Jsp中如何進(jìn)行分頁(yè),項(xiàng)目中如何進(jìn)行分頁(yè)?
需要上一頁(yè)和下一頁(yè)的超鏈接(至少需要這兩個(gè)),通過(guò)計(jì)算當(dāng)前頁(yè)的頁(yè)碼獲取下一頁(yè)數(shù)據(jù)
的起始位置,然后在 MySql 中查詢,如果使用 Oracle 則需要另外計(jì)算下一頁(yè)數(shù)據(jù)的結(jié)
束位置。
使用hibernate框架,它可以針對(duì)不同的數(shù)據(jù)庫(kù)自動(dòng)產(chǎn)生為你分頁(yè)的代碼。
? Servlet的執(zhí)行流程也就是servlet的生命周期,當(dāng)服務(wù)器啟動(dòng)的時(shí)候生命周期開(kāi)始,然后通過(guò)init()《啟動(dòng)順序根據(jù)web.xml里的startup-on-load來(lái)確定加載順序》方法初始化servlet,再根據(jù)不同請(qǐng)求調(diào)用doGet或doPost方法,最后再通過(guò)destroy()方法進(jìn)行銷毀。
doGet和doPost都是接受用戶請(qǐng)求的方法,doGet處理get請(qǐng)求,doPost處理post請(qǐng)求,doGet用于地址欄提交,doPost用于表單提交,在頁(yè)面提交數(shù)據(jù)時(shí),get的數(shù)據(jù)大小有限制4k,post沒(méi)有限制,get請(qǐng)求提交的數(shù)據(jù)會(huì)在地址欄顯示,post不顯示,所以post比get安全.
2.當(dāng)service有一個(gè)實(shí)例變量,doGet和doPost去調(diào)用這個(gè)變量,會(huì)出現(xiàn)什么問(wèn)題,你是如何解決的。
會(huì)出現(xiàn)線程不安全問(wèn)題。無(wú)論是doGet還是doPost去調(diào)用,服務(wù)器端處理的過(guò)程都是一樣的,那么我們可以把處理過(guò)程單獨(dú)寫(xiě)在另外一個(gè)方法handle里,讓兩個(gè)方法都去調(diào)用handle,根據(jù)不同請(qǐng)求去調(diào)用不同的方法。
3.有三臺(tái)服務(wù)器,如果在一臺(tái)服務(wù)器上登陸了這個(gè)用戶,其他兩臺(tái)就不能再登陸這個(gè)用戶,使用session共享,你是怎么做的。
把所有的session的數(shù)據(jù)保存到Mysql服務(wù)器上,所有Web服務(wù)器都來(lái)這臺(tái)Mysql服務(wù)器來(lái)獲取Session數(shù)據(jù)。
4.寫(xiě)一個(gè)自定義標(biāo)簽要繼承什么類
SimpleTagSupport,一般調(diào)用doTag方法
或者實(shí)現(xiàn)SimpleTag接口
5.Jsp如何處理json
在 jsp 中處理 JSON,通常需要配套使用 JQuery 控件,并且導(dǎo)入一些 Common jar 包。使用 JQuery 控件是因?yàn)樗苡行У慕馕霾⑶艺故?JSON 數(shù)據(jù),導(dǎo)入Common 則是因?yàn)?Java 中的對(duì)象并不是純粹的數(shù)據(jù),需要通過(guò)這些 Jar 包的處理使之轉(zhuǎn)化成真實(shí)數(shù)據(jù)。
6.如何處理servlet的線程不安全問(wèn)題
線程安全就是多線程操作同一個(gè)對(duì)象不會(huì)有問(wèn)題,線程同步一般來(lái)保護(hù)線程安全,所以可以在Servlet的線程里面加上同步方法或同步塊。(Synchronized)可以保證在同一時(shí)間只有一個(gè)線程訪問(wèn),(使用同步塊會(huì)導(dǎo)致性能變差,最好不去使用實(shí)例變量)
7.Jsp的重定向和轉(zhuǎn)發(fā)的流程有什么區(qū)別
重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器端行為
重定向時(shí)服務(wù)器產(chǎn)生兩次請(qǐng)求,轉(zhuǎn)發(fā)產(chǎn)生一次請(qǐng)求,重定向時(shí)可以轉(zhuǎn)發(fā)到項(xiàng)目以外的任何網(wǎng)址,轉(zhuǎn)發(fā)只能在當(dāng)前項(xiàng)目里轉(zhuǎn)發(fā)
重定向會(huì)導(dǎo)致request對(duì)象信息丟失。轉(zhuǎn)發(fā)則不會(huì)
轉(zhuǎn)發(fā)的url不會(huì)變,request.getRequestDispatch()。forward()
重定向的url會(huì)改變,response.getRedirect();
8.Jsp和servlet的區(qū)別
jsp的可讀性強(qiáng),容易維護(hù),并且jsp在最后會(huì)編譯成servlet
servlet容易調(diào)試
9.下面符合jsp代碼的是:3
1).Var a = document.getElemetnById("id");
2).Var a = document.getElementById("name");
3).If(course("如果是對(duì)的")return false
4).for(int i=0;i<10;i++){}
10.jsp可以操作窗口嗎?
Jsp不能夠直接調(diào)用窗口,只能先 生成打開(kāi)窗口的js,再由js調(diào)用
11.session的主要幾個(gè)方法的區(qū)別
Session不能通過(guò)new創(chuàng)建,需要通過(guò)調(diào)用getSession()或者getSession(true)方法創(chuàng)建,getSession()是自動(dòng)創(chuàng)建session,getSession(true)是強(qiáng)制創(chuàng)建session,setAttribute()方法可以用于傳值,getAttribute()可以用于取值
(第一次創(chuàng)建session的時(shí)候,就是訪問(wèn)第一次一個(gè)jsp頁(yè)面<這個(gè)頁(yè)面的page指令 沒(méi)有設(shè)置session=false>)
銷毀session調(diào)用invalidate方法
通過(guò)setMaxInactiveInterval()可以設(shè)定session的生存時(shí)間(web.xml可以設(shè)置session的生存時(shí)間)
12.jsp的九大內(nèi)置對(duì)象,三大指令,七大動(dòng)作的具體功能
JSP九大內(nèi)置對(duì)象:
pageContext :只對(duì)當(dāng)前jsp頁(yè)面有效,里面封裝了基本的request和session的對(duì)象
Request :對(duì)當(dāng)前請(qǐng)求進(jìn)行封裝
Session :瀏覽器會(huì)話對(duì)象,瀏覽器范圍內(nèi)有效
Application :應(yīng)用程序?qū)ο?#xff0c;對(duì)整個(gè)web工程都有效
Out :頁(yè)面打印對(duì)象,在jsp頁(yè)面打印字符串
Response :返回服務(wù)器端信息給用戶
Config :單個(gè)servlet的配置對(duì)象,相當(dāng)于servletConfig對(duì)象
Page :當(dāng)前頁(yè)面對(duì)象,也就是this
Exception :錯(cuò)誤頁(yè)面的exception對(duì)象,如果指定的是錯(cuò)誤頁(yè)面,這個(gè)就是異常對(duì)象
三大指令:
Page :指令是針對(duì)當(dāng)前頁(yè)面的指令
Include :用于指定如何包含另一個(gè)頁(yè)面
Taglib :用于定義和指定自定義標(biāo)簽
七大動(dòng)作:
Forward,執(zhí)行頁(yè)面跳轉(zhuǎn),將請(qǐng)求的處理轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面
Param :用于傳遞參數(shù)
Include :用于動(dòng)態(tài)引入一個(gè)jsp頁(yè)面
Plugin :用于下載javaBean或applet到客戶端執(zhí)行
useBean :使用javaBean
setProperty :修改javaBean實(shí)例的屬性值
getProperty :獲取javaBean實(shí)例的屬性值
13.獲取頁(yè)面的元素和值有幾種方式,分別說(shuō)一下
request.getParameter() 返回客戶端的請(qǐng)求參數(shù)與值
request.getParameterNames() 返回所有可用屬性名的枚舉
request.getParameterValues() 返回包含參數(shù)的所有值的數(shù)組
14.servlet和javaScript的區(qū)別,他們分別是什么作用
一個(gè)是服務(wù)端,一個(gè)是客戶端
Servlet是獨(dú)立于平臺(tái)和協(xié)議的服務(wù)器端的java應(yīng)用程序,可以動(dòng)態(tài)生成web頁(yè)面,并采用響應(yīng)--請(qǐng)求的模式提供web服務(wù)
javaScript是一種解釋性語(yǔ)言,用于向html頁(yè)面提供交互行為,通常被直接嵌入在html頁(yè)面中
servlet是java語(yǔ)言編寫(xiě)的web應(yīng)用
js是基于html上的一種解釋語(yǔ)言
15.jsp的執(zhí)行原理
?客戶端發(fā)出請(qǐng)求(request),jsp引擎將jsp頁(yè)面翻譯成servlet的java源文件,在Tomcat中將源文件編譯成class文件,并加載到內(nèi)存中執(zhí)行,把結(jié)果返回(response)給客戶端。
16.轉(zhuǎn)發(fā)http請(qǐng)求一般有兩種方法,response.sendRedirect和request.forward。resquest.setAttribute()中設(shè)置的值不會(huì)丟失?(B)
A.sendRedirect B.forward C.兩個(gè)都不能 D.兩個(gè)都可以
17.HTML和Servlet的異同
不同:
Html是靜態(tài),servlet是動(dòng)態(tài)
html頁(yè)面由服務(wù)器直接返回,
servlet是用來(lái)處理客戶請(qǐng)求,并返回html頁(yè)面
//servlet需要服務(wù)器調(diào)用servlet方法生成動(dòng)態(tài)html頁(yè)面,且需要在web.xml中配置url路徑
18.會(huì)話跟蹤有哪些,他們的區(qū)別是什么
Cookie,session和application,
Cookie是http對(duì)象,客戶端與服務(wù)端都可以操縱
cookie是在客戶端保持狀態(tài),session是在服務(wù)器端保持狀態(tài),由于cookie是保存在客戶端本地的,所以數(shù)據(jù)很容易被竊取,當(dāng)訪問(wèn)量很多時(shí),使用session則會(huì)降低服務(wù)器的性能,application的作用域是整個(gè)工程里只有一個(gè),可以在不同瀏覽器之間共享數(shù)據(jù),所有人都可以共享,因此application也是不安全的
19.session和application的作用
Session用于客戶端與服務(wù)器之間保持狀態(tài)的解決方案,數(shù)據(jù)保存在服務(wù)器內(nèi)存中,底層是有cookie實(shí)現(xiàn)的
Application的作用域是整個(gè)工程里只有一個(gè),可以在不同瀏覽器之間共享數(shù)據(jù),所有人都可以共享,因此application是不安全的
20.說(shuō)說(shuō)jsp的隱藏對(duì)象有哪些
Request,out,response , pageContext , session , application , config , page , exception,也即jsp的九大內(nèi)置對(duì)象
21.request ,response,session 和 application是怎么用的
Request是客戶端向服務(wù)端發(fā)送請(qǐng)求
Response是服務(wù)端對(duì)客戶端請(qǐng)求做出響應(yīng)
Session在servlet中不能直接使用,需要通過(guò)getSession()創(chuàng)建,如果沒(méi)有設(shè)定它的生命周期,或者通過(guò)invildate()方法銷毀,關(guān)閉瀏覽器session就會(huì)消失
Application不能直接創(chuàng)建,存在于服務(wù)器的內(nèi)存中,由服務(wù)器創(chuàng)建和銷毀
22.為什么在session少放對(duì)象
因?yàn)閟ession底層是由cookie實(shí)現(xiàn)的,當(dāng)客戶端的cookie被禁用后,session也會(huì)失效,且應(yīng)盡量少向session中保存信息,session的數(shù)據(jù)保存在服務(wù)器端,當(dāng)有大量session時(shí),會(huì)降低服務(wù)器的性能
23.服務(wù)端怎么判斷瀏覽器是否支持cookie
可以使用javaScript的方法navigator.cookieEnabled判斷瀏覽器是否支持cookie
24.Request和session的取值區(qū)別,以及出現(xiàn)亂碼的解決方式(不能在java代碼中設(shè)置)
Request可以通過(guò)getAttribute()方法直接取值,也可通過(guò)getParameter()取值
Session需要通過(guò)request.getSession().getAttribute()才能取值
Request是針對(duì)一次請(qǐng)求,session是針對(duì)整個(gè)會(huì)話
????? 在頁(yè)面通過(guò)contentType,pageEncoding,content設(shè)置編碼格式,必須要一致
25.jsp頁(yè)面跳轉(zhuǎn)
Jsp頁(yè)面跳轉(zhuǎn)有兩種方式,forward和redirect(轉(zhuǎn)發(fā)和重定向)
Forward只能在當(dāng)前項(xiàng)目里跳轉(zhuǎn),只產(chǎn)生一次請(qǐng)求,request保存的變量不會(huì)丟失,url地址不會(huì)改變
Redirect可跳轉(zhuǎn)到項(xiàng)目以外的任何頁(yè)面,產(chǎn)生兩次請(qǐng)求,request保存的變量會(huì)全部丟失,url地址會(huì)發(fā)生改變,變化為第二個(gè)請(qǐng)求的地址
26說(shuō)出jsp內(nèi)置對(duì)象以及方法
Request:客戶端發(fā)送請(qǐng)求
setCharacterEncoding(String arg0):設(shè)置編碼格式
getCharacterEncoding():獲取編碼格式
getRequestDispatcher(String path):返回一個(gè)RequestDispatcher對(duì)象
Response:服務(wù)器端返回信息給用戶
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
setCharacterEncoding(String charset):設(shè)置編碼格式
getCharacterEncoding():獲取編碼格式
sendRedirect(String location):返回對(duì)包裝的響應(yīng)對(duì)象調(diào)用
pageContext:網(wǎng)頁(yè)的屬性是在這里管理的
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
Session:與請(qǐng)求有關(guān)的會(huì)話期
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
getAttributeNames():返回所有可用屬性名的枚舉
invalidate():使當(dāng)前會(huì)話失效
setMaxInactiveInterval():指定在Servlet容器使此會(huì)話失效之前客戶端請(qǐng)求之間的時(shí)間間隔,以秒為單位。負(fù)數(shù)時(shí)間指示會(huì)話永遠(yuǎn)不會(huì)超時(shí)
getMaxInactivelnterval():返回servlet 容器在客戶端訪問(wèn)之間將使此會(huì)話保持打開(kāi)狀態(tài)的最大時(shí)間間隔,以秒為單位。在此間隔之后,servlet 容器將使會(huì)話無(wú)效
Application:Servlet正在執(zhí)行的內(nèi)容
setAttribute("name",Object obj):設(shè)置名字為name的request參數(shù)的值,該值是由Object類型的obj指定
getAttribute("name"):返回name屬性值
Out:用來(lái)傳送回應(yīng)的輸出
print():打印信息
println():換行打印信息
Config:Servlet的構(gòu)架部件
getInitParameter(String paramNarne):從web.xml中獲取指定名稱的值
getInitParameterNames():從web.xml中獲取所有的名稱
Page:JSP頁(yè)面本身
Exception:針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外
getMessage():返回異常的詳細(xì)信息
getClass():返回異常的名稱
27.有幾種方式將頁(yè)面的值傳到后臺(tái)
可通過(guò)form表單的get或post將值傳遞到后臺(tái),也可通過(guò)setAttribute()方法將值傳遞到后臺(tái)
28.一個(gè)form表單的值如何獲取
在servlet中通過(guò)request.getParameter()方法可以獲取表單的值
或者是request.getParameterValuse();
29.傳遞參數(shù)到后臺(tái)有幾種方式
表單傳參,url傳參,jquery.ajax傳參
30.Jsp中父頁(yè)面中怎么拿到子頁(yè)面的表單元素,不是拿值怎么拿
通過(guò)設(shè)置屬性setAttribute(),通過(guò)getAttribute()拿值,getParameter()方法可以做到
31.定義一個(gè)String類型的字符串,如果重定向之后還能不能獲得這個(gè)數(shù)據(jù)
不能
32.404和500是什么意思
404 :找不到url請(qǐng)求的路徑,一般是工程名不對(duì)或者拼寫(xiě)錯(cuò)誤
500 :服務(wù)器內(nèi)部錯(cuò)誤,一般是服務(wù)器內(nèi)部代碼編寫(xiě)錯(cuò)誤,也有可能是拋異常導(dǎo)致
33.寫(xiě)出5種JSTL常用標(biāo)簽
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
34.在項(xiàng)目名和頁(yè)面路徑都沒(méi)有錯(cuò)的情況下為什么會(huì)報(bào)404錯(cuò)誤,它有什么原理在里面
工程名不對(duì)或者拼寫(xiě)錯(cuò)誤,404錯(cuò)誤一般是找不到客戶端請(qǐng)求的文件
35.說(shuō)出servlet的生命周期
當(dāng)web服務(wù)器啟動(dòng)的時(shí)候,servlet生命周期開(kāi)始,通過(guò)init方法初始化servlet,通過(guò)不同的請(qǐng)求調(diào)用doGet或doPost方法,最后通過(guò)destroy()方法進(jìn)行銷毀
36.Jsp頁(yè)面把一個(gè)元素隱藏的方法
通過(guò)使用屬性hidden可以將元素隱藏
37.Session,application,cookie的區(qū)別
Session不能通過(guò)new創(chuàng)建,要通過(guò)調(diào)用getSession()方法創(chuàng)建,數(shù)據(jù)保存在服務(wù)器端,單個(gè)客戶端session是共享的,底層是由cookie實(shí)現(xiàn)的,大小沒(méi)有限制
Application的作用域是整個(gè)工程只有共享一個(gè),生命周期比session大
Cookie需要通過(guò)new創(chuàng)建,數(shù)據(jù)保存在客戶端中,cookie保存的數(shù)據(jù)不能超過(guò)4k,不安全
38.我們?cè)趙eb應(yīng)用開(kāi)發(fā)過(guò)程中經(jīng)常遇到輸出某種編碼的字符,如ISO-8859-1,如何輸出一個(gè)某種編碼的字符串
如將ISO-8859-1輸出為GBK格式的字符, 通過(guò)new String(byte[] bytes,String charset) 構(gòu)造器設(shè)置編碼構(gòu)造一個(gè)新的String(new String("ISO-8859-1","GBK"));
39.Jsp里有那些標(biāo)簽
jsp:include等
40.怎么判斷用戶請(qǐng)求時(shí)是第一次,如果客戶端和服務(wù)端斷開(kāi)怎么連到上一次操作
通過(guò)session中的isNew()可以判斷是否是新用戶
41.請(qǐng)說(shuō)下會(huì)話跟蹤技術(shù)
會(huì)話跟蹤技術(shù)是用于維持客戶端和服務(wù)器端通信的技術(shù)。
通過(guò)session,cookie或者application可實(shí)現(xiàn)會(huì)話跟蹤
42.如果創(chuàng)建servlet實(shí)例不用構(gòu)造方法,怎么創(chuàng)建一個(gè)servlet實(shí)例
Web容器會(huì)自動(dòng)為servlet寫(xiě)一個(gè)無(wú)參的構(gòu)造器,它使用class.forName("").newInstance()反射來(lái)創(chuàng)建servlet實(shí)例的
43.Servlet是安全的嗎?當(dāng)service有一個(gè)實(shí)例變量,doGet和doPost去調(diào)用這個(gè)變量,會(huì)出現(xiàn)什么問(wèn)題,你是如何解決的
是線程不安全的,因?yàn)閟ervlet是單例模式,當(dāng)多個(gè)客戶端共同訪問(wèn)的時(shí)候線程不安全。
盡量用局部變量,同步塊,如果當(dāng)前字段是不會(huì)改變的,用final修飾
44.Servlet和過(guò)濾器的區(qū)別
Servlet:是用來(lái)處理客戶端發(fā)送的請(qǐng)求,然后生成響應(yīng)并將其傳給server服務(wù)器,
最后服務(wù)器將響應(yīng)返回給客戶端
過(guò)濾器:是用于 對(duì)servlet容器調(diào)用servlet的過(guò)程進(jìn)行攔截
可以在servlet進(jìn)行響應(yīng)處理前后做一些特殊的處理
45說(shuō)明一下jsp中<jsp: include page..>和<%@ include file%>的區(qū)別
<jsp:include page=""/> 動(dòng)態(tài)導(dǎo)入
? 是行為元素、是在請(qǐng)求處理階段引入的,引入執(zhí)行頁(yè)面或servlet所生成的應(yīng)答文本
先編譯,后包含,就是將每個(gè)jsp頁(yè)面都單獨(dú)轉(zhuǎn)化成html頁(yè)面,最后再將所有的html頁(yè)面相加,如果有相同變量不會(huì)沖突
<%@ include file="" %> 靜態(tài)導(dǎo)入
是指令元素
是編譯時(shí)包含,引入靜態(tài)文本(html,jsp),在JSP頁(yè)面被轉(zhuǎn)化成servlet之前和它融和到一起。先包含,后編譯
就是將多個(gè)jsp一起解析,最后再一起生成html頁(yè)面,如果有相同變量會(huì)沖突
46. pageContext有什么作用
可以使用pageContext對(duì)象來(lái)設(shè)定屬性,并指定屬性的作用范圍,提供了對(duì)JSP頁(yè)面內(nèi)所有的對(duì)象及名字空間的訪問(wèn)
48.Servlet是單例還是多例
是單例的,可以提高性能
49.Filter與攔截器怎么執(zhí)行的
首先初始化過(guò)濾器,然后服務(wù)器組織過(guò)濾器鏈,所有的請(qǐng)求都必須需要先通過(guò)過(guò)濾器鏈,
過(guò)濾器鏈?zhǔn)且粋€(gè)棧,遵循先進(jìn)后出的原則 ,所有的請(qǐng)求需要經(jīng)過(guò)一個(gè)一個(gè)的過(guò)濾器,執(zhí)行順序要根據(jù)web.xml里配置的<filter-mapping>的位置前后執(zhí)行,每個(gè)過(guò)濾器之間通過(guò)chain.doFilter連接, 最后抵達(dá)真正請(qǐng)求的資源,執(zhí)行完后再?gòu)倪^(guò)濾器鏈退出
50.Jsp中如何進(jìn)行分頁(yè),項(xiàng)目中如何進(jìn)行分頁(yè)?
需要上一頁(yè)和下一頁(yè)的超鏈接(至少需要這兩個(gè)),通過(guò)計(jì)算當(dāng)前頁(yè)的頁(yè)碼獲取下一頁(yè)數(shù)據(jù)
的起始位置,然后在 MySql 中查詢,如果使用 Oracle 則需要另外計(jì)算下一頁(yè)數(shù)據(jù)的結(jié)
束位置。
使用hibernate框架,它可以針對(duì)不同的數(shù)據(jù)庫(kù)自動(dòng)產(chǎn)生為你分頁(yè)的代碼。
總結(jié)
以上是生活随笔為你收集整理的jsp和servlet面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个风骚的C语言操作
- 下一篇: 当你使用微信和QQ的时候,请不要忘记IC