1. 程式人生 > >關於Servlet基礎的一點東西

關於Servlet基礎的一點東西

剛接觸Servlet時感覺有點暈,各種與servlet相關的東西。從API上弄了點東西,供初學者參考。

Servlet是執行在伺服器端的程式,Sun只是制定了其規範(即只定義了介面),而由Servlet容器來具體實現。所以,Servlet程式的具體實現因容器的不同而不同。但是都遵循同一個規範。

javax.servlet.Servlet是個Interface,其他的各種Servlet都必須繼承或者實現這個介面。

Servlet這個介面被以下類、抽象類或者介面實現:FacesServlet(類), GenericServlet(抽象類), JspPage(介面)。

這三個裡面我們講一下GenericServlet(javax.servlet.GenericServlet):
public abstract class GenericServlet implements Servlet,ServletConfig,java.io.Serializable

以上可知,這個抽象類實現了Servlet, ServletConfig, java.io.Serializable。但這些都是空實現,而且沒有實現service方法,由容器具體實現。HttpServlet(javax.servlet.http.HttpServlet)這個有具體實現的抽象類繼承了GenericServlet,這是個基於http特定協議的servlet。舉個Servlet類的例子:
public class LoginPage extends HttpServlet

可以看到,我們一般的基於http協議程式設計的Servlet類直接繼承了HttpServlet。

在每個Servlet類中都有doGet和doPost方法,我們看看他們後面的引數,比如doPost:
public void doPost(HttpServletRequest request, HttpServletResponse response)


其實,根據規範應該有這個通用方法來服務請求:
public void service(ServletRequest req, ServletResponse res)

而HttpServlet是針對Http協議的實現,所以HttpServlet把這個方法重寫為:
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {

HttpServletRequest request;
HttpServletResponse response;

try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}

可以看到,最後實際上呼叫了:
service(HttpServletRequest req, HttpServletResponse resp)

而在這個方法內部,又根據http協議的規定,分別對請求進行分析。如果是get請求,執行doGet方法;如果是post請求,執行doPost方法,等等等等。

我們看HttpServletRequest(HttpServletResponse類似)。這是個介面,它實現了ServletRequest介面,ServletRequest中有我們熟悉的setAttribute、getAttribute、getParameter、getParameterMap、getParameterValues、getRequestDispatcher等方法。

[color=darkblue]—————————————————————低調的分割線————————————————————[/color]

[color=darkblue][size=medium]Servlet初始化階段:[/size][/color]
[list]
在下列時刻,Servlet容器裝載Servlet:
[*]Servlet容器啟動時自動裝載某些Servlet
[*]在Servlet容器啟動後,客戶首次向Servlet發出請求
[*]Servlet的類檔案被更新後,重新裝載Servlet(.class檔案)。訪問時,同第二種情況
Servlet被裝載後,Servlet容器建立一個Servlet例項並且呼叫Servlet的init()方法進行初始化。[color=red]在Servlet的整個生命週期中,init方法只被呼叫一次。[/color]
[/list]
[size=medium][color=darkblue]Servlet終止階段[/color][/size]
[list]
在下列情況,Servlet容器終止Servlet:
[*]當Web應用被終止
[*]Servlet容器終止執行
[*]Servlet容器重新裝載新例項
Servlet容器會先呼叫Servlet的destory方法。在destory方法中可以釋放Servlet所佔用的資源
[/list]

[color=darkblue]—————————————————————低調的分割線————————————————————[/color]

[color=darkblue][size=medium]訪問Servlet:[/size][/color]

要訪問Servlet,首先需要在web.xml檔案中進行配置,其格式如下:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.test</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>

我們通過瀏覽器http://localhost:8080/projectname/test來進行訪問。可以看到,通過瀏覽器地址的/test對應到了<servlet-mapping>中的url-pattern,在根據其對應的servlet-name找到<servlet>中的servlet-class,這樣就可以訪問到相應的servlet了。

有的servlet配置並沒有<servlet-mapping>,這樣的servlet的作用並不是用來訪問,而是用於servlet容器啟動之後的初始化工作。在servlet類中重寫init方法,並在web.xml中如下配置:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.test</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>

