Servlet動態(tài)網(wǎng)頁技術(shù)詳解_JSP教程
推薦:JSP轉(zhuǎn)發(fā)和重定向的區(qū)別分析JSP轉(zhuǎn)發(fā)和重定向的區(qū)別分析,需要的朋友可以參考一下
一、Servlet簡介:
隨著互聯(lián)網(wǎng)技術(shù)的逐步普及,以及人們對互聯(lián)網(wǎng)要求提高,以前那種靜態(tài)網(wǎng)頁已經(jīng)不再是適應,我們看到今天的網(wǎng)頁不但有flash,vide等等,顯然
以前的那種靜態(tài)網(wǎng)頁展示無法解決,為了解決這個問題,SUN公司提供了一門用于解決上述出現(xiàn)的問題的技術(shù),這就是Servlet技術(shù)。
Servlet是sun公司提供的一門用于開發(fā)動態(tài)web資源的技術(shù)。
Sun公司在其API中提供了一個servlet接口,用戶若想用發(fā)一個動態(tài)web資源(即開發(fā)一個Java程序向瀏覽器輸出數(shù)據(jù)),需要完成以下2個步驟:
編寫一個Java類,實現(xiàn)servlet接口。
把開發(fā)好的Java類部署到web服務器中。
二、Servlet的運行過程:
Servlet程序是由WEB服務器調(diào)用,web服務器收到客戶端的Servlet訪問請求后:
1.Web服務器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實例對象。如果是,則直接執(zhí)行第4步,否則,執(zhí)行第2步。
2.裝載并創(chuàng)建該Servlet的一個實例對象。
3.調(diào)用Servlet實例對象的init()方法。
創(chuàng)建一個用于封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然后調(diào)用Servlet的service()方法并將請求和響應對象作為參數(shù)傳遞進去。
4.WEB應用程序被停止或重新啟動之前,Servlet引擎(WEB服務器中調(diào)用該Servlet的類)將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法。
三、Servlet的生命周期:
1.說到生命周期,那么我們就不得不提一下周期的概念,那么什么是生命周期的概念呢?
生命周期定義:一件事物,什么時候生,什么時候死,以及在其生存階段的某一時點會觸發(fā)的事件,統(tǒng)稱為該事物的生命周期。
Servlet的生命周期:
通常情況下,服務器會在Servlet第一次被調(diào)用時創(chuàng)建該Servlet類的實例對象(servlet出生);一旦被創(chuàng)建出來,該Servlet實例就會駐留在內(nèi)存中,為后續(xù)請求服務;直至web容器退出,servlet實例對象才會被銷毀(servlet死亡)。
在Servlet的整個生命周期內(nèi),Servlet的init方法只有在servlet被創(chuàng)建時被調(diào)用一次。
而對一個Servlet的每次訪問請求都導致Servlet引擎調(diào)用一次servlet的service方法。對于每次訪問請求,Servlet引擎都會創(chuàng)建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,
然后將這兩個對象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法,service方法再根據(jù)請求方式分別調(diào)用doXXX方法。servlet被銷毀前,會調(diào)用destroy() 方法。
2.Servlet接口的實現(xiàn)類:
我們知道,如果我們要實現(xiàn)Servlet接口,就必須全部實現(xiàn)里面的全部方法,然而里面的所有的方法并不是我們想要的,那這個時候,我們實現(xiàn)這個方法又有什么用呢?
所以為了解決這個問題,我們一般不會去實現(xiàn)該接口,而是會去繼承該類的實現(xiàn)類,這樣我們只要實現(xiàn)我們想要的方法就行;
2.1SUN公司提供了通常用的實現(xiàn)類:
Servlet接口SUN公司定義了兩個默認實現(xiàn)類,分別為:GenericServlet、HttpServlet。
HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet接口上添加了一些與HTTP協(xié)議處理方法,它比Servlet接口的功能更為強大。因此開發(fā)人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現(xiàn)Servlet接口。
HttpServlet在實現(xiàn)Servlet接口時,覆寫了service方法,該方法體內(nèi)的代碼會自動判斷用戶的請求方式,如為GET請求,則調(diào)用HttpServlet的doGet方法,如為Post請求,則調(diào)用doPost方法。因此,開發(fā)人員在編寫Servlet時,
通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。
由于客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用于設(shè)置Servlet的注冊名稱和Servlet的完整類名。
一個<servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。例如:
<servlet>
<servlet-name>servlet3</servlet-name>
<servlet-class>cn.baidu.serlvet.Demo3Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
2.2Servlet中的一些小細節(jié):
細節(jié)1:
同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設(shè)置值可以是同一個Servlet的注冊名。
在Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:一種格式是“*.擴展名”,另一種格式是以正斜杠(/)開頭并以“/*”結(jié)尾。
<servlet-mapping>
<servlet-name>
AnyName
</servlet-name>
<url-pattern>
*.do
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
AnyName
</servlet-name>
<url-pattern>
/action/*
</url-pattern>
</servlet-mapping>
細節(jié)2:
對于如下的一些映射關(guān)系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
問題:
當請求URL為“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個servlet響應
Servlet引擎將調(diào)用Servlet1。
當請求URL為“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應
Servlet引擎將調(diào)用Servlet3。
當請求URL為“/abc/a.do”時,“/abc/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調(diào)用Servlet1。
當請求URL為“/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調(diào)用Servlet2。
當請求URL為“/xxx/yyy/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調(diào)用Servlet2。
細節(jié)3:
如果在<servlet>元素中配置了一個<load-on-startup>元素,那么WEB應用程序在啟動時,就會裝載并創(chuàng)建Servlet的實例對象、以及調(diào)用Servlet實例對象的init()方法。
舉例:
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用創(chuàng)建必要的數(shù)據(jù)庫表和數(shù)據(jù)。
細節(jié)4:線程安全問題
當多個客戶端并發(fā)訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創(chuàng)建一個線程,并在這個線程上調(diào)用Servlet的service方法,因此service方法內(nèi)如果訪問了同一個資源的話,就有可能引發(fā)線程安全問題。
如果某個Servlet實現(xiàn)了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調(diào)用其service方法。
SingleThreadModel接口中沒有定義任何方法,只要在Servlet類的定義中增加實現(xiàn)SingleThreadModel接口的聲明即可。
對于實現(xiàn)了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程并發(fā)訪問,其采用的方式是產(chǎn)生多個Servlet實例對象,并發(fā)的每個線程分別調(diào)用一個獨立的Servlet實例對象。
實現(xiàn)SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因為Servlet引擎會創(chuàng)建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調(diào)用的問題。
事實上,在Servlet API 2.4中,已經(jīng)將SingleThreadModel標記為Deprecated(過時的)。
四、Servlet中常用的對象:
1.ServletConfig對象
1.1在Servlet的配置文件中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數(shù)。
1.2當servlet配置了初始化參數(shù)后,web容器在創(chuàng)建servlet實例對象時,會自動將這些初始化參數(shù)封裝到ServletConfig對象中,
并在調(diào)用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet
的初始化參數(shù)信息。
2.ServletContext對象
2.1WEB容器在啟動時,它會為每個WEB應用程序都創(chuàng)建一個對應的ServletContext對象,它代表當前web應用。
2.2ServletConfig對象中維護了ServletContext對象的引用,開發(fā)人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
2.3由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現(xiàn)通訊。
ServletContext對象通常也被稱之為context域?qū)ο蟆?/P>
分享:JSP運行原理和九大隱式對象說明JSP運行原理和九大隱式對象說明,需要的朋友可以參考一下
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復習整理
- JSP腳本元素和注釋復習總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-Servlet動態(tài)網(wǎng)頁技術(shù)詳解。