日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet常见面试题

發(fā)布時間:2023/12/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet常见面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

Servlet的概念,JSP與Servlet的區(qū)別

Servlet的生命周期

Servlet中的session的工作原理,以及設(shè)置過期時間的方式

Servlet中的filter的應(yīng)用場景

JSP的動態(tài)include和靜態(tài)include

web.xml的作用

Servlet的線程安全問題

?


Servlet的概念,JSP與Servlet的區(qū)別

? ? servlet是基于java技術(shù)的web組件,由容器管理并產(chǎn)生動態(tài)的內(nèi)容,Servlet引擎作為web服務(wù)器的擴展,提供支持servlet的功能。Servlet技術(shù)帶給程序員最大的優(yōu)勢是它可以處理客戶端傳來的HTTP請求,并返回一個響應(yīng)。

? ?SUN首先發(fā)展出SERVLET,其功能比較強勁,體系設(shè)計也很先進,只是,它輸出HTML語句還是采用了老的CGI方式,是一句一句輸出,所以,編寫和修改HTML非常不方便。 后來SUN推出了類似于ASP的鑲嵌型的JSP,把JSP TAG鑲嵌到HTML語句中,這樣,就大大簡化和方便了網(wǎng)頁的設(shè)計和修改。新型的網(wǎng)絡(luò)語言如ASP,PHP,JSP都是鑲嵌型的SCRIPT語言。

JSP與Servlet的區(qū)別:

1、JSP在本質(zhì)上就是Servlet,但是兩者的創(chuàng)建方式不一樣。

2、Servlet完全是JAVA程序代碼構(gòu)成,擅長于流程控制和事務(wù)處理,通過Servlet來生成動態(tài)網(wǎng)頁很不直觀。

3、JSP由HTML代碼和JSP標簽構(gòu)成,可以方便地編寫動態(tài)網(wǎng)頁。

??????因此在實際應(yīng)用中采用Servlet來控制業(yè)務(wù)流程,而采用JSP來生成動態(tài)網(wǎng)頁。在struts框架中,JSP位于MVC設(shè)計模式的視圖層,而Servlet位于控制層。JSP是Servlet技術(shù)的擴展,JSP編譯后是“類servlet”,本質(zhì)上就是Servlet的簡易方式。Servlet和JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來,而JSP是Java和HTML組合成一個擴展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。
?

現(xiàn)在基本上不會去用JSP編寫頁面,當然初學(xué)者應(yīng)該學(xué)習(xí)一下,freemaker也用的比較較少了,現(xiàn)在主要使用前后端分離的技術(shù)。

?

Servlet的生命周期

? ? Servlet遵循嚴格的生命周期,在每個Servlet的實例的生命中有三種類型的事件,這三種事件對應(yīng)于由Servlet引擎所喚醒的三個方法:

(1)init()。當servlet第一次被裝載時,Servlet引擎會調(diào)Servlet的init()方法,只調(diào)用一次。如果某個Sevlet需要特殊的初始化需要。那么Servlet編寫人員可以重寫該方法來執(zhí)行初始化任務(wù)。這是一個可選的方法。如果某個Servlet不需要初始化,那么默認情況下將調(diào)用它父類的init方法。系統(tǒng)保證,在init方法成功完成以前,是不會調(diào)用Servlet去處理任何請求的。

(2)service()。這是Servlet最重要的方法,是真正處理請求的地方。對于每個請求,Servlet引擎將調(diào)用Servlet的service()方法,并把Servlet請求對象和Servlet響應(yīng)對象作為參數(shù)傳遞給它。

(3)destroy()。這是相對于init的可選方法,當Servlet即將被卸載時由Servlet引擎來調(diào)用,這個方法用來清除并釋放在init方法中所分配的資源。