<load-on-startup>內的數字無關緊要,只是標識這個servlet在容器啟動後初始化的順序。在容器啟動後,會自動載入這個servlet,並執行其中的init方法。

[color=darkblue]—————————————————————低調的分割線————————————————————[/color]

[size=medium][color=darkblue]關於ServletContext:[/color][/size]

servlet容器啟動一個應用時,會為此應用建立一個全域性共享的ServletContext物件。此物件任何時候都可以訪問,而且所有的servlet例項共享此物件。此外還有一個全域性的ServletConfig物件,此物件包含了servlet的初始化資訊。

[size=medium][color=darkblue]如何獲得ServletContext物件?[/color][/size]

1、假設request為HttpServletRequest物件,則可以如下方式獲取:
ServletContext context = request.getSession().getServletContext();


2、ServletConfig中有getServletContext()這樣一個方法,這也是ServletConfig主要的用處。但是如何獲取ServletConfig物件呢?[color=red]注意:在前文中已經提到,我們一般的servlet繼承了HttpServlet,而HttpServlet又繼承了GenericServlet,GenericServlet實現了ServletConfig介面。[/color]因此可以這麼獲取ServletContext物件:
ServletContext context = this.getServletContext();


[color=darkblue]—————————————————————低調的分割線————————————————————[/color]

[size=medium][color=darkblue]Servlet是單例的![/color][/size]

[color=red]Servlet是單例的,即多個請求由同一個Servlet物件進行處理。雖然只有一個物件進行處理,但物件會生成多個執行緒來處理多個請求。[/color]因此,在servlet中如果涉及寫操作的話,最好不要使用成員變數,而使用區域性變數。
三種避免多執行緒混亂的方法:
1、實現javax.servlet.SingleThreadModel(servlet2.4中已經廢止)
2、使用區域性變數(推薦,忘掉其他兩種方法吧……)
3、使用synchronized塊

Servlet體系結構是建立在Java多執行緒機制之上的,它的生命週期是由Web容器負責的。當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置檔案例項化這個Servlet類。當有新的客戶端請求該Servlet時,一般不會再例項化該Servlet類,也就是有多個執行緒在使用這個例項。Servlet容器會自動使用執行緒池等技術來支援系統的執行。

相關推薦

關於Servlet基礎一點東西

剛接觸Servlet時感覺有點暈,各種與servlet相關的東西。從API上弄了點東西,供初學者參考。 Servlet是執行在伺服器端的程式,Sun只是制定了其規範(即只定義了介面),而由Servlet容器來具體實現。所以,Servlet程式的具體實現因容器的不

servlet基礎梳理(一)

span enc 準備 ++ login 中間數據 企業 efi ont 將近一個月沒看servlet了,再加上第一次學習也沒有深入。僅僅是籠統的看了一遍,編了一點基礎案例就過去了,如今再去看感覺跟沒學過一樣。這裏再用一點時間把這些基礎都梳理一下,加深印

Servlet基礎知識

上下 void att 業務 類繼承 doget 中間 pos doget() 1.什麽是Servlet? Servlet是一個符合特定規範的Java程序,是一個基於Java技術的Web組件,運行在服務器端,由Servlet容器所管理,用於生成動態的內容; 2.Servle

Servlet基礎知識,ServletContext,ServletConfig對象詳解

比較 下午 查詢 servlet對象 跳轉 目錄 有意 table err Servlet的執行過程: 通過一個簡單的Servlet程序開發,來說明Servlet程序的開發步驟和執行流程 開發Servlet的步驟: 1.1 步驟: 1)編寫java類,繼承HttpS

Servlet基礎

fig cat src mime ted option oid selected https 生成後的web.xml文件中要註冊servlet的配置 代碼如下 配置完畢後打開網頁 提交 這裏就會跳轉至servlet頁面 其余jsp代碼和servlet代碼如下 jsp代

Servlet基礎

void oid java http 方法 iter gets tee web服務 1:為什麽需要Servlert? :在jsp技術出現之前,如果想動態成HTML頁面,那就只有在服務器端運行Java程序,並生成HTML格式的內容。Servlet就是運行在服務前端的Java程

