servlet面试常问问题_50个Servlet面试问答
servlet面試常問問題
Servlet是Java EE的一個非常重要的主題,所有Web應用程序框架(例如Spring和Struts)都建立在它之上。 這使servlet成為Java訪談中的熱門話題。
在這里,我提供了50個servlet面試問題的列表,并提供了答案,以幫助您解決與Java中servlet和Web應用程序有關的大多數面試問題。
Web服務器和應用程序服務器之間有什么區別?
Web服務器的職責是處理來自客戶端瀏覽器的HTTP請求并以HTML響應進行響應。 Web服務器可以理解HTTP語言并可以在HTTP協議上運行。
Apache Web Server是一種Web服務器,然后我們有可以執行servlet和JSP(稱為servlet容器)的特定容器,例如Tomcat。
Application Server提供了其他功能,例如Enterprise JavaBeans支持,JMS Messaging支持,事務管理等。因此,可以說Application Server是一個Web服務器,具有其他功能來幫助開發人員使用企業應用程序。
哪種HTTP方法不是冪等的?
如果HTTP方法每次返回相同的結果,則稱它是冪等的。 HTTP方法GET,PUT,DELETE,HEAD和OPTIONS是冪等方法,我們應該實現應用程序以確保這些方法始終返回相同的結果。 HTTP方法POST是非冪等方法,在實現隨每個請求更改的內容時,我們應該使用post方法。
例如,要訪問HTML頁面或圖像,我們應該使用GET,因為它將始終返回相同的對象,但是如果我們必須將客戶信息保存到數據庫中,則應該使用POST方法。 冪等方法也稱為安全方法,我們不在乎客戶端對安全方法的重復請求。
GET和POST方法有什么區別?
- GET是一種安全方法(冪等),其中POST是非冪等方法。
- 我們可以使用GET方法發送有限的數據,并將其發送到標頭請求URL中,而我們可以使用POST發送大量數據,因為它是正文的一部分。
- GET方法是不安全的,因為數據在URL中公開,我們可以輕松為其添加書簽并再次發送類似的請求,而POST是安全的,因為數據是在請求正文中發送的,因此我們無法對其添加書簽。
- GET是默認的HTTP方法,而我們需要將方法指定為POST才能使用POST方法發送請求。
- 頁面中的超鏈接使用GET方法。
什么是MIME類型?
“ Content-Type”響應頭被稱為MIME類型。 服務器將MIME類型發送給客戶端,以使客戶端知道其發送的數據類型。 它可以幫助客戶端為用戶呈現數據。 一些最常用的mime類型是text / html,text / xml,application / xml等。
我們可以使用ServletContext getMimeType()方法來獲取文件的正確MIME類型,并使用它來設置響應內容類型。 在通過servlet從服務器下載文件時非常有用。
什么是Web應用程序,它的目錄結構是什么?
Web應用程序是在服務器上運行的模塊,用于向客戶端瀏覽器提供靜態和動態內容。 Apache Web服務器支持PHP,我們可以使用PHP創建Web應用程序。 Java通過可在Servlet容器中運行并向客戶端瀏覽器提供動態內容的Servlet和JSP提供Web應用程序支持。
Java Web應用程序打包為Web存檔(WAR),并且具有如下圖所示的已定義結構。
在Java Web Application上了解有關Web應用程序的更多信息。
什么是servlet?
Java Servlet是服務器端技術,通過提供對動態響應和數據持久性的支持來擴展Web服務器的功能。
javax.servlet和javax.servlet.http包提供用于編寫??我們自己的servlet的接口和類。
所有servlet必須實現javax.servlet.Servlet接口,該接口定義了servlet生命周期方法。 在實現通用服務時,我們可以擴展Java Servlet API隨附的GenericServlet類。 HttpServlet類提供用于處理特定于HTTP的服務的方法,例如doGet()和doPost()。
大多數時候,使用HTTP協議訪問Web應用程序,這就是為什么我們主要擴展HttpServlet類的原因。 Servlet API層次結構如下圖所示。
在Servlet教程中內容。
Servlet比CGI有什么優勢?
引入Servlet技術是為了克服CGI技術的缺點。
- Servlet在處理時間,內存利用率方面提供了比CGI更好的性能,因為Servlet利用了多線程的優勢,并且為每個請求創建了一個新線程,這比為CGI為每個請求加載創建新對象要快。
- 用Servlet開發的Web應用程序與Servlet和平臺和系統無關,可以在任何標準的Web容器上運行,例如Tomcat,JBoss,Glassfish服務器以及在Windows,Linux,Unix,Solaris,Mac等操作系統上。
- Servlet的功能強大,因為容器負責Servlet的生命周期,因此我們無需擔心內存泄漏,安全性,垃圾回收等問題。
- Servlet是可維護的,學習曲線很小,因為我們需要注意的是應用程序的業務邏輯。
Servlet容器執行哪些常見任務?
Servlet容器也稱為Web容器,例如Tomcat。 Servlet容器的一些重要任務是:
- 通訊支持 :Servlet容器提供了Web客戶端(瀏覽器)與Servlet和JSP之間的簡便通訊方式。 由于容器的原因,我們不需要構建服務器套接字來偵聽來自Web客戶端的任何請求,解析請求并生成響應。 所有這些重要而復雜的任務都是由容器完成的,我們需要關注的只是應用程序的業務邏輯。
- 生命周期和資源管理 :Servlet容器負責管理 Servlet的生命周期。 從將servlet加載到內存中,初始化servlet,調用servlet方法并銷毀它們。 容器還提供實用程序(如JNDI)來進行資源池和管理。
- 多線程支持 :容器為對Servlet的每個請求創建新線程,并為它們提供請求和響應對象以進行處理。 因此,不必為每個請求初始化servlet,這樣可以節省時間和內存。
- JSP支持 :JSP看起來不像普通的Java類,但是應用程序中的每個JSP都由容器編譯并轉換為Servlet,然后容器像其他Servlet一樣管理它們。
- 雜項任務 :Servlet容器管理資源池,執行內存優化,執行垃圾收集器,提供安全配置,支持多個應用程序,熱部署以及其他一些后臺任務,這些任務使開發人員的工作變得更輕松。
什么是ServletConfig對象?
javax.servlet.ServletConfig用于將配置信息傳遞給Servlet。 每個servlet都有自己的ServletConfig對象,并且servlet容器負責實例化此對象。 我們可以在web.xml文件中或通過使用WebInitParam批注提供servlet初始化參數。 我們可以使用getServletConfig()方法來獲取Servlet的ServletConfig對象。
什么是ServletContext對象?
javax.servlet.ServletContext接口提供對servlet的Web應用程序參數的訪問。 ServletContext是唯一的對象,可用于Web應用程序中的所有Servlet。 當我們希望某些初始化參數可用于Web應用程序中的多個或所有servlet時,我們可以使用ServletContext對象,并使用<context-param>元素在web.xml中定義參數。 我們可以通過ServletConfig的getServletContext()方法獲取ServletContext對象。 Servlet容器還可以提供一組Servlet唯一的上下文對象,并且該上下文對象與主機的URL路徑名稱空間的特定部分相關聯。
ServletSpec 3中增強了ServletContext,以引入一些方法,通過這些方法,我們可以以編程方式向應用程序添加偵聽器,過濾器和Servlet。 它還提供了一些實用的方法,例如getMimeType() , getResourceAsStream()等。
ServletConfig和ServletContext有什么區別?
ServletConfig和ServletContext之間的一些區別是:
- ServletConfig是每個Servlet的唯一對象,而ServletContext是完整應用程序的唯一對象。
- ServletConfig用于向Servlet提供初始化參數,而ServletContext用于提供所有其他Servlet可以使用的應用程序級初始化參數。
- 我們不能在ServletConfig對象中設置屬性,而可以在ServletContext中設置其他servlet可以在其??實現中使用的屬性。
什么是請求分派器?
RequestDispatcher接口用于將請求轉發到另一個資源,該資源可以是HTML,JSP或同一應用程序中的另一個servlet。 我們還可以使用它來將另一個資源的內容包括到響應中。 此接口用于同一上下文中的servlet間通信。
此接口中定義了兩種方法:
我們可以使用ServletContext的getRequestDispatcher(String path)方法在Servlet中獲取RequestDispatcher。 該路徑必須以/開頭,并被解釋為相對于當前上下文根。
PrintWriter和ServletOutputStream有什么區別?
PrintWriter是字符流類,而ServletOutputStream是字節流類。 我們可以使用PrintWriter將基于字符的信息(例如,字符數組和String)寫入響應,而我們可以使用ServletOutputStream將字節數組數據寫入響應。
我們可以使用ServletResponse getWriter()獲取PrintWriter實例,而我們可以使用ServletResponse getOutputStream()方法獲取ServletOutputStream對象引用。
您可以在Java IO教程中閱讀有關Java的更多信息。
我們可以同時在Servlet中獲得PrintWriter和ServletOutputStream嗎?
如果我們同時調用兩個方法,則無法在單個Servlet方法中獲得PrintWriter和ServletOutputStream的實例。 響應時為getWriter()和getOutputStream(); 我們將在運行時通過消息獲取java.lang.IllegalStateException ,因為已經為此響應調用了其他方法。
我們如何在servlet中創建死鎖情況?
我們可以通過循環調用方法來在Servlet中創建死鎖,只需從doGet()方法和doGet()方法中的doPost()方法調用doPost()方法即可在Servlet中創建死鎖情況。
在Java Deadlock Example中閱讀有關多線程中死鎖的更多信息。
servlet包裝器類有什么用?
Servlet HTTP API提供了兩個包裝器類– HttpServletRequestWrapper和HttpServletResponseWrapper 。 提供這些包裝器類可幫助開發人員自定義實現Servlet請求和響應類型。 我們可以擴展這些類,并僅覆蓋為自定義請求和響應對象需要實現的特定方法。 在普通的servlet編程中不使用這些類。
什么是SingleThreadModel接口?
提供SingleThreadModel接口是為了確保線程安全,它確保在servlet的service方法中不會同時執行兩個線程。 但是,SingleThreadModel不能解決所有線程安全問題。 例如,即使使用SingleThreadModel servlet,會話屬性和靜態變量仍然可以同時被多個線程上的多個請求訪問。 此外,它還充分利用了Servlet的多線程支持的所有優點,這就是Servlet 2.4中不推薦使用此接口的原因。
我們需要重寫service()方法嗎?
當Servlet容器接收到客戶端請求時,它會調用service()方法,該方法又會基于請求的HTTP方法來調用doGet()和doPost()方法。 我看不到要覆蓋service()方法的任何用例。 service()方法的全部目的是轉發請求到相應的HTTP方法實現。 如果必須對請求進行一些預處理,則可以始終使用servlet過濾器和偵聽器。
創建servlet構造函數是個好主意嗎?
我們可以為servlet定義一個構造函數,但是我認為它沒有任何用處,因為除非容器初始化了servlet,否則我們將無法訪問ServletConfig對象。 理想情況下,如果我們必須為Servlet初始化任何資源,則應該重寫init()方法,在此我們可以使用ServletConfig對象訪問servlet的初始化參數。
GenericServlet和HttpServlet有什么區別?
GenericServlet是Servlet接口的協議獨立實現,而HttpServlet是HTTP協議特定的實現。 大多數時候,我們使用servlet來創建Web應用程序,這就是我們擴展HttpServlet類的原因。 HttpServlet類擴展了GenericServlet,還提供了一些其他特定于HTTP協議的方法。
servlet間的通信是什么?
當我們想從servlet服務方法中調用另一個servlet時,我們使用servlet間通信機制。 我們可以使用RequestDispatcher forward()和include()方法調用另一個servlet,并在請求中提供其他屬性以供其他servlet使用。
如何在servlet中實現線程安全?
HttpServlet的init()方法和destroy()方法在servlet生命周期中僅被調用一次,因此我們不必擔心它們的同步。 但是在每個客戶端請求中都會調用諸如doGet()或doPost()之類的服務方法,并且由于servlet使用多線程,因此我們應該在這些方法中提供線程安全性。
如果服務方法中有任何局部變量,我們不必擔心它們的線程安全性,因為它們特定于每個線程,但是如果我們擁有共享資源,則在使用共享時,我們可以使用同步來實現Servlet中的線程安全性。資源。
線程安全性機制類似于獨立Java應用程序中的線程安全性,請在Thread Safety in Java中閱讀有關它們的更多信息。
什么是servlet屬性及其范圍?
Servlet屬性用于Servlet間的通信,我們可以在Web應用程序中設置,獲取和刪除屬性。 servlet屬性有三個范圍-請求范圍,會話范圍和應用程序范圍。
ServletRequest,HttpSession和ServletContext接口分別提供了從請求,會話和應用程序范圍獲取/設置/刪除屬性的方法。
Servlet屬性與web.xml中為ServletConfig或ServletContext定義的初始化參數不同。
我們如何從另一個servlet調用一個servlet?
我們可以使用RequestDispatcher forward()方法將請求的處理轉發到另一個servlet。 如果要在響應中包含另一個servlet輸出,則可以使用RequestDispatcher include()方法。
我們如何在不同的應用程序中調用另一個servlet?
我們不能使用RequestDispatcher從另一個應用程序調用servlet,因為它是特定于該應用程序的。 如果必須將請求轉發到另一個應用程序中的資源,則可以使用ServletResponse sendRedirect()方法并提供另一個Servlet的完整URL。 這會將響應發送給客戶端,響應代碼為302,以將請求轉發到另一個URL。 如果還必須發送一些數據,則可以使用cookie,它將作為servlet響應的一部分,并將請求發送到另一個servlet。
ServletResponse sendRedirect()和RequestDispatcher forward()方法之間有什么區別?
為什么HttpServlet類被聲明為抽象的?
HttpServlet類提供Servlet的HTTP協議實現,但由于在諸如getGet()和doPost()之類的服務方法中沒有實現邏輯,因此它仍然是抽象的,我們應該重寫至少一個服務方法。 這就是為什么擁有HttpServlet實例并被聲明為抽象類毫無意義的原因。
閱讀有關抽象類的更多信息。
Servlet生命周期的哪些階段?
我們知道Servlet容器管理Servlet的生命周期,Servlet生命周期分為四個階段。
Servlet的生命周期方法是什么?
Servlet生命周期包含三種方法:
為什么我們應該只覆蓋no-agrs init()方法。
如果要在我們的servlet處理客戶端請求之前必須初始化一些資源,則應重寫init()方法。 如果我們重寫init(ServletConfig config)方法,則第一個語句應為super(config),以確保首先調用超類init(ServletConfig config)方法。 這就是為什么GenericServlet提供了另一個幫助程序init()方法,該方法沒有在init(ServletConfig config)方法末尾調用的參數。 我們應該始終利用此方法來覆蓋init()方法,以避免出現任何問題,因為我們可能會忘記在使用ServletConfig參數的覆蓋init方法中添加super()調用。
什么是網址編碼?
URL編碼是將數據轉換為CGI格式的過程,以便它可以毫無問題地跨網絡傳輸。 URL編碼去除空格,并用轉義符替換特殊字符。 我們可以使用java.net.URLEncoder.encode(String str,String unicode)對String進行編碼。 URL解碼是編碼的反向過程,我們可以使用java.net.URLDecoder.decode(String str,String unicode)對編碼的字符串進行解碼。 例如,“ Pankaj的數據”被編碼為“ Pankaj%27s + Data”。
Servlet中的會話管理有哪些不同的方法?
會話是客戶端和服務器之間的轉換狀態,它可以包含客戶端和服務器之間的多個請求和響應。 由于HTTP和Web Server都是無狀態的,因此維護會話的唯一方法是在每次請求和響應中在服務器和客戶端之間傳遞有關會話的某些唯一信息(會話ID)時。
Servlet中會話管理的一些常見方法是:
在Servlet會話管理教程中詳細了解有關這些會話管理方法的更多信息。
什么是URL重寫?
我們可以在servlet中使用HttpSession進行會話管理,但是它可以與Cookies一起使用,并且可以在客戶端瀏覽器中禁用cookie。 Servlet API提供了對URL重寫的支持,在這種情況下,我們可以使用它來管理會話。
從編碼的角度來看,最好的部分是,它非常易于使用,并且涉及一個步驟-編碼URL。 Servlet URL編碼的另一個好處是,它是一種后備方法,只有在禁用瀏覽器cookie的情況下,它才能啟動。
我們可以使用HttpServletResponse encodeURL()方法對URL進行編碼,如果必須將請求重定向到另一個資源,并且想要提供會話信息,則可以使用encodeRedirectURL()方法。
在Servlet URL Rewriting上內容。
Cookies如何在Servlet中工作?
Cookie在Web客戶端與服務器之間的通信中被大量使用,它不是Java特有的。 Cookies是服務器發送到客戶端的文本數據,并保存在客戶端本地計算機上。
Servlet API通過實現Serializable和Cloneable接口的javax.servlet.http.Cookie類提供cookie支持。
提供了HttpServletRequest getCookies()方法來從請求中獲取Cookie數組,因為沒有必要向請求中添加Cookie,所以沒有方法可以設置或向請求中添加Cookie。
類似地,提供了HttpServletResponse addCookie(Cookie c)方法來將cookie附加到響應頭中,沒有用于cookie的getter方法。
在Servlet中的Cookies中了解更多信息。
當會話無效或超時時,如何在會話中通知對象?
如果必須確保在銷毀會話時通知對象,則該對象應實現javax.servlet.http.HttpSessionBindingListener接口。 該接口定義了兩個回調方法-valueBound()和valueUnbound(),當將對象作為屬性添加到會話中以及將會話銷毀時,我們可以定義它們以實現處理邏輯。
建議閱讀Servlet Listener 。
encodeRedirectUrl和encodeURL有什么區別?
HttpServletResponse提供了在HTML超鏈接中對URL進行編碼的方法,以便轉義特殊字符和空格并將會話ID附加到URL。 它的行為類似于URLEncoder編碼方法,但具有額外的過程以在URL末尾附加jsessionid參數。
但是,HttpServletResponse encodeRedirectUrl()方法專門用于對響應中的重定向URL進行編碼。
因此,當我們提供URL重寫支持時,對于HTML響應中的超鏈接,我們應該使用encodeURL()方法,而對于重定向URL,我們應該使用encodeRedirectUrl()方法。
為什么我們有servlet過濾器?
Servlet過濾器是可插入的Java組件,我們可以使用它們來攔截和處理請求,然后再將請求發送到servlet,并在servlet代碼完成之后以及容器將響應發送回客戶端之前進行響應。
我們可以使用過濾器執行的一些常見任務是:
- 記錄請求參數以記錄文件。
- 對資源請求的身份驗證和授權。
- 在將請求正文或標頭發送到servlet之前進行格式化。
- 壓縮發送給客戶端的響應數據。
- 通過添加一些cookie,標頭信息等來更改響應。
在Servlet Filter中閱讀有關過濾器的更多信息。
確保僅當用戶具有有效會話時才可訪問所有servlet的有效方法是什么?
我們知道servlet過濾器可用于攔截servlet容器與servlet之間的請求,我們可以利用它來創建身份驗證過濾器并檢查請求是否包含有效會話。
在Servlet篩選器示例中查看Authentication Filter的示例。
為什么我們有servlet偵聽器?
我們知道,使用ServletContext,我們可以創建具有所有其他Servlet都可以訪問的應用程序范圍的屬性,但是我們只能在部署描述符(web.xml)中將ServletContext初始化參數初始化為String。 如果我們的應用程序是面向數據庫的,并且我們想在ServletContext中為數據庫連接設置一個屬性,該怎么辦?
如果您的應用程序只有一個入口點(用戶登錄),那么您可以在第一個servlet請求中進行操作,但是如果我們有多個入口點,那么在任何地方都進行操作將導致大量代碼冗余。 另外,如果數據庫關閉或配置不正確,我們將直到第一個客戶端請求到達服務器時才知道。 為了處理這些情況,Servlet API提供了偵聽器接口,我們可以將其實現和配置為偵聽事件并執行某些操作。
在Servlet Listener上了解有關不同類型的偵聽器和示例的更多信息。
如何處理應用程序使用另一個Servlet引發的異常?
如果您注意到,doGet()和doPost()方法將拋出ServletException和IOException。 由于瀏覽器僅了解HTML,因此當我們的應用程序引發異常時,servlet容器將處理該異常并生成HTML響應。 其他錯誤代碼(例如404、403等)也是如此。
Servlet API支持可在部署描述符中配置的自定義Exception和Error Handler servlet,這些servlet的全部目的是處理應用程序引發的Exception或Error并發送對用戶有用HTML響應。 我們可以提供指向應用程序主頁的鏈接或一些詳細信息,以使用戶知道出了什么問題。
我們可以在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異常處理中內容。
什么是部署描述符?
部署描述符是Web應用程序的配置文件,名稱是web.xml,它位于WEB-INF目錄中。 Servlet容器使用此文件來配置Web應用程序Servlet,Servlet配置參數,上下文初始化參數,過濾器,偵聽器,歡迎頁面和錯誤處理程序。
使用Servlet 3.0批注,通過使用批注配置Servlet,過濾器和偵聽器,我們可以從web.xml中消除很多混亂。
如何確保在應用程序啟動時加載了servlet?
通常,servlet容器會在第一個客戶端請求上加載servlet,但是有時,當servlet很重并且加載時間很長時,我們可能希望在應用程序啟動時加載它。 我們可以將load-on-startup元素與web.xml文件中的servlet配置一起使用,或者使用WebServlet批注loadOnStartup變量來告訴容器在系統啟動時加載servlet。
<servlet><servlet-name>foo</servlet-name><servlet-class>com.foo.servlets.Foo</servlet-class><load-on-startup>5</load-on-startup> </servlet>啟動時加載的值應為int,如果為0或負整數,則servlet容器將根據客戶端請求和要求加載servlet,但如果為正數,則容器將在應用程序啟動時加載它。
如果有多個servlet,其啟動時加載值為1,2,3,則將首先加載較低的整數值servlet。
如何獲取服務器中servlet的實際路徑?
我們可以使用以下代碼片段獲取文件系統中servlet的實際路徑。
getServletContext().getRealPath(request.getServletPath())如何在servlet中獲取服務器信息?
我們可以使用下面的代碼片段通過servlet上下文對象獲取servlet中的servlet信息。
getServletContext().getServerInfo()編寫一個Servlet以在服務器上上傳文件。
Java Web應用程序中的文件上載和下載以及常見任務。 不幸的是,Servlet API沒有提供在服務器上上傳文件的簡便方法,因此我們可以使用Apache FileUpload jar來簡化我們的生活。
請閱讀“ 文件上傳Servlet”一文 ,其中提供了所有必要的詳細信息以及示例程序,以使用Servlet上傳和下載文件。
我們如何進行servlet中的數據庫連接和log4j集成?
如果您在Web應用程序中經常使用數據庫連接,則最好在Servlet上下文偵聽器中對其進行初始化,并將其設置為其他Servlet使用的上下文屬性。
在Web應用程序中,集成Log4j也非常容易,我們需要的是一個log4j配置XML或屬性文件,然后在servlet上下文偵聽器中對其進行配置。
有關完整的示例,請查看Servlet數據庫和Log4j示例 。
如何在servlet中獲取客戶端的IP地址?
我們可以使用request.getRemoteAddr()獲取Servlet中的客戶端IP地址。
Servlet 3的重要功能是什么?
Servlet Specs 3.0 was a major release and some of the important features are:
Servlet 3 introduced use of java annotations to define a servlet, filter and listener servlets and init parameters. Some of the important Servlet API annotations are WebServlet, WebInitParam, WebFilter and WebListener. Read more about them at Servlet 3 annotations .
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
servlet面試常問問題
總結
以上是生活随笔為你收集整理的servlet面试常问问题_50个Servlet面试问答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 皂苷怎么读 皂苷的拼音是什么
- 下一篇: Maven教程之春