Servlet的生命周期可以被歸納為以下幾步:
  (1) 裝載Servlet,這一項操作一般是動態(tài)執(zhí)行的。然而,Servlet通常會提供一個管理的選項,用于在Servlet啟動時強制裝載和初始化特定的Servlet;
  (2) Server創(chuàng)建一個Servlet實例;
  (3) Server調(diào)用Servlet的 init() 方法;
  (4) 一個客戶端請求到達Server;
  (5) Server創(chuàng)建一個請求對象;
  (6) Server創(chuàng)建一個響應(yīng)對象;
  (7) Server激活Servlet的service()方法,傳遞請求和響應(yīng)對象作為參數(shù);
  (8) service()方法獲得關(guān)于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息;
  (9) service()方法使用響應(yīng)對象的方法。將響應(yīng)傳回Server,最終到達客戶端。service()方法可能激活其他方法以處理請求。如doGet(),doPost()或其他程序員自己開發(fā)的方法;
  (10) 對于更多的客戶端請求,Server創(chuàng)建新的請求和響應(yīng)對象,仍然激活此servlet的service()方法,將這兩個對象作為參數(shù)傳遞給它,如此重復(fù)以上的循環(huán),但無需再次調(diào)用init()方法,Servlet一般只初始化一次;
  (11) 當Server不再需要Servlet時,比如當Server要關(guān)閉時,Server調(diào)用Servlet的destroy。


?

?

Servlet中的session的工作原理,以及設(shè)置過期時間的方式

? ? session對應(yīng)的中文翻譯是會話。會話指的是從用戶打開瀏覽器訪問一個網(wǎng)站開始,無論在這個網(wǎng)站中訪問了多少頁面,點擊了多少鏈接,都屬于同一個會話。 直到該用戶關(guān)閉瀏覽器為止,都屬于同一個會話。

? ? session保存在服務(wù)器,而sessionId通過Cookie發(fā)送給客戶端,但這個Cookie的生命不一,即只在瀏覽器內(nèi)存中存在,也就是說如果用戶關(guān)閉了瀏覽器,那么這個Cookie就丟失了。當用戶再次打開瀏覽器訪問服務(wù)器時,就不會有sessionId發(fā)送給服務(wù)器,那么服務(wù)器會認為你沒有session,所以服務(wù)器會創(chuàng)建一個session,并在響應(yīng)中把sessionId中到Cookie中發(fā)送給客戶端。你可能會說,那原來的session對象會怎樣?當一個session長時間沒人使用的話,服務(wù)器會把session刪除了!這個時長在Tomcat中配置是30分鐘,可以在${CATALANA}/conf/web.xml找到這個配置,當然你也可以在自己的web.xml中覆蓋這個配置!

web.xml

<session-config><session-timeout>30</session-timeout> <!-- 設(shè)置session失效時間,單位是min --> </session-config>

一般web系統(tǒng)都需要控制session自動失效的時間,從而控制用戶訪問系統(tǒng)超時。設(shè)置session失效有以下三種方式:

1、在主頁面或者公共頁面中加入:session.setMaxInactiveInterval(3600);參數(shù)單位是秒,即在沒有活動1小時后,session將失效。注意:這里session設(shè)置的時間是根據(jù)服務(wù)器來計算的,而不是客戶端。所以如果是在調(diào)試程序,應(yīng)該是修改服務(wù)器端時間來測試,而不是客戶端。

2、較通用的設(shè)置session失效時間的方法是在項目的web.xml中設(shè)置。

3、直接在應(yīng)用服務(wù)器中設(shè)置,例如:若容器是tomcat,可以在tomcat目錄下conf/web.xml中設(shè)置。

找到<session-config>元素,tomcat默認設(shè)置是30分鐘,只要修改這個值就可以了。

注意:如果上述三個地方如果都設(shè)置了,有個優(yōu)先級的問題,從高到低:(1)>(2)>(3)
?

?

?

Servlet中的filter的應(yīng)用場景

? ?◆ 通過配置參數(shù)encoding指定用何種字符編碼,已處理參數(shù)中的中文問題;

? ?◆ 禁止瀏覽器緩存所有動態(tài)頁面的過濾器;

