50个Servlet面试问答
Servlet是Java EE的一個(gè)非常重要的主題,所有Web應(yīng)用程序框架(例如Spring和Struts)都建立在它之上。 這使servlet成為Java訪談中的熱門話題。
在這里,我提供了50個(gè)servlet面試問題的列表,并提供了答案,以幫助您解決與Java中的servlet和Web應(yīng)用程序有關(guān)的大多數(shù)面試問題。
Web服務(wù)器和應(yīng)用程序服務(wù)器之間有什么區(qū)別?
Web服務(wù)器的職責(zé)是處理來(lái)自客戶端瀏覽器的HTTP請(qǐng)求并以HTML響應(yīng)進(jìn)行響應(yīng)。 Web服務(wù)器可以理解HTTP語(yǔ)言并可以在HTTP協(xié)議上運(yùn)行。
Apache Web Server是一種Web服務(wù)器,然后我們有可以執(zhí)行servlet和JSP(稱為servlet容器)的特定容器,例如Tomcat。
Application Server提供了其他功能,例如Enterprise JavaBeans支持,JMS Messaging支持,事務(wù)管理等。因此,可以說(shuō)Application Server是一個(gè)Web服務(wù)器,它具有其他功能來(lái)幫助開發(fā)人員使用企業(yè)應(yīng)用程序。
哪種HTTP方法不是冪等的?
如果HTTP方法每次都返回相同的結(jié)果,則它被認(rèn)為是冪等的。 HTTP方法GET,PUT,DELETE,HEAD和OPTIONS是冪等方法,我們應(yīng)該實(shí)現(xiàn)應(yīng)用程序以確保這些方法始終返回相同的結(jié)果。 HTTP方法POST是非冪等方法,在實(shí)現(xiàn)隨每個(gè)請(qǐng)求更改的內(nèi)容時(shí),我們應(yīng)該使用post方法。
例如,要訪問HTML頁(yè)面或圖像,我們應(yīng)該使用GET,因?yàn)樗鼘⑹冀K返回相同的對(duì)象,但是如果我們必須將客戶信息保存到數(shù)據(jù)庫(kù)中,則應(yīng)該使用POST方法。 冪等方法也稱為安全方法,我們不在乎客戶端對(duì)安全方法的重復(fù)請(qǐng)求。
GET和POST方法有什么區(qū)別?
- GET是一種安全的方法(冪等),其中POST是非冪等方法。
- 我們可以使用GET方法發(fā)送有限的數(shù)據(jù),并將其發(fā)送到標(biāo)頭請(qǐng)求URL中,而我們可以使用POST發(fā)送大量數(shù)據(jù),因?yàn)樗钦牡囊徊糠帧?
- GET方法不安全,因?yàn)閿?shù)據(jù)在URL中公開,我們可以輕松地對(duì)其添加書簽并再次發(fā)送類似的請(qǐng)求,而POST是安全的,因?yàn)閿?shù)據(jù)是在請(qǐng)求正文中發(fā)送的,因此我們不能對(duì)其添加書簽。
- GET是默認(rèn)的HTTP方法,而我們需要將方法指定為POST才能使用POST方法發(fā)送請(qǐng)求。
- 頁(yè)面中的超鏈接使用GET方法。
什么是MIME類型?
“ Content-Type”響應(yīng)頭被稱為MIME類型。 服務(wù)器將MIME類型發(fā)送給客戶端,以使客戶端知道其發(fā)送的數(shù)據(jù)類型。 它可以幫助客戶端為用戶呈現(xiàn)數(shù)據(jù)。 一些最常用的mime類型是text / html,text / xml,application / xml等。
我們可以使用ServletContext getMimeType()方法來(lái)獲取文件的正確MIME類型,并使用它來(lái)設(shè)置響應(yīng)內(nèi)容類型。 在通過servlet從服務(wù)器下載文件時(shí)非常有用。
什么是Web應(yīng)用程序,它的目錄結(jié)構(gòu)是什么?
Web應(yīng)用程序是在服務(wù)器上運(yùn)行的模塊,用于向客戶端瀏覽器提供靜態(tài)和動(dòng)態(tài)內(nèi)容。 Apache Web服務(wù)器支持PHP,我們可以使用PHP創(chuàng)建Web應(yīng)用程序。 Java通過可在Servlet容器中運(yùn)行并向客戶端瀏覽器提供動(dòng)態(tài)內(nèi)容的Servlet和JSP提供Web應(yīng)用程序支持。
Java Web應(yīng)用程序打包為Web存檔(WAR),并且具有如下圖所示的已定義結(jié)構(gòu)。
在Java Web Application上了解有關(guān)Web應(yīng)用程序的更多信息。
什么是servlet?
Java Servlet是服務(wù)器端技術(shù),通過提供對(duì)動(dòng)態(tài)響應(yīng)和數(shù)據(jù)持久性的支持來(lái)擴(kuò)展Web服務(wù)器的功能。
javax.servlet和javax.servlet.http包提供用于編寫??我們自己的servlet的接口和類。
所有servlet必須實(shí)現(xiàn)javax.servlet.Servlet接口,該接口定義了servlet生命周期方法。 在實(shí)現(xiàn)通用服務(wù)時(shí),我們可以擴(kuò)展Java Servlet API隨附的GenericServlet類。 HttpServlet類提供用于處理HTTP特定服務(wù)的方法,例如doGet()和doPost()。
大多數(shù)時(shí)候,使用HTTP協(xié)議訪問Web應(yīng)用程序,這就是為什么我們主要擴(kuò)展HttpServlet類的原因。 Servlet API層次結(jié)構(gòu)如下圖所示。
在Servlet教程中內(nèi)容。
Servlet比CGI有什么優(yōu)勢(shì)?
引入Servlet技術(shù)是為了克服CGI技術(shù)的缺點(diǎn)。
- Servlet在處理時(shí)間,內(nèi)存利用率方面提供了比CGI更好的性能,因?yàn)镾ervlet利用了多線程的優(yōu)勢(shì),并且為每個(gè)請(qǐng)求創(chuàng)建了一個(gè)新線程,這比為CGI為每個(gè)請(qǐng)求加載創(chuàng)建新對(duì)象要快。
- 用Servlet開發(fā)的Web應(yīng)用程序與Servlet和平臺(tái)和系統(tǒng)無(wú)關(guān),可以在任何標(biāo)準(zhǔn)Web容器(例如Tomcat,JBoss,Glassfish服務(wù)器)上運(yùn)行,也可以在Windows,Linux,Unix,Solaris,Mac等操作系統(tǒng)上運(yùn)行。
- Servlet的功能強(qiáng)大,因?yàn)槿萜髫?fù)責(zé)Servlet的生命周期,因此我們無(wú)需擔(dān)心內(nèi)存泄漏,安全性,垃圾回收等問題。
- Servlet是可維護(hù)的,學(xué)習(xí)曲線很小,因?yàn)槲覀冃枰⒁獾氖菓?yīng)用程序的業(yè)務(wù)邏輯。
Servlet容器執(zhí)行哪些常見任務(wù)?
Servlet容器也稱為Web容器,例如Tomcat。 Servlet容器的一些重要任務(wù)是:
- 通訊支持 :Servlet容器提供了Web客戶端(瀏覽器)與Servlet和JSP之間的簡(jiǎn)便通訊方式。 由于容器的原因,我們不需要構(gòu)建服務(wù)器套接字來(lái)偵聽來(lái)自Web客戶端的任何請(qǐng)求,解析請(qǐng)求并生成響應(yīng)。 所有這些重要而復(fù)雜的任務(wù)都是由容器完成的,我們需要關(guān)注的只是應(yīng)用程序的業(yè)務(wù)邏輯。
- 生命周期和資源管理 :Servlet容器負(fù)責(zé)管理 Servlet的生命周期。 從將Servlet加載到內(nèi)存中,初始化Servlet,調(diào)用Servlet方法并銷毀它們。 容器還提供實(shí)用程序(如JNDI)進(jìn)行資源池和管理。
- 多線程支持 :容器為對(duì)Servlet的每個(gè)請(qǐng)求創(chuàng)建新線程,并為它們提供請(qǐng)求和響應(yīng)對(duì)象以進(jìn)行處理。 因此,不必為每個(gè)請(qǐng)求初始化servlet,這樣可以節(jié)省時(shí)間和內(nèi)存。
- JSP支持 :JSP看起來(lái)不像普通的Java類,但是應(yīng)用程序中的每個(gè)JSP都是由容器編譯并轉(zhuǎn)換為Servlet,然后容器像其他Servlet一樣管理它們。
- 雜項(xiàng)任務(wù) :Servlet容器管理資源池,執(zhí)行內(nèi)存優(yōu)化,執(zhí)行垃圾收集器,提供安全配置,支持多個(gè)應(yīng)用程序,熱部署以及其他一些后臺(tái)任務(wù),從而使開發(fā)人員的工作變得更輕松。
什么是ServletConfig對(duì)象?
javax.servlet.ServletConfig用于將配置信息傳遞給Servlet。 每個(gè)servlet都有自己的ServletConfig對(duì)象,并且servlet容器負(fù)責(zé)實(shí)例化此對(duì)象。 我們可以在web.xml文件中或通過使用WebInitParam批注提供servlet初始化參數(shù)。 我們可以使用getServletConfig()方法來(lái)獲取Servlet的ServletConfig對(duì)象。
什么是ServletContext對(duì)象?
javax.servlet.ServletContext接口提供對(duì)servlet的Web應(yīng)用程序參數(shù)的訪問。 ServletContext是唯一的對(duì)象,可用于Web應(yīng)用程序中的所有Servlet。 當(dāng)我們希望某些初始化參數(shù)可用于Web應(yīng)用程序中的多個(gè)或所有Servlet時(shí),我們可以使用ServletContext對(duì)象,并使用<context-param>元素在web.xml中定義參數(shù)。 我們可以通過ServletConfig的getServletContext()方法獲取ServletContext對(duì)象。 Servlet容器還可以提供一組Servlet唯一的上下文對(duì)象,并與主機(jī)的URL路徑名稱空間的特定部分綁定。
ServletSpec 3中增強(qiáng)了ServletContext,以引入一些方法,通過這些方法,我們可以以編程方式向應(yīng)用程序添加偵聽器,過濾器和Servlet。 它還提供了一些實(shí)用程序方法,例如getMimeType() , getResourceAsStream()等。
ServletConfig和ServletContext有什么區(qū)別?
ServletConfig和ServletContext之間的一些區(qū)別是:
- ServletConfig是每個(gè)Servlet的唯一對(duì)象,而ServletContext是完整應(yīng)用程序的唯一對(duì)象。
- ServletConfig用于向Servlet提供初始化參數(shù),而ServletContext用于提供所有其他Servlet可以使用的應(yīng)用程序級(jí)初始化參數(shù)。
- 我們不能在ServletConfig對(duì)象中設(shè)置屬性,而可以在ServletContext中設(shè)置其他servlet可以在其??實(shí)現(xiàn)中使用的屬性。
什么是請(qǐng)求分派器?
RequestDispatcher接口用于將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)資源,該資源可以是HTML,JSP或同一應(yīng)用程序中的另一個(gè)servlet。 我們還可以使用它來(lái)將另一個(gè)資源的內(nèi)容包括到響應(yīng)中。 此接口用于同一上下文中的servlet間通信。
此接口中定義了兩種方法:
我們可以使用ServletContext getRequestDispatcher(String path)方法在Servlet中獲取RequestDispatcher。 該路徑必須以/開頭,并被解釋為相對(duì)于當(dāng)前上下文根。
PrintWriter和ServletOutputStream有什么區(qū)別?
PrintWriter是字符流類,而ServletOutputStream是字節(jié)流類。 我們可以使用PrintWriter將基于字符的信息(如字符數(shù)組和String)寫入響應(yīng),而我們可以使用ServletOutputStream將字節(jié)數(shù)組數(shù)據(jù)寫入響應(yīng)。
我們可以使用ServletResponse getWriter()獲取PrintWriter實(shí)例,而我們可以使用ServletResponse getOutputStream()方法獲取ServletOutputStream對(duì)象引用。
您可以在Java IO Tutorial中閱讀有關(guān)Java的更多信息。
我們可以同時(shí)在Servlet中獲得PrintWriter和ServletOutputStream嗎?
如果我們同時(shí)調(diào)用兩個(gè)方法,則無(wú)法在單個(gè)servlet方法中獲得PrintWriter和ServletOutputStream的實(shí)例。 響應(yīng)時(shí)為getWriter()和getOutputStream(); 我們將在運(yùn)行時(shí)通過消息獲取java.lang.IllegalStateException ,因?yàn)橐呀?jīng)為此響應(yīng)調(diào)用了其他方法。
我們?nèi)绾卧趕ervlet中創(chuàng)建死鎖情況?
我們可以通過循環(huán)調(diào)用方法來(lái)在Servlet中創(chuàng)建死鎖,只需從doGet()方法和doGet()方法中的doPost()方法調(diào)用doPost()方法即可在Servlet中創(chuàng)建死鎖情況。
在Java Deadlock Example中閱讀有關(guān)多線程中死鎖的更多信息。
servlet包裝器類有什么用?
Servlet HTTP API提供了兩個(gè)包裝器類– HttpServletRequestWrapper和HttpServletResponseWrapper 。 提供這些包裝器類可幫助開發(fā)人員自定義實(shí)現(xiàn)Servlet請(qǐng)求和響應(yīng)類型。 我們可以擴(kuò)展這些類,并僅覆蓋為自定義請(qǐng)求和響應(yīng)對(duì)象需要實(shí)現(xiàn)的特定方法。 在普通的servlet編程中不使用這些類。
什么是SingleThreadModel接口?
提供SingleThreadModel接口是為了確保線程安全,它確保在servlet的service方法中不會(huì)同時(shí)執(zhí)行兩個(gè)線程。 但是,SingleThreadModel不能解決所有線程安全問題。 例如,即使使用SingleThreadModel servlet,會(huì)話屬性和靜態(tài)變量仍然可以被多個(gè)線程上的多個(gè)請(qǐng)求同時(shí)訪問。 此外,它還充分利用了Servlet的多線程支持的所有優(yōu)點(diǎn),這就是Servlet 2.4中不推薦使用此接口的原因。
我們是否需要重寫service()方法?
當(dāng)Servlet容器接收到客戶端請(qǐng)求時(shí),它會(huì)調(diào)用service()方法,該方法又會(huì)基于請(qǐng)求的HTTP方法來(lái)調(diào)用doGet()和doPost()方法。 我看不到要覆蓋service()方法的任何用例。 service()方法的全部目的是轉(zhuǎn)發(fā)請(qǐng)求到相應(yīng)的HTTP方法實(shí)現(xiàn)。 如果必須對(duì)請(qǐng)求進(jìn)行一些預(yù)處理,則可以始終使用Servlet過濾器和偵聽器。
創(chuàng)建servlet構(gòu)造函數(shù)是個(gè)好主意嗎?
我們可以為servlet定義一個(gè)構(gòu)造函數(shù),但我認(rèn)為它沒有任何用處,因?yàn)槌侨萜鞒跏蓟痵ervlet,否則我們將無(wú)法訪問ServletConfig對(duì)象。 理想情況下,如果必須初始化Servlet的任何資源,則應(yīng)該重寫init()方法,在此方法中,我們可以使用ServletConfig對(duì)象訪問servlet的初始化參數(shù)。
GenericServlet和HttpServlet有什么區(qū)別?
GenericServlet是Servlet接口的協(xié)議獨(dú)立實(shí)現(xiàn),而HttpServlet是HTTP協(xié)議特定的實(shí)現(xiàn)。 大多數(shù)時(shí)候,我們使用servlet來(lái)創(chuàng)建Web應(yīng)用程序,這就是我們擴(kuò)展HttpServlet類的原因。 HttpServlet類擴(kuò)展了GenericServlet,還提供了一些其他特定于HTTP協(xié)議的方法。
servlet間的通信是什么?
當(dāng)我們想從servlet服務(wù)方法中調(diào)用另一個(gè)servlet時(shí),我們使用servlet間通信機(jī)制。 我們可以使用RequestDispatcher forward()和include()方法調(diào)用另一個(gè)servlet,并在請(qǐng)求中提供其他屬性以供其他servlet使用。
如何在servlet中實(shí)現(xiàn)線程安全?
HttpServlet的init()方法和destroy()方法在servlet生命周期中僅被調(diào)用一次,因此我們不必?fù)?dān)心它們的同步。 但是在每個(gè)客戶端請(qǐng)求中都會(huì)調(diào)用諸如doGet()或doPost()之類的服務(wù)方法,并且由于servlet使用多線程,因此我們應(yīng)該在這些方法中提供線程安全性。
如果服務(wù)方法中有任何局部變量,則無(wú)需擔(dān)心它們的線程安全性,因?yàn)樗鼈兲囟ㄓ诿總€(gè)線程,但是如果我們擁有共享資源,則可以在使用共享時(shí)使用同步來(lái)實(shí)現(xiàn)Servlet中的線程安全性。資源。
線程安全性機(jī)制類似于獨(dú)立Java應(yīng)用程序中的線程安全性,請(qǐng)?jiān)?strong>Thread Safety in Java中閱讀有關(guān)它們的更多信息。
什么是servlet屬性及其范圍?
Servlet屬性用于Servlet間的通信,我們可以在Web應(yīng)用程序中設(shè)置,獲取和刪除屬性。 servlet屬性有三個(gè)范圍-請(qǐng)求范圍,會(huì)話范圍和應(yīng)用程序范圍。
ServletRequest,HttpSession和ServletContext接口分別提供了從請(qǐng)求,會(huì)話和應(yīng)用程序范圍獲取/設(shè)置/刪除屬性的方法。
Servlet屬性與在web.xml中為ServletConfig或ServletContext定義的初始化參數(shù)不同。
我們?nèi)绾螐牧硪粋€(gè)servlet調(diào)用一個(gè)servlet?
我們可以使用RequestDispatcher forward()方法將請(qǐng)求的處理轉(zhuǎn)發(fā)到另一個(gè)servlet。 如果要在響應(yīng)中包含另一個(gè)servlet輸出,則可以使用RequestDispatcher include()方法。
我們?nèi)绾卧诓煌膽?yīng)用程序中調(diào)用另一個(gè)servlet?
我們不能使用RequestDispatcher從另一個(gè)應(yīng)用程序調(diào)用servlet,因?yàn)樗翘囟ㄓ谠搼?yīng)用程序的。 如果必須將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)應(yīng)用程序中的資源,則可以使用ServletResponse sendRedirect()方法并提供另一個(gè)Servlet的完整URL。 這會(huì)將響應(yīng)發(fā)送給客戶端,響應(yīng)代碼為302,以將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)URL。 如果還必須發(fā)送一些數(shù)據(jù),則可以使用cookie,它將作為servlet響應(yīng)的一部分,并將請(qǐng)求發(fā)送到另一個(gè)servlet。
ServletResponse sendRedirect()和RequestDispatcher forward()方法之間有什么區(qū)別?
為什么HttpServlet類被聲明為抽象的?
HttpServlet類提供Servlet的HTTP協(xié)議實(shí)現(xiàn),但由于在諸如getGet()和doPost()之類的服務(wù)方法中沒有實(shí)現(xiàn)邏輯,因此它仍然是抽象的,我們應(yīng)該重寫至少一個(gè)服務(wù)方法。 這就是為什么擁有HttpServlet實(shí)例并被聲明為抽象類毫無(wú)意義的原因。
閱讀有關(guān)抽象類的更多信息。
Servlet生命周期的哪些階段?
我們知道,Servlet容器管理著Servlet的生命周期,Servlet生命周期分為四個(gè)階段。
Servlet的生命周期方法是什么?
Servlet生命周期包含三種方法:
為什么我們應(yīng)該只覆蓋no-agrs init()方法。
如果要在我們的servlet處理客戶端請(qǐng)求之前必須初始化一些資源,則應(yīng)重寫init()方法。 如果我們重寫init(ServletConfig config)方法,則第一個(gè)語(yǔ)句應(yīng)為super(config),以確保首先調(diào)用超類init(ServletConfig config)方法。 這就是為什么GenericServlet提供了另一個(gè)幫助程序init()方法,該方法沒有在init(ServletConfig config)方法末尾調(diào)用的參數(shù)。 我們應(yīng)該始終利用此方法來(lái)覆蓋init()方法,以避免出現(xiàn)任何問題,因?yàn)槲覀兛赡軙?huì)忘記在使用ServletConfig參數(shù)的覆蓋init方法中添加super()調(diào)用。
什么是網(wǎng)址編碼?
URL編碼是將數(shù)據(jù)轉(zhuǎn)換為CGI格式的過程,以便它可以在網(wǎng)絡(luò)中傳播而不會(huì)出現(xiàn)任何問題。 URL編碼去除空格,并用轉(zhuǎn)義符替換特殊字符。 我們可以使用java.net.URLEncoder.encode(String str,String unicode)對(duì)String進(jìn)行編碼。 URL解碼是編碼的反向過程,我們可以使用java.net.URLDecoder.decode(String str,String unicode)對(duì)編碼的字符串進(jìn)行解碼。 例如,“ Pankaj的數(shù)據(jù)”被編碼為“ Pankaj%27s + Data”。
Servlet中的會(huì)話管理有哪些不同的方法?
會(huì)話是客戶端和服務(wù)器之間的轉(zhuǎn)換狀態(tài),它可以包含客戶端和服務(wù)器之間的多個(gè)請(qǐng)求和響應(yīng)。 由于HTTP和Web Server都是無(wú)狀態(tài)的,因此維護(hù)會(huì)話的唯一方法是在每次請(qǐng)求和響應(yīng)中在服務(wù)器和客戶端之間傳遞有關(guān)會(huì)話的某些唯一信息(會(huì)話ID)時(shí)。
Servlet中會(huì)話管理的一些常用方法是:
在Servlet會(huì)話管理教程中詳細(xì)了解有關(guān)這些會(huì)話管理方法的更多信息。
什么是URL重寫?
我們可以在servlet中使用HttpSession進(jìn)行會(huì)話管理,但是它可以與Cookies一起使用,并且可以在客戶端瀏覽器中禁用cookie。 Servlet API提供了對(duì)URL重寫的支持,在這種情況下,我們可以使用它來(lái)管理會(huì)話。
從編碼的角度來(lái)看,最好的部分是,它非常易于使用,并且涉及一個(gè)步驟-編碼URL。 Servlet URL編碼的另一個(gè)好處是,它是一種后備方法,只有在禁用瀏覽器cookie的情況下,它才能啟動(dòng)。
我們可以使用HttpServletResponse encodeURL()方法對(duì)URL進(jìn)行編碼,如果必須將請(qǐng)求重定向到另一個(gè)資源,并且想要提供會(huì)話信息,則可以使用encodeRedirectURL()方法。
在Servlet URL Rewriting上內(nèi)容。
Cookies如何在Servlet中工作?
Cookie在Web客戶端與服務(wù)器之間的通信中被大量使用,它不是Java特有的。 Cookies是服務(wù)器發(fā)送到客戶端的文本數(shù)據(jù),并保存在客戶端本地計(jì)算機(jī)上。
Servlet API通過實(shí)現(xiàn)Serializable和Cloneable接口的javax.servlet.http.Cookie類提供cookie支持。
提供HttpServletRequest getCookies()方法可從請(qǐng)求中獲取Cookie數(shù)組,由于沒有向請(qǐng)求添加Cookie的意義,因此沒有設(shè)置或向請(qǐng)求添加Cookie的方法。
類似地,提供了HttpServletResponse addCookie(Cookie c)方法來(lái)將cookie附加到響應(yīng)頭中,沒有用于cookie的getter方法。
在Servlet中的Cookies中了解更多信息。
當(dāng)會(huì)話無(wú)效或超時(shí)時(shí),如何通知會(huì)話中的對(duì)象?
如果必須確保在銷毀會(huì)話時(shí)通知對(duì)象,則該對(duì)象應(yīng)實(shí)現(xiàn)javax.servlet.http.HttpSessionBindingListener接口。 該接口定義了兩個(gè)回調(diào)方法– valueBound()和valueUnbound(),當(dāng)將對(duì)象作為屬性添加到會(huì)話中以及銷毀會(huì)話時(shí),我們可以定義這些回調(diào)方法來(lái)實(shí)現(xiàn)處理邏輯。
建議閱讀Servlet Listener 。
encodeRedirectUrl和encodeURL有什么區(qū)別?
HttpServletResponse提供了在HTML超鏈接中對(duì)URL進(jìn)行編碼的方法,以便轉(zhuǎn)義特殊字符和空格并將會(huì)話ID附加到URL。 它的行為類似于URLEncoder編碼方法,但具有額外的過程以在URL末尾附加jsessionid參數(shù)。
但是,HttpServletResponse encodeRedirectUrl()方法專門用于對(duì)響應(yīng)中的重定向URL進(jìn)行編碼。
因此,當(dāng)我們提供URL重寫支持時(shí),對(duì)于HTML響應(yīng)中的超鏈接,我們應(yīng)該使用encodeURL()方法,而對(duì)于重定向URL,我們應(yīng)該使用encodeRedirectUrl()方法。
為什么我們有servlet過濾器?
Servlet過濾器是可插入的Java組件,我們可以使用它們來(lái)攔截和處理請(qǐng)求,然后再將請(qǐng)求發(fā)送到Servlet,并在Servlet代碼完成之后以及容器將響應(yīng)發(fā)送回客戶端之前進(jìn)行響應(yīng)。
我們可以使用過濾器執(zhí)行的一些常見任務(wù)是:
- 記錄請(qǐng)求參數(shù)以記錄文件。
- 對(duì)資源請(qǐng)求的身份驗(yàn)證和授權(quán)。
- 在將請(qǐng)求正文或報(bào)頭發(fā)送到servlet之前進(jìn)行格式化。
- 壓縮發(fā)送給客戶端的響應(yīng)數(shù)據(jù)。
- 通過添加一些cookie,標(biāo)頭信息等來(lái)更改響應(yīng)。
在Servlet Filter中閱讀有關(guān)過濾器的更多信息。
確保僅當(dāng)用戶具有有效會(huì)話時(shí)才可訪問所有servlet的有效方法是什么?
我們知道servlet過濾器可用于攔截servlet容器和servlet之間的請(qǐng)求,我們可以利用它來(lái)創(chuàng)建身份驗(yàn)證過濾器并檢查請(qǐng)求是否包含有效會(huì)話。
在Servlet篩選器示例中查看Authentication Filter的示例。
為什么我們有servlet偵聽器?
我們知道,使用ServletContext,我們可以創(chuàng)建一個(gè)應(yīng)用程序范圍內(nèi)的屬性,所有其他servlet都可以訪問該屬性,但是我們只能在部署描述符(web.xml)中將ServletContext初始化參數(shù)初始化為String。 如果我們的應(yīng)用程序是面向數(shù)據(jù)庫(kù)的,并且我們想在ServletContext中為數(shù)據(jù)庫(kù)連接設(shè)置一個(gè)屬性,該怎么辦?
如果您的應(yīng)用程序只有一個(gè)入口點(diǎn)(用戶登錄),那么您可以在第一個(gè)servlet請(qǐng)求中進(jìn)行操作,但是如果我們有多個(gè)入口點(diǎn),那么在任何地方都進(jìn)行操作將導(dǎo)致大量代碼冗余。 另外,如果數(shù)據(jù)庫(kù)已關(guān)閉或配置不正確,我們將直到第一個(gè)客戶端請(qǐng)求到達(dá)服務(wù)器時(shí)才知道。 為了處理這些情況,Servlet API提供了偵聽器接口,我們可以將其實(shí)現(xiàn)和配置為偵聽事件并執(zhí)行某些操作。
在Servlet Listener上了解有關(guān)不同類型的偵聽器和示例的更多信息。
如何處理應(yīng)用程序使用另一個(gè)Servlet引發(fā)的異常?
如果您注意到,doGet()和doPost()方法將拋出ServletException和IOException。 由于瀏覽器僅了解HTML,因此當(dāng)我們的應(yīng)用程序引發(fā)異常時(shí),servlet容器將處理該異常并生成HTML響應(yīng)。 其他錯(cuò)誤代碼(例如404、403等)也是如此。
Servlet API支持可在部署描述符中配置的自定義Exception和Error Handler servlet,這些servlet的全部目的是處理應(yīng)用程序引發(fā)的Exception或Error并發(fā)送對(duì)用戶有用HTML響應(yīng)。 我們可以提供指向應(yīng)用程序主頁(yè)的鏈接或一些詳細(xì)信息,以使用戶知道出了什么問題。
我們可以在web.xml中配置它們,如下所示:
<error-page><error-code>404</error-code><location>/AppExceptionHandler</location> </error-page><error-page><exception-type>javax.servlet.ServletException</exception-type><location>/AppExceptionHandler</location> </error-page>在Servlet異常處理中內(nèi)容。
什么是部署描述符?
部署描述符是Web應(yīng)用程序的配置文件,名稱是web.xml,位于WEB-INF目錄中。 Servlet容器使用此文件來(lái)配置Web應(yīng)用程序Servlet,Servlet配置參數(shù),上下文初始化參數(shù),過濾器,偵聽器,歡迎頁(yè)面和錯(cuò)誤處理程序。
使用Servlet 3.0批注,通過使用批注配置Servlet,過濾器和偵聽器,我們可以從web.xml中消除很多混亂。
如何確保在應(yīng)用程序啟動(dòng)時(shí)加載了servlet?
通常,servlet容器會(huì)在第一個(gè)客戶端請(qǐng)求上加載servlet,但是有時(shí)當(dāng)servlet很重并且加載時(shí)間很長(zhǎng)時(shí),我們可能希望在應(yīng)用程序啟動(dòng)時(shí)加載它。 我們可以將load-on-startup元素與web.xml文件中的servlet配置一起使用,或者使用WebServlet批注loadOnStartup變量來(lái)告訴容器在系統(tǒng)啟動(dòng)時(shí)加載servlet。
<servlet><servlet-name>foo</servlet-name><servlet-class>com.foo.servlets.Foo</servlet-class><load-on-startup>5</load-on-startup> </servlet>啟動(dòng)時(shí)加載的值應(yīng)為int,如果為0或負(fù)整數(shù),則servlet容器將根據(jù)客戶端請(qǐng)求和要求加載servlet,但如果為正數(shù),則容器將在應(yīng)用程序啟動(dòng)時(shí)加載它。
如果有多個(gè)servlet,其啟動(dòng)時(shí)加載值為1,2,3,則將首先加載較低的整數(shù)值servlet。
如何獲取服務(wù)器中servlet的實(shí)際路徑?
我們可以使用以下代碼片段獲取文件系統(tǒng)中servlet的實(shí)際路徑。
getServletContext().getRealPath(request.getServletPath())如何在servlet中獲取服務(wù)器信息?
我們可以使用下面的代碼片段通過servlet上下文對(duì)象獲取servlet中的servlet信息。
getServletContext().getServerInfo()編寫一個(gè)servlet以在服務(wù)器上上傳文件。
Java Web應(yīng)用程序中的文件上傳和下載以及常見任務(wù)。 不幸的是,Servlet API沒有提供在服務(wù)器上上傳文件的簡(jiǎn)便方法,因此我們可以使用Apache FileUpload jar來(lái)簡(jiǎn)化我們的生活。
請(qǐng)閱讀“ 文件上傳Servlet”一文 ,其中提供了所有必要的詳細(xì)信息以及示例程序,以使用Servlet上傳和下載文件。
我們?nèi)绾芜M(jìn)行servlet中的數(shù)據(jù)庫(kù)連接和log4j集成?
如果您在Web應(yīng)用程序中使用大量數(shù)據(jù)庫(kù)連接,則最好在Servlet上下文偵聽器中對(duì)其進(jìn)行初始化,并將其設(shè)置為其他Servlet使用的上下文屬性。
在Web應(yīng)用程序中,集成Log4j也非常容易,我們需要的是一個(gè)log4j配置XML或?qū)傩晕募?#xff0c;然后在servlet上下文偵聽器中對(duì)其進(jìn)行配置。
有關(guān)完整的示例,請(qǐng)查看Servlet數(shù)據(jù)庫(kù)和Log4j示例 。
如何在servlet中獲取客戶端的IP地址?
我們可以使用request.getRemoteAddr()獲取Servlet中的客戶端IP地址。
Servlet 3的重要功能是什么?
Servlet Specs 3.0是一個(gè)主要版本,其中一些重要功能包括:
Servlet 3引入了使用Java批注來(lái)定義servlet,過濾器和偵聽器servlet以及init參數(shù)的方法。 一些重要的Servlet API批注是WebServlet,WebInitParam,WebFilter和WebListener。 在Servlet 3注釋中閱讀有關(guān)它們的更多信息。
What are different ways for servlet authentication?
Servlet Container provides different ways of login based servlet authentication:
How can we achieve transport layer security for our web application?
We can configure our servlet container to use SSL for message communication over the network. To configure SSL on Tomcat, we need a digital certificate that can be created using Java keytool for development environment. For production environment, you should get the digital certificate from SSL certificate providers, for example, Verisign or Entrust.
Read more at Configure SSL on Tomcat article.
That's all for the servlet interview questions and answers. I will keep on adding more servlet based interview questions to the list in future, so don't forget to bookmark it for future reference.
翻譯自: https://www.javacodegeeks.com/2013/08/50-servlet-interview-questions-and-answers.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的50个Servlet面试问答的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业标准需要备案吗?(企业标准需要备案吗
- 下一篇: 使用Guava MapSplitters