servlet基礎,servlet
Servlet(Server Applet),是用Java編寫的服務器端程序。其主要功能在於交互式地浏覽和修改數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般理解為後者。
Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。
最早支持Servlet標准的是JavaSoft的Java Web Server。此後,一些其它的基於Java的Web服務器開始支持標准的Servlet。
生命周期
-
客戶端請求該 Servlet;
-
加載 Servlet 類到內存;
-
實例化並調用init()方法初始化該 Servlet;
-
service()(根據請求方法不同調用doGet() 或者 doPost(),此外還有doGet()、doPut()、doTrace()、doDelete()、doOptions());
-
destroy()。
加載和實例化 Servlet。這項操作一般是動態執行的。然而,Server 通常會提供一個管理的選項,用於在 Server 啟動時強制裝載和初始化特定的 Servlet。
Server 創建一個 Servlet的實例
第一個客戶端的請求到達 Server
Server 調用 Servlet 的 init() 方法(可配置為 Server 創建 Servlet 實例時調用,在 web.xml 中 <servlet> 標簽下配置 <load-on-startup> 標簽,配置的值為整型,值越小 Servlet 的啟動優先級越高)
一個客戶端的請求到達 Server
Server 創建一個請求對象,處理客戶端請求
Server 創建一個響應對象,響應客戶端請求
Server 激活 Servlet 的 service() 方法,傳遞請求和響應對象作為參數
service() 方法獲得關於請求對象的信息,處理請求,訪問其他資源,獲得需要的信息
service() 方法使用響應對象的方法,將響應傳回Server,最終到達客戶端。service()方法可能激活其它方法以處理請求,如 doGet() 或 doPost() 或程序員自己開發的新的方法。
對於更多的客戶端請求,Server 創建新的請求和響應對象,仍然激活此 Servlet 的 service() 方法,將這兩個對象作為參數傳遞給它。如此重復以上的循環,但無需再次調用 init() 方法。一般 Servlet 只初始化一次(
只有一個對象),當 Server 不再需要 Servlet 時(一般當 Server 關閉時),Server 調用 Servlet 的 destroy() 方法。
工作模式
客戶端發送請求至服務器
服務器啟動並調用 Servlet,Servlet 根據客戶端請求生成響應內容並將其傳給服務器
服務器將響應返回客戶端
與 JSP 比較
SUN 首先發展出 Servlet,其功能比較強勁,體系設計也很先進,只是,它輸出 HTML 語句還是采用了老的 CGI 方式,是一句一句輸出,所以,編寫和修改 HTML 非常不方便。
Java Server Pages(JSP)是一種實現普通靜態HTML 和動態 HTML 混合編碼的技術,JSP 並沒有增加任何本質上不能用 Servlet 實現的功能。但是,在 JSP 中編寫靜態HTML 更加方便,不必再用 println語 句來輸出每一行 HTML 代碼。更重要的是,借助內容和外觀的分離,頁面制作中不同性質的任務可以方便地分開:比如,由頁面設計者進行 HTML設計,同時留出供 Servlet 程序員插入動態內容的空間。
後來 SUN 推出了類似於 ASP 的鑲嵌型的 JSP,把 JSP TAG 鑲嵌到 HTML 語句中,這樣,就大大簡化和方便了網頁的設計和修改。 這是 JSP 和 Servlet 區別的運作原理層面。
從網絡三層結構的角度看 JSP 和 Servlet 的區別:一個網絡項目最少分三層:data layer(數據層),business layer(業務層),presentation layer(表現層)。當然也可以更復雜。Servlet 用來寫 business layer 是很強大的,但是對於寫 presentation layer 就很不方便。JSP 則主要是為了方便寫 presentation layer 而設計的。當然也可以寫 business layer。
根據 SUN 自己的推薦,JSP中應該僅僅存放與 presentation layer 有關的東西,也就是說,只放輸出 HTML 網頁的部分。而所有的數據計算,數據分析,數據庫聯結處理,統統是屬於 business layer,應該放在 Java BEANS 中。通過 JSP 調用 Java BEANS,實現兩層的整合。
綜上所述,Servlet 是一個早期的不完善的產品,寫 business layer 很好,寫 presentation layer 就很臭,並且兩層混雜。所以,推出JSP+BEAN,用 JSP 寫 presentation layer,用 BEAN 寫 business layer。SUN 自己的意思也是將來用 JSP 替代 Servlet。這是技術更新方面 JSP 和 Servlet 的區別。
Servlet的各類用途
1、控制器作用
¡在流行的MVC三層架構中扮演著控制器的作用,控制著頁面的跳轉,參數的傳遞和業務邏輯的封裝等。
2、WEB過濾作用
¡可以通過在配置文件web.xml中的配置,控制過濾一些內容的顯示與否。(servlet過濾器)
3、WEB監聽作用
¡Servlet的監聽分為兩種:一種是環境變量監聽(ServletContext)和屬性監聽(HttpSession)。二者實現的原理都是通過JAVA的事件監聽器(EventListener)來實現的。
代碼結構
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class wuServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//可編寫使用request讀取與請求有關的信息和表單數據的代碼
//可編寫使用response指定HTTP應答狀態代碼和應答頭的代碼
PrintWriter out = response.getWriter();
//可編寫使用out對象向頁面中輸出信息的代碼
}
}
doGet()和doPost()這兩個方法是由service()方法調用的,有時可能需要直接覆蓋service()方法,比如Servlet要處理Get和Post兩種請求時。
通過Servlet向浏覽器中輸出文本信息(MyServlet.java):
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("歡迎來到工學1號館!");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/textServlet</url-pattern>
</servlet-mapping>
</web-app>