Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地浏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為後者。
Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。
PS:學習Servlet是學習JSP的基礎,故很重要。
1、WEB服務器(Tomcat)首先會找到該Servlet並裝載該Servlet
2、WEB服務器(Tomcat)會創建該Servlet的實例
3、WEB服務器(Tomcat)會調用實例對象的init()方法
4、WEB服務器(Tomcat)創建一個封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然後調用service()方法並將請求對象和響應對象作為參數傳遞進去。(實現是通過多線程技術)
5、WEB服務器在某種情況,停止對該Servlet支持,Servlet引擎將卸載該Servlet,在卸載之前會調用Servlet的destroy()方法進行銷毀
1、在Tomcat主目錄的webapps文件夾下建立一個web應用web1
2、在web1下建立文件夾WEB-INF,在該文件夾中建立web.xml [web.xml可以從 ROOT/WEB-INF/web.xml拷貝]
3、在WEB-INF目錄下建立classes目錄(Servlet在該目錄下開發),建立lib目錄
4、在classes目錄下開發Servlet
5、在web.xml中配置web.xml
6、編譯Servlet文件(編譯時需要將servlet-api.jar包加入環境變量classpath中,該jar包在Tomcat主目錄的lib文件夾下)
7、運行Tomcat
8、訪問Servlet
/** 使用實現Servlet接口的方式開發一個Servlet 要求:顯示當前時間 */ package com.pc; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet2 implements Servlet{ // 該方法用於初始化Servlet,就是把該Servlet裝載入內存,該方法只會被調用一次 public void init(ServletConfig config){ } // 得到ServletConfig對象 public ServletConfig getServletConfig(){ return null; } // 該方法是服務方法,業務邏輯代碼寫在這 // 該方法每次都會被調用 public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{ // 在控制台輸出 System.out.println("hello world:" + new java.util.Date().toString()); // 在浏覽器返回 res.getWriter().println("hello world:" + new java.util.Date().toLocaleString()); } // 該方法得到Servlet配置信息 public java.lang.String getServletInfo(){ return null; } // 銷毀該Servlet,從內存中清除,該方法只會被調用一次 public void destroy(){ } }
PS:不僅要寫Servlet文件,還要在web.xml中添加配置信息,配置信息格式如下:
Servlet2 com.pc.Servlet2 Servlet2 /Servlet2
PS:
1、在classes文件夾下編譯(當然Servlet文件也應該在這裡)
javac -encoding UTF-8 -d . Servlet文件名.java
2、不重啟更新web應用
首先,在Tomcat主目錄的conf文件夾中找到tomcat-users.xml文件,打開它,並在
然後,在localhost:8080主界面點擊,進入manager界面,找到該應用,點擊reload按鈕即可。
/** 使用繼承GenericServlet的方式開發一個Servlet */ package com.pc; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet3 extends GenericServlet{ // 該方法是服務方法,業務邏輯代碼寫在這 // 該方法每次都會被調用 public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{ res.getWriter().println("hellow,world, GenericServle."); } }
PS:不僅要寫Servlet文件,還要在web.xml中添加配置信息,配置信息格式如下:
Servlet3 com.pc.Servlet3 Servlet3 /Servlet3
/** 使用繼承HttpServlet的方式開發一個Servlet 要求:顯示當前時間 */ package com.pc; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet4 extends HttpServlet{ // 在HttpServlet中,設計者分別提供了對Post提交和Get提交的處理,默認是get提交 // doGet().doPost()底層也是調用service方法 // 處理Get請求 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{ resp.getWriter().println("doGet()"); } // 處理Post請求 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ resp.getWriter().println("doPost()"); } }
PS:不僅要寫Servlet文件,還要在web.xml中添加配置信息,配置信息格式如下:
Servlet4 com.pc.Servlet4 Servlet4 /Servlet4
PS:具體的配置步驟可以參考搜索引擎。
This is the description of my J2EE component This is the display name of my J2EE component MyServlet1 com.web1.servlet.MyServlet1 MyServlet1 /MyServlet1 MyServlet1 /abc
/servlet/index.html
有兩種格式:
第一種格式 *.擴展名 比如 *.do *.ss
第二種格式 以 / 開頭 同時以 /* 結尾 比如 /* /news/*
通配符案例:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
問題:
1、當請求URL為“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個servlet響應
Servlet引擎將調用Servlet1。
2、當請求URL為“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應
Servlet引擎將調用Servlet3。
3、當請求URL為“/abc/a.do”時,“/abc/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調用Servlet1。
4、當請求URL為“/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調用Servlet2。
5、當請求URL為“/xxx/yyy/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
Servlet引擎將調用Servlet2。
在匹配的時候,要參考的標准:
1、看誰的匹配度高,誰就被選擇
2、*.do 的優先級最低
當需要在網站啟動時,初始化一些資源時可以配置
1
PS:在servlet中如此配置就行,中間的數是整數,越小優先級越高。
配置好了之後,在網站啟動時就會調用該Servlet的init()方法,所以可以在該方法中進行需要的初始化步驟,比如定時刷新,建立內存表之類的等等。
該對象主要用於讀取 servlet的配置信息.
案例:
ServletConfigTest com.web1.servlet.ServletConfigTest encoding utf-8
如何使用:在Servlet使用如下語句
String encoding = this.getServletConfig().getInitParameter("encoding");
補充說明:這種配置參數的方式,只能被某個Servlet獨立使用.如希望讓所有的Servlet都去讀取某個參數,這樣配置:
讀取所有的參數,可以使用如下方法:
Enumerationnames=this.getServletConfig().getInitParameterNames(); while(names.hasMoreElements()){ String name=names.nextElement(); System.out.println(name); System.out.println(this.getServletConfig().getInitParameter(name)); }
1、Servlet類是單例模式的,所以要注意線程同步情況。
2、Servlet的service()方法,在每次響應時都會調用一次。
3、Servlet的init()初始化方法,destroy()銷毀方法只會被調用一次。
4、Servlet的service()方法,會根據客戶端的請求方法來決定調用對應的doXXX()方法。
5、不要重寫構造方法,因為所繼承的HttpServlet及其父類都已經對構造方法進行了某些初始化,當不了解這些系統自帶的初始化,然後盲目使用構造方法,可能導致Servlet無法創建實例。
6、不要重寫service方法(在繼承HttpServlet的情況下),因為其內部有判別客戶端請求方法的邏輯和一些其他邏輯。
7、必須重寫doPost()或者是doGet()方法中的一個。
8、當想用一種邏輯去處理Get和Post請求,可以采用委托機制,在doPost方法內加入this.doGet(request, response); 或者在doGet方法中加入this.doPost(request, response);
9、繼承HttpServlet開發Servlet是最常用的方法。
10、get提交和post提交的區別
10.1、從安全的角度看,get < post,因為get會把提交的信息顯示到地址欄。
10.2、從提交內容大小看, get < post, get一般不要大於2k,post理論無限制,但是在實際開發中,建議不要大於64k
10.3、從速度看,get > post,因為get僅僅只是獲取數據而已
11、Servlet的映射的後綴名不一定代表它就真的是那格式的文件。
----------參考《韓順平.細說Servlet》