JS的數據類型及轉換(還是基礎東西

字符串 一個數 object int() 字符串類型 都是 轉換 array 區分   朋友說我這是再自娛自樂,我只想說,你說的對????????!其實也不然,這算是我對自己的基礎的一次徹底性的重新梳理以及閑的無聊,找點顯得比較有意義的事情做罷了。   回歸正題,在JS中

回歸基礎東西,不能只是“感覺會了”

sel attr name dont link after desc round tput 很多時候,覺得自己掌握的東西還是很少,做事情的效率還不是很高,希望自己能夠成長起來,認認真真做事。 -----------------------------------------

JSP Web第七章整理復習 Servlet基礎知識

pattern scrip 目的 方法 內置 文件中 javax bubuko 項目 P206-208 Servlet項目的創建,web.xml的配置及標簽含義,相關程序   創建:new 一個Servlet類,繼承自javax.servlet.http.HttpServl

1.Servlet基礎總結

org 免費下載 TE apple 平臺 com 於平 info 分享 一.簡介 1.什麽是Servlet Servlet 為創建基於 web 的應用程序提供了基於組件、獨立於平臺的方法,可以不受 CGI 程序的性能限制。Servlet 有權限訪問所有的 Java API

JAVA WEB Servlet 基礎

一、實驗目的 理解Servlet的工作原理,掌握Servlet的應用開發方法; 掌握常見Servlet ; 二、實驗要求 1. 理解Servlet的應用。 2. 掌握Servlet的程式設計技術。 3. 熟練使用Eclipse開發Servlet應用 三、實驗內容 (一)用Servlet獲取表單資料

實驗五 servlet基礎

一:實驗目的: 理解 Servlet 的工作原理,掌握 Servlet 的應用開發方法; 二:實驗內容: (一)用 Servlet 獲取表單資料 建立一個 Servlet 檔案 accept.java 和一個 register.jsp 檔案,實現用 Servlet 實現獲取 表單資料

Servlet基礎之實現第一個servlet程式

實現第一個Servlet程式 1.     建立servlet檔案 在某個盤下建立一個新的資料夾,(資料夾名字自己開心就好,也可以是原來命名好的資料夾)在此目錄下建立一個XXXX.java檔案,內容如下 packagejava_web;//這是包名,也就

看了一點東西

class Scale(Layer): def __init__(self, weights=None, axis=-1, momentum = 0.9, beta_init='zero', gamma_init='one', **kwargs): self.momentum

Servlet基礎教程

目錄 請求方式 轉發器 5、重定向 Servlet簡介     Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或

Java Web——Servlet基礎

靜態網頁: 靜態網頁是指存放在伺服器檔案系統中實實在在的HTML檔案。當用戶在瀏覽器中輸入頁面的URL,然後回車,瀏覽器就會將對應的html檔案下載、渲染並呈現在視窗中。早期的網站通常都是由靜態頁面製作的。 動態網頁: 當瀏覽器請求伺服器的某個頁面時,伺服器根據當前時間

Servlet基礎知識點整理

這學期學Java Web,把相關知識點理了一下 Servlet介面 public interface Servlet { void init(ServletConfig var1) throws ServletException; ServletConfig getServletConf

landa表示式的一點東西

1:作用 代替匿名內部類、各種回撥,簡化程式碼。在編譯時還是會將lamda表示式編譯為匿名內部類。 2:格式 2.1 多引數 (x1,x2,....) -> { 表示式1;表示式2;.......}; 2.2 單引數 x1 -> {表示式1;表示式2;

回撥函式的一點東西

        簡單來說,就是將一個函式A(),作為另一個函式的引數B(arg c1,A),當B執行時就會回撥A來完成某個事件的處理,A就為回撥函式。         允許多重回調函式。         通過傳入不同的回撥函式可以讓已有的函式執行不同的處理方法,從而實現不

Servlet基礎理解

B/S結構學習過程中涉及到一個基本的問題,即:專案是如何通過瀏覽器中輸入的url地址,從程式中獲取響應內容,並將響應內容返回至頁面? 關於上面的問題,涉及瀏覽器與tomcat伺服器之間的資訊傳遞。瀏覽器作為請求端,將請求傳送的資料以固定的格式傳遞給tomcat;tomcat