Servlet技术浅析(二)之HttpServlet抽象类

来源:互联网 发布:mac装windows分区设置 编辑:程序博客网 时间:2024/05/20 16:11

HttpServlet抽象类是GenericServlet抽象类的子类,HttpServlet类为Servlet接口提供了与HTTP协议相关的通用实现,也就是说,HttpServlet对象适合运行在与客户端采用HTTP协议通信的Servlet容器或者Web服务器中。在开发javaWeb应用时,自定义的Servlet类一般都扩展HttpServlet类。

HttpServlet源码:

import java.io.IOException;import java.io.Serializable;import java.lang.reflect.Method;import java.text.MessageFormat;import java.util.Enumeration;import java.util.ResourceBundle;import javax.servlet.*;// Referenced classes of package javax.servlet.http://            NoBodyResponse, HttpServletRequest, HttpServletResponsepublic abstract class HttpServlet extends GenericServlet    implements Serializable{    public HttpServlet()    {    }    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);    }    protected long getLastModified(HttpServletRequest req)    {        return -1L;    }    protected void doHead(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException    {        NoBodyResponse response = new NoBodyResponse(resp);        doGet(req, response);        response.setContentLength();    }    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 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);    }    private Method[] getAllDeclaredMethods(Class c)    {        if(c.equals(javax/servlet/http/HttpServlet))            return null;        Method parentMethods[] = getAllDeclaredMethods(c.getSuperclass());        Method thisMethods[] = c.getDeclaredMethods();        if(parentMethods != null && parentMethods.length > 0)        {            Method allMethods[] = new Method[parentMethods.length + thisMethods.length];            System.arraycopy(parentMethods, 0, allMethods, 0, parentMethods.length);            System.arraycopy(thisMethods, 0, allMethods, parentMethods.length, thisMethods.length);            thisMethods = allMethods;        }        return thisMethods;    }    protected void doOptions(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException    {        Method methods[] = getAllDeclaredMethods(getClass());        boolean ALLOW_GET = false;        boolean ALLOW_HEAD = false;        boolean ALLOW_POST = false;        boolean ALLOW_PUT = false;        boolean ALLOW_DELETE = false;        boolean ALLOW_TRACE = true;        boolean ALLOW_OPTIONS = true;        for(int i = 0; i < methods.length; i++)        {            Method m = methods[i];            if(m.getName().equals("doGet"))            {                ALLOW_GET = true;                ALLOW_HEAD = true;            }            if(m.getName().equals("doPost"))                ALLOW_POST = true;            if(m.getName().equals("doPut"))                ALLOW_PUT = true;            if(m.getName().equals("doDelete"))                ALLOW_DELETE = true;        }        String allow = null;        if(ALLOW_GET && allow == null)            allow = "GET";        if(ALLOW_HEAD)            if(allow == null)                allow = "HEAD";            else                allow = (new StringBuilder()).append(allow).append(", HEAD").toString();        if(ALLOW_POST)            if(allow == null)                allow = "POST";            else                allow = (new StringBuilder()).append(allow).append(", POST").toString();        if(ALLOW_PUT)            if(allow == null)                allow = "PUT";            else                allow = (new StringBuilder()).append(allow).append(", PUT").toString();        if(ALLOW_DELETE)            if(allow == null)                allow = "DELETE";            else                allow = (new StringBuilder()).append(allow).append(", DELETE").toString();        if(ALLOW_TRACE)            if(allow == null)                allow = "TRACE";            else                allow = (new StringBuilder()).append(allow).append(", TRACE").toString();        if(ALLOW_OPTIONS)            if(allow == null)                allow = "OPTIONS";            else                allow = (new StringBuilder()).append(allow).append(", OPTIONS").toString();        resp.setHeader("Allow", allow);    }    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();    }    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);                } 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);        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);        }    }    private void maybeSetLastModified(HttpServletResponse resp, long lastModified)    {        if(resp.containsHeader("Last-Modified"))            return;        if(lastModified >= 0L)            resp.setDateHeader("Last-Modified", lastModified);    }    public void service(ServletRequest req, ServletResponse res)        throws ServletException, IOException    {        HttpServletRequest request;        HttpServletResponse response;        try        {            request = (HttpServletRequest)req;            response = (HttpServletResponse)res;        }        catch(ClassCastException e)        {            throw new ServletException("non-HTTP request or response");        }        service(request, response);    }    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");}

通过HttpServlet的源码我们看到,HttpServlet与Servelt没有关联关系,而是继承了GenericServlet,其实GenericServlet是一个抽象类,该类已经实现了Servlet, ServletConfig, Serializable这三个接口,
Servlet源码和GenericServlet源码参见《Servlet技术浅析一之GenericServlet抽象类》




0 0
原创粉丝点击