Servlet,GenericServlet,HttpServlet源码解析

继承关系:GenericServlet实现了Servlet接口,HttpServlet抽象类是GenericServlet类的子类

GenericServlet.java

public abstract class GenericServlet   
    implements Servlet, ServletConfig, java.io.Serializable  
{  
    //私有变量,保存 init()传入的ServletConfig对象的引用  
    private transient ServletConfig config;  
      
    public GenericServlet() { }  
 
    public void init(ServletConfig config) throws ServletException {  
      this.config = config;  
      this.init();   //调用了无参的 init()方法  
    }  
  
    //无参的init()方法  
    public void init() throws ServletException {  
  
    }  
        
    //空实现了destroy方法  
    public void destroy() { }               
       
    //实现了接口中的getServletConfig方法,返回ServletConfig对象  
    public ServletConfig getServletConfig()   
    {  
       return config;  
    }      
  
    //该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串  
    public String getServletInfo() {  
       return "";  
    }  
     
	//当HttpServlet继承GenericServlet抽象类时需要实现service方法
    public abstract void service(ServletRequest req, ServletResponse res)  
 throws ServletException, IOException;  
      
	//得到ServletContext实例
    public ServletContext getServletContext() {  
       return getServletConfig().getServletContext();  
    }  
      
	//得到servlet的配置参数
    public String getInitParameter(String name) {  
     return getServletConfig().getInitParameter(name);  
    }  
      
	//得到servlet的配置参数名
    public Enumeration getInitParameterNames() {  
       return getServletConfig().getInitParameterNames();  
     
 
    public String getServletName() {  
        return config.getServletName();  
    }  
        
    public void log(String msg) {  
       getServletContext().log(getServletName() + ": "+ msg);  
    }    
        
    public void log(String message, Throwable t) {  
       getServletContext().log(getServletName() + ": " + message, t);  
    }  
}
HttpServlet.java


//继承GenericServlet抽象类
public abstract class HttpServlet extends GenericServlet
    implements Serializable
{
    public HttpServlet()
    {
    }
	
	//get请求,自己的扩展类中需要覆写该方法
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if(protocol.endsWith("1.1"))
            resp.sendError(405, msg);
        else
            resp.sendError(400, msg);
    }
	//post请求,自己的扩展类中需要覆写该方法
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        if(protocol.endsWith("1.1"))
            resp.sendError(405, msg);
        else
            resp.sendError(400, msg);
    }
    protected void doHead(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        NoBodyResponse response = new NoBodyResponse(resp);
        doGet(req, response);
        response.setContentLength();
    }
	
    protected void doPut(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_put_not_supported");
        if(protocol.endsWith("1.1"))
            resp.sendError(405, msg);
        else
            resp.sendError(400, msg);
    }
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_delete_not_supported");
        if(protocol.endsWith("1.1"))
            resp.sendError(405, msg);
        else
            resp.sendError(400, msg);
    }

    protected void doTrace(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String CRLF = "\r\n";
        String responseString = (new StringBuilder()).append("TRACE ").append(req.getRequestURI()).append(" ").append(req.getProtocol()).toString();
        for(Enumeration reqHeaderEnum = req.getHeaderNames(); reqHeaderEnum.hasMoreElements();)
        {
            String headerName = (String)reqHeaderEnum.nextElement();
            responseString = (new StringBuilder()).append(responseString).append(CRLF).append(headerName).append(": ").append(req.getHeader(headerName)).toString();
        }
        responseString = (new StringBuilder()).append(responseString).append(CRLF).toString();
        int responseLength = responseString.length();
        resp.setContentType("message/http");
        resp.setContentLength(responseLength);
        ServletOutputStream out = resp.getOutputStream();
        out.print(responseString);
        out.close();
    }
	
	//重载service(ServletRequest req, ServletResponse resp)方法
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();
		//判断客户端的请求方式
        if(method.equals("GET"))
        {
            long lastModified = getLastModified(req);
            if(lastModified == -1L)
            {
                doGet(req, resp);
            } else
            {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);	//执行doGet方法,所以需要覆写doGet方法
                } else
                {
                    resp.setStatus(304);
                }
            }
        } else
        if(method.equals("HEAD"))
        {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else
        if(method.equals("POST"))
            doPost(req, resp);	//执行doPost方法,所以需要覆写doPost方法
        else
        if(method.equals("PUT"))
            doPut(req, resp);
        else
        if(method.equals("DELETE"))
            doDelete(req, resp);
        else
        if(method.equals("OPTIONS"))
            doOptions(req, resp);
        else
        if(method.equals("TRACE"))
        {
            doTrace(req, resp);
        } else
        {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object errArgs[] = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }
   //重要
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException
    {
        HttpServletRequest request;
        HttpServletResponse response;
		//将请求ServletRequest强转为HttpServletRequest,调用service(HttpServletReqeust req,HttpServletResponse resp)方法
        try
        {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        }
        catch(ClassCastException e)
        {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response); //调用service(HttpServletReqeust req,HttpServletResponse resp)方法
    }
    private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
    private static final String HEADER_IFMODSINCE = "If-Modified-Since";
    private static final String HEADER_LASTMOD = "Last-Modified";
    private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值