摘要:本文主要學習了Servlet相關的接口和類。html
實現Servlet有三種方式:java
實現javax.servlet.Servlet接口。程序員
繼承javax.servlet.GenericServlet類。web
繼承javax.servlet.http.HttpServlet類。服務器
Servlet接口是最基礎的接口,若是要使用Servlet,就要實現這個接口,或者繼承其餘已經實現了這個接口的類。app
建立一個類並實現Servlet接口:ide
1 public class TestServlet implements Servlet { 2 @Override 3 public ServletConfig getServletConfig() { 4 return null; 5 } 6 7 @Override 8 public String getServletInfo() { 9 return null; 10 } 11 12 @Override 13 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 14 System.out.println("service()方法被執行……"); 15 } 16 17 @Override 18 public void init(ServletConfig config) throws ServletException { 19 System.out.println("init()方法被執行……"); 20 } 21 22 @Override 23 public void destroy() { 24 System.out.println("destroy()方法被執行……"); 25 } 26 }
GenericServlet類實現並重寫了Servlet接口的一些方法,使得程序員在開發的時候只須要關注service()方法的實現就好。學習
建立一個類並繼承GenericServlet類:編碼
1 public class TestServlet extends GenericServlet { 2 @Override 3 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 4 System.out.println("service()方法被執行……"); 5 } 6 }
HttpServlet類繼承了GenericServlet類,是對HTTP請求的特殊支持,因爲開發的項目通常遵循HTTP協議,因此常常使用的是HttpServlet類。spa
在HttpServlet的service(HttpServletRequest, HttpServletResponse)方法會去判斷當前請求是GET仍是POST,若是是GET請求,那麼會去調用本類的doGet()方法,若是是POST請求會去調用doPost()方法,這說明在子類中去重寫doGet()或doPost()方法便可。
建立一個類並繼承HttpServlet類:
1 public class TestServlet extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 super.doGet(req, resp); 5 } 6 7 @Override 8 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 9 super.doPost(req, resp); 10 } 11 }
表明當前Servlet的配置信息,封裝了ServletContext對象和配置參數信息。
能夠經過Servlet裏面的getServletConfig()方法獲取:
1 public ServletConfig getServletConfig();
經常使用方法:
1 public String getServletName();// 獲取當前Servlet的友好名稱。 2 public ServletContext getServletContext();// 獲取ServletContext對象。 3 public String getInitParameter(String name);// 獲取初始化參數,初始化參數能夠在web.xml配置文件的<servlet></servlet>標籤裏的<init-param></init-param>標籤裏設置。 4 public Enumeration<String> getInitParameterNames();// 獲取所有初始化參數,初始化參數一樣須要在web.xml配置文件的<servlet></servlet>標籤裏的<init-param></init-param>標籤裏設置。
表明當前Web應用,服務器爲每一個Web應用程序都建立一個對應的ServletContext對象,被全部客戶端共享。當Web應用啓動時自動建立,當Web應用關閉和從新啓動、服務器關閉時都會形成ServletContext銷燬。
能夠經過ServletConfig裏面的getServletContext()方法獲取:
1 public ServletContext getServletContext();
經常使用方法:
1 public String getServletContextName();// 獲取當前項目的名稱。 2 public String getServerInfo();// 返回Servlet容器名稱和版本號。 3 public ServletContext getContext(String uripath);// 經過路徑獲取ServletContext對象。 4 public String getContextPath();// 獲取服務器上當前項目的相對目錄。好比:/HelloWorld。 5 public String getRealPath(String path);// 獲得指定文件的真實路徑,從應用程序根目錄開始。好比:TestServlet獲得的是盤符:\文件夾\工做空間\項目名稱\WebContent\TestServlet。 6 public Set<String> getResourcePaths(String path);// 獲得指定相對路徑下的文件夾名和文件名,從應用程序根目錄開始,指定路徑必須以/開頭。好比:/獲得的是應用程序根目錄下的內容。 7 public URL getResource(String path) throws MalformedURLException;// 獲得指定相對路徑下的地址,從應用程序根目錄開始。好比:/獲得的是jndi:/域名/項目名/。 8 public InputStream getResourceAsStream(String path);// 將指定文件轉化爲流以便讀取,從應用程序根目錄開始。好比:index.html能夠獲取到應用程序根目錄下的index.html並轉爲流。 9 public RequestDispatcher getRequestDispatcher(String path);// 建立跳轉到指定路徑的轉發器,從應用程序根目錄開始,指定路徑必須以/開頭。 10 public RequestDispatcher getNamedDispatcher(String name);// 建立跳轉到指定Servlet名的轉發器,不須要也不能以/開頭。 11 public String getInitParameter(String name);// 獲取指定的初始化參數,初始化參數須要在web.xml配置文件的<context-param></context-param>標籤裏設置。 12 public Enumeration<String> getInitParameterNames();// 獲取全部指定的初始化參數,初始化參數也須要在web.xml配置文件的<context-param></context-param>標籤裏設置。 13 public boolean setInitParameter(String name, String value);// 設置初始化參數,效果同在web.xml配置文件的<context-param></context-param>標籤裏設置的同樣。 14 public Object getAttribute(String name);// 經過屬性名獲取屬性對象。 15 public Enumeration<String> getAttributeNames();// 獲取所有屬性名。 16 public void setAttribute(String name, Object object);// 設置屬性名和屬性對象。 17 public void removeAttribute(String name);// 經過屬性名刪除屬性對象。
RequestDispatcher實例對象是由Servlet引擎建立的,用於包裝一個要被其餘資源調用的資源,並能夠經過其中的方法將客戶端的請求轉發給所包裝的資源。
RequestDispatcher接口中定義了兩個方法:forward()方法和include()方法。forward()和include()方法接收的兩個參數,必須是傳遞給當前Servlet的service()方法的ServletRequest和ServletResponse對象,或者是對它們進行了包裝的ServletRequestWrapper和ServletResponseWrapper對象。
能夠經過ServletContext對象的getRequestDispatcher()方法和getNamedDispatcher()方法獲取:
1 public RequestDispatcher getRequestDispatcher(String path); 2 public RequestDispatcher getNamedDispatcher(String name);
請求轉發:
1 // 該方法用於將請求從一個Servlet傳遞到服務器上另外的Servlet、Jsp頁面或者Html文件,由當前的Servlet發送給另外一個Servlet,該方法必須在響應被提交給客戶端以前調用。 2 // 在當前的Servlet中能夠給請求設置屬性,設置的響應頭信息不回被忽略,可是設置的響應體信息可能會被忽略。 3 public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;
請求包含:
1 // 該方法用於在響應中包含Servlet、Jsp頁面或者Html文件,由當前的Servlet發送給客戶端,必需要在當前Servlet中設置編碼格式。 2 // 當前Servlet和要包含的資源均可以設置響應體,按前後順序輸出到客戶端。 3 public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;
請求轉發與請求包含比較:
請求轉發大可能是應用在Servlet中,轉發目標大可能是Jsp頁面。
請求包含大可能是應用在Jsp頁面中,完成多頁面的合併。