Servlet其實是ServerApplet--小服務程序或服務鏈接器,用Java編寫的服務器端程序,主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。與經常使用的協議,如DNS,TCP/IP,HTTP相似,Servlet是做爲一整套規範存在的;同時做爲J2EE標準的一部分,定義了javaweb開發的標準。Servlet制定了java處理WEB請求的一系列標準,咱們只須要按照標準規定的去作就能夠了。
實際上,不管是Struts2的FilterDispatcher仍是SpringMvc的DispatcherServlet,其底層都是經過實現Sevlet或者Servlet類型的擴展【如:GenericServlet】來實現的。java
下圖爲Servlet3.1中的結構圖:
web
init方法調用時會接受一個ServletConfig類型的參數,用於初始化Servlet,由容器傳入。ServletConfig,顧名思義,其包含了Serlvet的配置信息。一般狀況下,咱們在web.xml文件中定義Serlvet時,會經過init-param標籤來進行參數配置。在Springmvc的配置中,一般經過如下方式來配置參數:
spring
GenericServlet是Servlet的默認實現,代碼以下:bash
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();
}
}複製代碼
從其繼承和實現關係來看,GenericServlet主要作了3件事:
1.實現了ServletConfig接口,這樣咱們就能夠直接調用ServletConfig裏面的方法;
GenericServlet實現了ServletConfig,能夠在須要的時候直接調用ServletConfig中的方法,不須要再先獲取ServletConfig對象;好比,獲取ServletContext的時候能夠直接調用getServletContext,而無需調用getServletConfig().getServletContext(),可是實際上,其底層的內部實現仍是在內部仍是進行了getServletConfig().getServletContext()的調用。
服務器
HttpServlet是基於Http協議實現的Servlet的基類,寫Servlet時直接繼承HttpServlet便可,不須要再重頭實現Servlet接口,SpringMvc中的dispatcherServlet就是HttpServlet的子類。 HttpServlet是與Http協議相關的,HttpServlet處理請求主要是經過重寫父類的service方法來完成具體的請求處理的。在service方法中首先是將ServletRequest和ServletResponse轉換成HttpServletRequest和HttpServletResponse,而後根據請求的不一樣路由到不一樣的處理過程當中去【處理方法就是咱們常見的doXXX的方法。最多見的就是doGet和doPost】
mvc