1.public interface Servlet
Servlet接口的基本目標是提供Servlet生命週期有關的方法:
init()
destroy()
service(ServletResquest req,ServletResponse resp):當用戶對於Servlet發出請求的時候容器會調用該方法處理用戶的請求,ServletResquest 提供用戶訪問請求數據的方法,ServletResponse提供構造Servlet響應的方法
getServletConfig()
源碼以下:java
public interface Servlet { //容器在啓動的被調用,僅調用一次 void init(ServletConfig var1) throws ServletException; //獲取Servlet配置 ServletConfig getServletConfig(); //處理具體請求 void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; //獲取Servlet的相關信息 String getServletInfo(); //Servlet銷燬後釋放資源 void destroy(); }
2.public abstruct class GenericServlet extends Object implements Servlet,ServletConfig、Serilalizable
GenericServlet是一個抽象類,是Servlet接口的直接實現
init()
init()
service()
destory()
getServletConfig()
getServletContext()
getServletInfo()
GenericServlet源碼:
web
package javax.servlet; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; import java.util.ResourceBundle; public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final String LSTRING_FILE = "javax.servlet.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings"); private transient ServletConfig config; public void destroy() { } public String getInitParameter(String name) { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameter(name); } public Enumeration getInitParameterNames() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameterNames(); } public ServletConfig getServletConfig() { return this.config; } public ServletContext getServletContext() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getServletContext(); } public String getServletInfo() { return ""; } public void init(ServletConfig config) throws ServletException { this.config = config; init(); } public void init() throws ServletException { } public void log(String msg) { getServletContext().log(getServletName() + ": " + msg); } public void log(String message, Throwable t) { getServletContext().log(getServletName() + ": " + message, t); } public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse) throws ServletException, IOException; public String getServletName() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } return sc.getServletName(); } }
3.public abstract class HttpServlet extends GenericServlet implements Serilalizable
HttpServlet類的主要方法:
1.service(HttpServletResquest req,HttpServletResponse resp)
HttpServlet重寫了Servlet接口中的service方法,該方法用於判斷用戶的請求方式,若是是Get請求就調用相應的doGet方法,若是是Post方法,就調用相應的doPost方法。所以開放人員在編寫Servlet的時候,只須要重寫doGet、doPost方法便可,而不要去重寫service方法,若是Servlet收到一個Http請求而並無調用相應的do方法,它就返回一個說明此方法對於本資源不可用的報告,在HttpServlet的源碼中有所體現
2.doGet:用來處理Get請求
3.doPost:用來處理Post請求
須要注意的是:HttpServlet方法是能夠處理Http請求的Servlet,在Servlet原有的基礎上邊添加了對Http協議的處理,所以開發人員在編寫Servlet的時候多數是繼承與HttpServlet,而不是直接去實現Servlet接口(毫無心義)。
4.Servlet生命週期:從建立到相應客戶請求直至銷燬的過程
1.加載和實例化:服務器運行中、Servlet被更改
2.初始化:調用Init()方法,能夠讀取一些固定數據、初始化JDBC的鏈接以及創建與其餘資源的鏈接等操做
3.處理請求:服務器接收到客戶端的請求時,會爲該請求建立一個請求對象和相應對象並調用Service(),service()方法肯定了請求方式,調用相應的do方法,若是有多個客戶端同時訪問Servlet時,服務器就會爲每個請求建立一個線程,這樣就能夠並行處理多個請求。
4.銷燬
5.Servlet的兩種聲明方式:兩種方式任一種均可以,我的以爲註解式在如今更爲簡單
1.基於web.xml的配置
<servlet>
<description>this is dispacther</description> //簡單的敘述,可有可無
<servlet-name>Servlet`s name</servlet-name> //Servlet的名字,不能夠和其餘的Servlet的名字出現重複的狀況
<servlet-class>Servlet`s class</servlet-class>
//指定實現Servlet的java類
<init-param>
<param-name>ConfigLocation</param-value>
<param-value>classpath/classpath*</param-value>
//以後會涉及到Spring的配置方式
</init-param>
<load-up-startup>a number</load-up-startup>
//指定Servlet的加載順序,默認爲當Servlet第一次被請求時踩開始加載,當值爲0或者大於0的時候
//表示容器在啓動時便開始加載Servlet
<async-supported>Boolean值</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Servlet`s name</servlet-name> 與上邊的name務必相同
<url-pattern>/register</url-pattern> 匹配路徑,包括精確匹配、目錄匹配、擴展名匹配
</servlet-mapping>
2.基於註解的配置
@WebServlet(
name="wtf", //Servlet`s name
urlPatterns="/" 匹配路徑,包括精確匹配、目錄匹配、擴展名匹配
displayName="",
initParams="@WebInitparam(name="",value="")",相似於web.xml的init-param
loadOnStartup="0/1", 指定Servlet的加載順序
asyncSupported="true/false" 是否支持異步處理
)
6.數據處理:HttpServletResponse接口對請求的數據進行處理
兩種數據形式:表單與超連接
當用戶的請求到達Servlet容器時,請求被包裝成了ServletResquest對象,若是是Http請求的話,請求繼續
被包裝成HttpServletResquest,處理信息的方法:
1.public String getParameter(String name) 返回name所指定的參數值(value)
2.public String[] getPatarameterValues(String name) 返回name所指定的一組參數值
3.public Enumeration getParameterNames() 返回一個集合,包含着全部用戶請求參數名
7.重定向和請求轉發
1.重定向:重定向是指的由原請求地址從新定位到某個新地址,原有的請求失效,客戶端看到的是新的請求返回的請求結果,客戶端瀏覽器的地址欄變爲新的URL;
語法:(HttpServletResponse)Resp.sendRirdect(new Url);
example:(HttpServletResponse)Resp.sendRirdect(項目名/index.jsp):從新定位到項目名下的WEB-CONTENT目錄下的index.jsp文件
具體步驟爲:
1.客戶端在ServletA發起重定向到ServletB的請求A
2.A傳遞到服務器,以後又傳遞到客戶端
3.客戶端對服務器端的ServletB發起請求B
4.請求A失效
5.完成請求B,返回客戶端
瀏覽器
重定向不只能夠定向在當前應用的全部的資源,還能夠定向其餘站點的資源
2.請求轉發:是將請求轉發到其餘地址,可是在轉發過程當中使用的是一個請求,也能夠理解爲一個Servlet
在一個應用內部請求另外一個Servlet,也就說請求轉發是基於同一個應用內部的,而不能把請求轉發到其餘應用。
語法:
使用ResquestDispatcher接口中的forward()方法,該方法能夠把請求轉發給另一個資源
(HttpServletResquest)req.getResquestDispatcher(new URL).forward((HttpServletResquest)req,(HttpServletResponse)resq);
注意new URL是同一應用的下的資源
具體步驟:
1.客戶端在ServletA中發起請求轉發到ServletB的請求A
2.在服務器內部,對ServletB進行查找,完成請求A
3.完成ServletB,返回客戶端
服務器