出自https://blog.csdn.net/ls5718/article/details/51620649
Servlet 有以下幾點優(yōu)勢:
1、性能明顯更好额衙。
2、Servlet 在 Web 服務(wù)器的地址空間內(nèi)執(zhí)行怕吴。這樣它就沒有必要再創(chuàng)建一個單獨的進(jìn)程來處理每個客戶端請求窍侧。
3、Servlet 是獨立于平臺的转绷,因為它們是用 Java 編寫的伟件。
4、服務(wù)器上的 Java 安全管理器執(zhí)行了一系列限制议经,以保護(hù)服務(wù)器計算機(jī)上的資源斧账。因此,Servlet 是可信的煞肾。
5咧织、Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機(jī)制與 applets籍救、數(shù)據(jù)庫或其他軟件進(jìn)行交互习绢。
三、怎樣理解Servlet的單實例多線程钧忽?
不同的用戶同時對同一個業(yè)務(wù)(如注冊)發(fā)出請求毯炮,那這個時候容器里產(chǎn)生的有是幾個servlet實例呢逼肯?
答案是:只有一個servlet實例。一個servlet是在第一次被訪問時加載到內(nèi)存并實例化的桃煎。同樣的業(yè)務(wù)請求共享一個servlet實例篮幢。不同的業(yè)務(wù)請求一般對應(yīng)不同的servlet。
由于Servlet/JSP默認(rèn)是以多線程模式執(zhí)行的为迈,所以三椿,在編寫代碼時需要非常細(xì)致地考慮多線程的安全性問題。
JSP的中存在的多線程問題:?
當(dāng)客戶端第一次請求某一個JSP文件時葫辐,服務(wù)端把該JSP編譯成一個CLASS文件搜锰,并創(chuàng)建一個該類的實例,然后創(chuàng)建一個線程處理CLIENT端的請求耿战。如果有多個客戶端同時請求該JSP文件蛋叼,則服務(wù)端會創(chuàng)建多個線程。每個客戶端請求對應(yīng)一個線程剂陡。以多線程方式執(zhí)行可大大降低對系統(tǒng)的資源需求,提高系統(tǒng)的并發(fā)量及響應(yīng)時間狈涮。、
四鸭栖、如何開發(fā)線程安全的Servlet
? ? ? 1歌馍、實現(xiàn) SingleThreadModel 接口?
該接口指定了系統(tǒng)如何處理對同一個Servlet的調(diào)用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時執(zhí)行晕鹊,當(dāng)然也就不存在線程安全的問題松却。這種方法只要將前面的Concurrent Test類的類頭定義更改為:
Public class Concurrent Test extends HttpServlet implements SingleThreadModel {?
…………?
}??
2、同步對共享數(shù)據(jù)的操作?
使用synchronized 關(guān)鍵字能保證一次只有一個線程可以訪問被保護(hù)的區(qū)段
3溅话、避免使用實例變量
本實例中的線程安全問題是由實例變量造成的晓锻,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的公荧。?
PS:
1) Struts2的Action是原型带射,非單實例的;會對每一個請求,產(chǎn)生一個Action的實例來處理循狰。?
Struts1 Action是單實例的窟社,spring mvc的controller也是如此。因此開發(fā)時要求必須是線程安全的绪钥,因為僅有Action的一個實例來處理所有的請求灿里。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時特別小心程腹。Action資源必須是線程安全的或同步的匣吊。
2) Struts1的Action,Spring的Ioc容器管理的bean 默認(rèn)是單實例的.
Spring的Ioc容器管理的bean 默認(rèn)是單實例的。
Struts2 Action對象為每一個請求產(chǎn)生一個實例,因此沒有線程安全問題色鸳。(實際上社痛,servlet容器給每個請求產(chǎn)生許多可丟棄的對象,并且不會導(dǎo)致性能和垃圾回收問題)命雀。
當(dāng)Spring管理Struts2的Action時蒜哀,bean默認(rèn)是單實例的,可以通過配置參數(shù)將其設(shè)置為原型吏砂。(scope="prototype )
1.jsp經(jīng)編譯后就變成了Servlet.(JSP的本質(zhì)就是Servlet,JVM只能識別java的類狐血,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
2.jsp更擅長表現(xiàn)于頁面顯示,servlet更擅長于邏輯控制.
3.Servlet中沒有內(nèi)置對象淀歇,內(nèi)置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到.Jsp是Servlet的一種簡化匈织,使用Jsp只需要完成程序員需要輸出到客戶端的內(nèi)容浪默,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成缀匕。而Servlet則是個完整的Java類浴鸿,這個類的Service方法用于生成對客戶端的響應(yīng)。
4.對于靜態(tài)HTML標(biāo)簽弦追,Servlet都必須使用頁面輸出流逐行輸出