Servlet常见面试题
目錄
Servlet的概念,JSP與Servlet的區別
Servlet的生命周期
Servlet中的session的工作原理,以及設置過期時間的方式
Servlet中的filter的應用場景
JSP的動態include和靜態include
web.xml的作用
Servlet的線程安全問題
?
Servlet的概念,JSP與Servlet的區別
? ? servlet是基于java技術的web組件,由容器管理并產生動態的內容,Servlet引擎作為web服務器的擴展,提供支持servlet的功能。Servlet技術帶給程序員最大的優勢是它可以處理客戶端傳來的HTTP請求,并返回一個響應。
? ?SUN首先發展出SERVLET,其功能比較強勁,體系設計也很先進,只是,它輸出HTML語句還是采用了老的CGI方式,是一句一句輸出,所以,編寫和修改HTML非常不方便。 后來SUN推出了類似于ASP的鑲嵌型的JSP,把JSP TAG鑲嵌到HTML語句中,這樣,就大大簡化和方便了網頁的設計和修改。新型的網絡語言如ASP,PHP,JSP都是鑲嵌型的SCRIPT語言。
JSP與Servlet的區別:
1、JSP在本質上就是Servlet,但是兩者的創建方式不一樣。
2、Servlet完全是JAVA程序代碼構成,擅長于流程控制和事務處理,通過Servlet來生成動態網頁很不直觀。
3、JSP由HTML代碼和JSP標簽構成,可以方便地編寫動態網頁。
??????因此在實際應用中采用Servlet來控制業務流程,而采用JSP來生成動態網頁。在struts框架中,JSP位于MVC設計模式的視圖層,而Servlet位于控制層。JSP是Servlet技術的擴展,JSP編譯后是“類servlet”,本質上就是Servlet的簡易方式。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來,而JSP是Java和HTML組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
?
現在基本上不會去用JSP編寫頁面,當然初學者應該學習一下,freemaker也用的比較較少了,現在主要使用前后端分離的技術。
?
Servlet的生命周期
? ? Servlet遵循嚴格的生命周期,在每個Servlet的實例的生命中有三種類型的事件,這三種事件對應于由Servlet引擎所喚醒的三個方法:
(1)init()。當servlet第一次被裝載時,Servlet引擎會調Servlet的init()方法,只調用一次。如果某個Sevlet需要特殊的初始化需要。那么Servlet編寫人員可以重寫該方法來執行初始化任務。這是一個可選的方法。如果某個Servlet不需要初始化,那么默認情況下將調用它父類的init方法。系統保證,在init方法成功完成以前,是不會調用Servlet去處理任何請求的。
(2)service()。這是Servlet最重要的方法,是真正處理請求的地方。對于每個請求,Servlet引擎將調用Servlet的service()方法,并把Servlet請求對象和Servlet響應對象作為參數傳遞給它。
(3)destroy()。這是相對于init的可選方法,當Servlet即將被卸載時由Servlet引擎來調用,這個方法用來清除并釋放在init方法中所分配的資源。
Servlet的生命周期可以被歸納為以下幾步:
(1) 裝載Servlet,這一項操作一般是動態執行的。然而,Servlet通常會提供一個管理的選項,用于在Servlet啟動時強制裝載和初始化特定的Servlet;
(2) Server創建一個Servlet實例;
(3) Server調用Servlet的 init() 方法;
(4) 一個客戶端請求到達Server;
(5) Server創建一個請求對象;
(6) Server創建一個響應對象;
(7) Server激活Servlet的service()方法,傳遞請求和響應對象作為參數;
(8) service()方法獲得關于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息;
(9) service()方法使用響應對象的方法。將響應傳回Server,最終到達客戶端。service()方法可能激活其他方法以處理請求。如doGet(),doPost()或其他程序員自己開發的方法;
(10) 對于更多的客戶端請求,Server創建新的請求和響應對象,仍然激活此servlet的service()方法,將這兩個對象作為參數傳遞給它,如此重復以上的循環,但無需再次調用init()方法,Servlet一般只初始化一次;
(11) 當Server不再需要Servlet時,比如當Server要關閉時,Server調用Servlet的destroy。
?
?
Servlet中的session的工作原理,以及設置過期時間的方式
? ? session對應的中文翻譯是會話。會話指的是從用戶打開瀏覽器訪問一個網站開始,無論在這個網站中訪問了多少頁面,點擊了多少鏈接,都屬于同一個會話。 直到該用戶關閉瀏覽器為止,都屬于同一個會話。
? ? session保存在服務器,而sessionId通過Cookie發送給客戶端,但這個Cookie的生命不一,即只在瀏覽器內存中存在,也就是說如果用戶關閉了瀏覽器,那么這個Cookie就丟失了。當用戶再次打開瀏覽器訪問服務器時,就不會有sessionId發送給服務器,那么服務器會認為你沒有session,所以服務器會創建一個session,并在響應中把sessionId中到Cookie中發送給客戶端。你可能會說,那原來的session對象會怎樣?當一個session長時間沒人使用的話,服務器會把session刪除了!這個時長在Tomcat中配置是30分鐘,可以在${CATALANA}/conf/web.xml找到這個配置,當然你也可以在自己的web.xml中覆蓋這個配置!
web.xml
<session-config><session-timeout>30</session-timeout> <!-- 設置session失效時間,單位是min --> </session-config>一般web系統都需要控制session自動失效的時間,從而控制用戶訪問系統超時。設置session失效有以下三種方式:
1、在主頁面或者公共頁面中加入:session.setMaxInactiveInterval(3600);參數單位是秒,即在沒有活動1小時后,session將失效。注意:這里session設置的時間是根據服務器來計算的,而不是客戶端。所以如果是在調試程序,應該是修改服務器端時間來測試,而不是客戶端。
2、較通用的設置session失效時間的方法是在項目的web.xml中設置。
3、直接在應用服務器中設置,例如:若容器是tomcat,可以在tomcat目錄下conf/web.xml中設置。
找到<session-config>元素,tomcat默認設置是30分鐘,只要修改這個值就可以了。
注意:如果上述三個地方如果都設置了,有個優先級的問題,從高到低:(1)>(2)>(3)
?
?
?
Servlet中的filter的應用場景
? ?◆ 通過配置參數encoding指定用何種字符編碼,已處理參數中的中文問題;
? ?◆ 禁止瀏覽器緩存所有動態頁面的過濾器;
? ?◆ 控制瀏覽器緩存頁面中的靜態資源的過濾器;
? ?◆ 使用Filter實現URL級別的權限認證(在實際開發中我們經常把一些執行敏感操作的servlet映射到一些特殊目錄中,并用filter把這些特殊目錄保護起來,限制只能擁有相應訪問權限的用戶才能訪問這些目錄下的資源。);
? ?◆ 實現用戶自動登陸的過濾器,在用戶登陸成功后,發送一個名稱為user的cookie給客戶端,cookie的值為用戶名和md5加密后的密碼。編寫一個AutoLoginFilter,這個filter檢查用戶是否帶有名稱為user的cookie來,如果有,則調用dao查詢cookie的用戶名和密碼是否和數據庫匹配,匹配則向session中存入user對象(即用戶登陸標記),以實現程序完成自動登陸。
? ?
?
JSP的動態include和靜態include
(了解即可,現在已基本不使用jsp)
? ? ◆ 靜態include 用?include?偽碼實現?,不會檢查所含文件的變化,適用于包含靜態頁面?<%@ include file="included.htm" %>?。先將文件的代碼被原封不動地加入到了主頁面從而合成一個文件,然后再進行翻譯;
? ? ◆ 動態?INCLUDE?用?jsp:include?動作實現?<jsp:include page="included.jsp" flush="true" />, 它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數。各個文件分別先編譯,然后組合成一個文件。
?
web.xml的作用
? ??一個web中完全可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。web.xml文件是用來配置:歡迎頁、servlet、filter等的。當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的web工程。?而且web.xml的模式文件中定義的標簽并不是定死的,模式文件也是可以改變的,一般來說,隨著web.mxl模式文件的版本升級,里面定義的功能會越來越復雜,也即標簽元素的種類會越來越多,但有些是不常用的,我們只需記住一些常用的就可以了。
?
Servlet的線程安全問題
? ? Servlet 默認是單例模式,在web 容器中只創建一個實例,所以多個線程同時訪問servlet的時候,Servlet是線程不安全的。那么 web 容器能為每個請求創建一個Servlet的實例嗎?當然是可以的,只要Servlet實現SingleThreadModel接口,就可以了。
? ?Servlet是單例多線程的。每個Servlet會根據請求來新建線程。也就是說你接到一個請求到Servlet,這個Servlet就會運行一個Thread。?Servlet存在線程安全的風險,解決servlet線程安全有如下三個方案:
1)實現 SingleThreadModel 接口(不建議)
? ? ?該接口為每次請求創建一個servlet實例。此接口沒有方法,跟Serializable接口一樣只是一個標識接口。如果一個Servlet被這個接口指定,那么在這個Servlet中的service()方法將不會有兩個線程被同時執行,當然也就不存在線程安全的問題。
注意!!!SingleThreadModel并不能解決所有的線程安全問題。例如,會話屬性和靜態變量仍然可以同時通過多線程的多個請求訪問,即使用實現SingleThreadModel 接口的 servlet。建議開發人員采取其他方法來解決這些問題,而不是實現此接口,SingleThreadModel這個接口 Servlet API 2.4版本過時,不推薦使用,因為它存在性能問題。
2)同步對共享數據的操作
? ? ?使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段;
3)避免使用實例變量
? ? 線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。
?
總結
以上是生活随笔為你收集整理的Servlet常见面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴5G和展锐原厂芯片开发,怎么选?
- 下一篇: 干货,记一次解决录音杂音问题