? ?◆ 控制瀏覽器緩存頁面中的靜態(tài)資源的過濾器;

? ?◆ 使用Filter實現(xiàn)URL級別的權(quán)限認證(在實際開發(fā)中我們經(jīng)常把一些執(zhí)行敏感操作的servlet映射到一些特殊目錄中,并用filter把這些特殊目錄保護起來,限制只能擁有相應(yīng)訪問權(quán)限的用戶才能訪問這些目錄下的資源。);

? ?◆ 實現(xiàn)用戶自動登陸的過濾器,在用戶登陸成功后,發(fā)送一個名稱為user的cookie給客戶端,cookie的值為用戶名和md5加密后的密碼。編寫一個AutoLoginFilter,這個filter檢查用戶是否帶有名稱為user的cookie來,如果有,則調(diào)用dao查詢cookie的用戶名和密碼是否和數(shù)據(jù)庫匹配,匹配則向session中存入user對象(即用戶登陸標記),以實現(xiàn)程序完成自動登陸。

? ?

?

JSP的動態(tài)include和靜態(tài)include

(了解即可,現(xiàn)在已基本不使用jsp)

? ? ◆ 靜態(tài)include 用?include?偽碼實現(xiàn)?,不會檢查所含文件的變化,適用于包含靜態(tài)頁面?<%@ include file="included.htm" %>?。先將文件的代碼被原封不動地加入到了主頁面從而合成一個文件,然后再進行翻譯;

? ? ◆ 動態(tài)?INCLUDE?用?jsp:include?動作實現(xiàn)?<jsp:include page="included.jsp" flush="true" />, 它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)。各個文件分別先編譯,然后組合成一個文件。

?

web.xml的作用

? ??一個web中完全可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。web.xml文件是用來配置:歡迎頁、servlet、filter等的。當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的web工程。?而且web.xml的模式文件中定義的標簽并不是定死的,模式文件也是可以改變的,一般來說,隨著web.mxl模式文件的版本升級,里面定義的功能會越來越復(fù)雜,也即標簽元素的種類會越來越多,但有些是不常用的,我們只需記住一些常用的就可以了。

?

Servlet的線程安全問題

? ? Servlet 默認是單例模式,在web 容器中只創(chuàng)建一個實例,所以多個線程同時訪問servlet的時候,Servlet是線程不安全的。那么 web 容器能為每個請求創(chuàng)建一個Servlet的實例嗎?當然是可以的,只要Servlet實現(xiàn)SingleThreadModel接口,就可以了。

? ?Servlet是單例多線程的。每個Servlet會根據(jù)請求來新建線程。也就是說你接到一個請求到Servlet,這個Servlet就會運行一個Thread。?Servlet存在線程安全的風(fēng)險,解決servlet線程安全有如下三個方案:

1)實現(xiàn) SingleThreadModel 接口(不建議)

? ? ?該接口為每次請求創(chuàng)建一個servlet實例。此接口沒有方法,跟Serializable接口一樣只是一個標識接口。如果一個Servlet被這個接口指定,那么在這個Servlet中的service()方法將不會有兩個線程被同時執(zhí)行,當然也就不存在線程安全的問題。

注意!!!SingleThreadModel并不能解決所有的線程安全問題。例如,會話屬性和靜態(tài)變量仍然可以同時通過多線程的多個請求訪問,即使用實現(xiàn)SingleThreadModel 接口的 servlet。建議開發(fā)人員采取其他方法來解決這些問題,而不是實現(xiàn)此接口,SingleThreadModel這個接口 Servlet API 2.4版本過時,不推薦使用,因為它存在性能問題。

2)同步對共享數(shù)據(jù)的操作

? ? ?使用synchronized 關(guān)鍵字能保證一次只有一個線程可以訪問被保護的區(qū)段;

3)避免使用實例變量

? ? 線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。

?

總結(jié)

以上是生活随笔為你收集整理的Servlet常见面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。