什麼是Servlet?
Servelt是什麼?網上有很多的回答,就拿菜鳥教程的話說:Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作爲來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。其實說明白了Servlet就是運行在服務器端的一個Java小程序,是Sun公司提供的一套規範,讓用戶來處理客戶端的請求,響應給瀏覽器一些動態資源。因此Servlet的實質就是Java代碼,通過Java代碼的API動態的向客戶端輸出數據。
Servlet規範包含了三個技術要點:1)Servlet;2)Filter(過濾器);3)Listener(監聽器)。
小試Servlet
Servlet的實現其實就是實現Servlet的一個接口,實現類要實現Servlet中的幾個方法:init(ServletConfig config)、service(ServletRequest request,ServletResponse response)以及destory()。
init(ServletConfig config)方法,即Servlet的初始化,只會在第一次訪問的時候,纔會調用這個方法,方法參數中的ServletConfig代表的是Servlet對象封裝的配置信息;service方法是每次訪問Servlet的接口都會調用;destory則是在服務器正常關閉的時候,纔會被調用。
創建好Servlet實現類之後需要在Web.xml中手動配置Servlet。指定Servlet的名字和class的位置(包含報名),然後配置訪問路徑即在Servlet-mapping中指定當瀏覽器訪問什麼路徑史訪問指定的Servlet。
然後就可以啓動Tomcat瀏覽器輸入相應的地址就可以訪問指定的Servlet。
客戶端訪問服務器的過程
客戶端在訪問服務器中我們創建的Servlet的過程是經歷了四個步驟:
1)解析請求地址,如果發現虛擬路徑,則解析web.xml文件後訪問相應的Servlet,反之則直接訪問服務器下的靜態資源。
2)先判斷Servlet是否存在於容器中,沒有就創建並存放到容器中。
3)解析客服端提交的Http請求,將其信息解析到Request對象中,創建一個表示響應的Response對象,調用指定的Servlet類中的Service(ServletRequest req,ServletResponse res)方法。
4)將Response對象封裝爲Http響應並返回給客戶端。
Servlet配置初始化信息
Servlet的基本信息可以在Servlet交給容器管理時進行參數的初始化配置。這些初始化參數信息都是配置在Web.xml中。
如果所示在Servlet配置的時候加入兩個初始化參數,在Init(ServletConfig config)中進行獲取。
Servlet的進階
Servlet中的Service方法是Tomcat的唯一會調用的,但是針對於不同的請求類型(GET、POST、PUT、DELETE等)若是寫不同的Servlet顯得十分笨重,所以可以在Service方法中自己根據請求的類型來執行相應的方法。
public class BaseServlet implements Servlet {
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config=config;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String method = request.getMethod();
if(method.equalsIgnoreCase("get")){
doGet(request,response);
}else if(method.equalsIgnoreCase("post")){
doPost(request,response);
}else{
System.out.println("請求不支持");
return;
}
}
private void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
private void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
使用的時候只需要繼承上面這個類重寫doGet、doPost方法就可以重複使用一個Servlet。
上面的BaseServlet其實就是簡單版本的HttpServlet。查看HttpServlet源碼的Service方法便可知曉,只是加了更多的驗證邏輯比如"Last-Modified"和“If-Modified-Since”的驗證等。
Servlet的雜談
在客服端訪問後臺服務器的時候會根據其請求地址來判斷是否爲虛擬路徑來進行不同的返回,這裏的虛擬路徑包括了三種情況:
1)完全匹配,訪問的資源與匹配的資源名稱完全相同才能訪問。
2)目錄匹配,只要是在一個目錄下,就回訪問那個。
3)擴展名匹配,只要以什麼結尾都會訪問。
服務啓動起來都有一個默認的歡迎界面,這裏也是一樣的,在Web.xml中的<welcome-file-list></welcome-file-list>也可以配置歡迎界面的地址。