1、什麼是Servlethtml
一個Servlet程序就是一個實現了特殊接口的java類,他由支持Servlet的WEB服務器(Servlet引擎)調用和啓動運行。一個Servlet程序負責處理他所對應的一個或者一組URL地址訪問請求,並接受客戶端發來的請求信息和產生的響應信息內容。java
2、Servlet API中幾個經常使用類的關係web
一、一個Servlet程序就是一個實現了javax.servlet.Servlet接口的java類,Servlet接口定義了Servlet引擎和Servlet程序的通信協議。數據庫
二、javax.servlet.GenericServlet是實現了Servlet接口的類。他實現了Servlet接口的基本特徵和功能apache
三、javax.servlet.http.HttpServlet是javax.servlet.GenericServlet的子類。他在GenericServlet類的基礎上對Http協議作了些擴充。api
四、客戶端調用一個支持Http的Servlet程序時,Servlet引擎將調用service方法,改方法接受兩個參數,一個是用於封裝http請求消息的對象,其類型爲HttpServletRequest,一個是表明http響應消息的對象,其類型爲HttpServletResponsetomcat
五、調用HttpServletResponse對象的getWriter()方法可得到一個文本輸出流對象。向這個流對象寫入的內容可做爲http響應消息的實體對象部分發送個客戶端。服務器
六、HttpServletRequest和HttpServletResponse是Servlet引擎和Servlet程序通訊的紐帶。這比如兩個好朋友A和B,當A去拜訪B的時候帶來兩個盒子,一個盒子裏是A給B的禮物,另外一個是用來裝B回送的禮物的。當A把HttpServletRequest給B時,B打開看了下,決定回送給A些什麼裝入到HttpServletResponseapp
舉例說明:編寫一個Servlet類url
import javax.servlet.*;
import.java.io.*
import.servlet.http.*;
public class ServletTest extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response){
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<strong>11111");
out.println("</strong>");
out.println("</html>");
}
}
3、Servlet的註冊和運行
一、Servlet程序必須經過Servlet引擎來啓動運行,而且存儲目錄有特殊要求,通常是放在WEN-INF/calssess目錄下
二、Servlet必須在web.xml裏配置才能使用
三、一個<servlet>元素用於註冊一個Servlet,他包含兩個元素<servlet-name>和<servlet-class>分別用於設置servlet的名稱和servlet的完整類名。
四、一個<servlet-maping>用於映射一個註冊好的servlet的對外訪問路徑,它包含兩個元素,<servlet-name>和<servlet-url>分別用於指定Servlet的註冊名稱和Servlet的對外訪問路徑
<web-app>
....................
<servlet>
<servlet-name>AnyName</servlet-name>
<servlet-class>com.cws.servlet.HelloServlet<servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AnyName<servlet-name>
<servlet-url>/demo/hello.html</servlet-url>
</servlet-mapping>
....................
<web-app>
4、Servlet的映射細節
一、同一個Servlet能夠被映射到多個URL上
即多個<servlet-mapping>元素中的<servlet-name>中指定的名字能夠是同一個。
二、在servlet的url中可使用(*)通配符,而且通配符只能有兩種形式,一種是以*.擴展名,另外一種是已/開頭已/*結尾
5、Servlet激活器
在每一個web應用程序的WEB-INF目錄下都有一個web.xml文件,其中記錄了servlet的一些配置信息,在tomcat的conf目錄下也有一個web.xml文件,這個xml文件是全部在該tomcat上部署的web應用程序的基礎配置,就是說,每一個web應用程序的web.xml都是在 conf/web.xml上的基礎上進行擴展和覆蓋的。
在一些web應用程序的web.xml文件中可能找到下面的映射:
<servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
這說明當匹配/servlet/*路徑時,會調用一個註冊名稱爲invoker的Servlet。但是在web.xml文件中根本找不到這個 Servlet的註冊。這裏注意,一個web應用程序的部署描述除了包含在該應用程序內部的web.xml文件中,還包含<tomcat主目 錄>\conf目錄下的web.xml文件中的全局設置信息,在<tomcat主目錄>\conf\web.xml文件中能夠看到:
<servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet>
這樣,若是有多個web應用程序要用到這個Servlet,咱們沒必要在每一個web應用程序中都單獨註冊這個servlet,而只需在web.xml文件中 映射其訪問路徑便可。這個Servlet的做用就是激活和調用任何其餘Servlet,被稱爲Servlet激活器。 <load-on-startup>2</load-on-startup>設置它隨Tomcat的啓動而加載(其中的2表明加載的優先順序)。因此,在web 應用程序中爲Servlet激活器invoker映射的訪問路徑以"/*"結尾,即便某個Servlet程序沒有在web.xml文件中註冊,咱們只需將 Servlet激活器所映射的訪問路徑中的通配符(*)替換爲這個Servlet的完整類名,就能夠經過servlet激活器來調用這個Servlet程 序。
6、缺省的Servlet
1.在tomcat安裝目錄中:conf下的web.xml中有這樣一個代碼:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
servlet的映射路徑爲一個(/),稱之爲缺省的servlet。則這個servlet就成爲了當前web應用程序的缺省servlet。
缺省的servlet的做用爲:凡是在web.xml文件總找不到匹配的<servlet-mapping>元素的URL,他們的方位請求都將交給缺省的servlet處理。也就是說,缺省的servlet用於處理全部其餘servlet不處理的訪問請求。
2.當訪問tomcat服務中的某個靜態html文件和圖片時,其實是在訪問這個缺省的servlet。
3.把上述中的代碼註釋掉,重啓tomcat服務器,輸入http://localhost:8080 ,將發現頁面中的圖片將顯示不出,也便是由於這個緣由
7、Servlet查詢數據庫的過程
8、Servlet的運行過程
一、Servlet引擎檢查是否已經裝載建立了改Servlet對象,若是是則執行第四步,不然執行第二步。
二、裝載並建立一個Servlet對象
三、調用Servlet對象的init()方法
四、建立一個用於封裝請求消息的HttpServletRequest類型對象和一個表明響應消息的HttpServletResponse對象,而後調用Servlet的Service方法,並把請求消息的對象和響應消息的對象傳進去
五、web程序被中止或者從新啓動時,Servlet引擎將卸載Servlet程序。並在卸載前調用Servlet的destroy()方法
9、Servlet運行過程-》特殊說明
一、在<servlet>元素中嵌套一個<load-on-startup>元素,web程序在啓動的時候就會裝載並建立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>
二、在servlet的生命週期中,init()方法和destroy()方法只被調用一次。而service()方法每一次請求都調用一次。
三、tomcat也提供了是否自動從新裝載被修改的servlet的選項,在tomcat目錄下的conf子目錄的server.xml中的<context>中的reloadable改成true。
10、