`
jzinfo
  • 浏览: 119649 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

读源码学Servlet(5)GenericServlet中的service 方法

阅读更多

观察GenericServlet源码中关于service()方法的实现:

 

//实现父类的service(ServletRequest req,ServletResponse res)方法   
 //通过参数的向下转型,然后调用重载的service(HttpservletRequest,HttpServletResponse)方法   
  
    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);  //调用重载的service(HttpServelertRequest,HttpServletResponse)方法   
    }  
    
    
    //重载的service(HttpServletRequest req, HttpServletResponse resp)方法   
    protected void service(HttpServletRequest req, HttpServletResponse resp)   
        throws ServletException, IOException   
    {   
        String method = req.getMethod();   
  
        if (method.equals(METHOD_GET)) {   
            long lastModified = getLastModified(req);   
            if (lastModified == -1) {   
                // servlet doesn't support if-modified-since, no reason   
                // to go through further expensive logic   
                doGet(req, resp);   
            } else {   
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);   
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {   
                    // If the servlet mod time is later, call doGet()   
                    // Round down to the nearest second for a proper compare   
                    // A ifModifiedSince of -1 will always be less   
                    maybeSetLastModified(resp, lastModified);   
                    doGet(req, resp);   
                } else {   
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);   
                }   
            }   
  
        } else if (method.equals(METHOD_HEAD)) {   
            long lastModified = getLastModified(req);   
            maybeSetLastModified(resp, lastModified);   
            doHead(req, resp);   
  
        } else if (method.equals(METHOD_POST)) {   
            doPost(req, resp);   
               
        } else if (method.equals(METHOD_PUT)) {   
            doPut(req, resp);           
               
        } else if (method.equals(METHOD_DELETE)) {   
            doDelete(req, resp);   
               
        } else if (method.equals(METHOD_OPTIONS)) {   
            doOptions(req,resp);   
               
        } else if (method.equals(METHOD_TRACE)) {   
            doTrace(req,resp);   
               
        } else {   
            //   
            // Note that this means NO servlet supports whatever   
            // method was requested, anywhere on this server.   
            //   
  
            String errMsg = lStrings.getString("http.method_not_implemented");   
            Object[] errArgs = new Object[1];   
            errArgs[0] = method;   
            errMsg = MessageFormat.format(errMsg, errArgs);   
               
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);   
        }   
    }

 

  

在抽象类中GenericServlet中service()是一个抽象方法,但在HttpServlet中对这个方法进行了实现。
servlet接口中定义的service()方法中的两个参数分别是servletRequest 和 ServletResponse 这两个类型。当前的http请求,如果需要在这个service()方法内部使用http消息特有的功能,也就是要调用HttpServletRequest 和HttpServletResponse来中定义的方法时,需要将请求和响应对象进行一个类型的转换,所以,在GenericServlet中,使用了两个方法来共同完成这个工作。


实现父类GenericServlet中的service(ServltRequest req,ServeltResponse res)抽象方法
   

 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);  //这里是调用重载的service(HttpServelertRequest,HttpServletResponse)方法   
    }  

     
   

 service(HttpServelertRequest,HttpServletResponse)方法: 
 
  //重载的service(HttpServletRequest req, HttpServletResponse resp)方法 ,注意参数类型
    
   

 protected void service(HttpServletRequest req, HttpServletResponse resp)   
        throws ServletException, IOException   
    {   
        String method = req.getMethod();   
  
        if (method.equals(METHOD_GET)) {   
            long lastModified = getLastModified(req);   
            if (lastModified == -1) {   
                // servlet doesn't support if-modified-since, no reason   
                // to go through further expensive logic   
                doGet(req, resp);   
            } else {   
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);   
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {   
                    // If the servlet mod time is later, call doGet()   
                    // Round down to the nearest second for a proper compare   
                    // A ifModifiedSince of -1 will always be less   
                    maybeSetLastModified(resp, lastModified);   
                    doGet(req, resp);   
                } else {   
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);   
                }   
            }   
  
        } else if (method.equals(METHOD_HEAD)) {   
            long lastModified = getLastModified(req);   
            maybeSetLastModified(resp, lastModified);   
            doHead(req, resp);   
  
        } else if (method.equals(METHOD_POST)) {   
            doPost(req, resp);   
               
        } else if (method.equals(METHOD_PUT)) {   
            doPut(req, resp);           
               
        } else if (method.equals(METHOD_DELETE)) {   
            doDelete(req, resp);   
               
        } else if (method.equals(METHOD_OPTIONS)) {   
            doOptions(req,resp);   
               
        } else if (method.equals(METHOD_TRACE)) {   
            doTrace(req,resp);   
               
        } else {   
            //   
            // Note that this means NO servlet supports whatever   
            // method was requested, anywhere on this server.   
            //   
  
            String errMsg = lStrings.getString("http.method_not_implemented");   
            Object[] errArgs = new Object[1];   
            errArgs[0] = method;   
            errMsg = MessageFormat.format(errMsg, errArgs);   
               
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);   
        }   
    }   
    

     

分享到:
评论

相关推荐

    Servlet&GenericServlet&HttpServlet源码分析.zip_GenericServle_httpser

    GenericServlet的service()方法根据请求的类型(GET、POST等)调用相应的doXXX()方法,这样我们只需要重写这些特定的方法即可处理请求。 HttpServlet是GenericServlet的子类,进一步专门化为处理HTTP协议的请求。...

    serlvet 源码 servlet-src 源文件

    1. **Servlet接口**:所有Servlet都必须实现这个接口,它定义了Servlet的基本方法,如`init()`(初始化Servlet)、`service()`(处理请求)和`destroy()`(销毁Servlet)。 2. **GenericServlet**:这是一个抽象类...

    servlet-api 源码

    在本文中,我们将深入探讨Servlet API的源码,理解其核心概念、设计模式以及在实际应用中的作用。 一、Servlet接口 Servlet接口是Servlet API的核心,所有Servlet都必须实现这个接口。它包含`service()`方法,该...

    servlet源码

    Servlet接口定义了Servlet的基本方法,如`init()`、`service()`、`destroy()`和`getServletInfo()`等。`init()`在Servlet实例化时被调用,用于初始化Servlet;`service()`处理客户端请求并生成响应;`destroy()`在...

    javax.servlet源码

    2. **GenericServlet类**:这是一个抽象类,实现了Servlet接口,提供了通用的生命周期方法实现,但`service()`方法是抽象的,需要子类重写以处理特定类型的请求。 3. **HttpServlet类**:扩展了GenericServlet,...

    servlet-api源码包

    这个源码包包含了用于构建动态Web应用程序的接口和类,是Java Servlet规范的一部分。本文将深入探讨Servlet-API中的关键概念、主要类和接口,以及它们在实际开发中的应用。 1. **Servlet接口** Servlet接口是所有...

    servlet 源码

    - **服务**:当接收到请求时,Servlet容器会调用`service()`方法,该方法会根据请求类型分派到`doGet()`或`doPost()`等方法。 - **销毁**:当Servlet不再需要时,容器调用`destroy()`方法进行清理工作,释放资源。...

    servlet api 源码jar包 Mac版

    - `Servlet`:定义了Servlet的基本行为,如init()、service()、destroy()方法,用于初始化、处理请求和销毁Servlet。 - `HttpServlet`:是Servlet的子类,专门处理HTTP协议的请求,提供了doGet()、doPost()等方法...

    javax-servlet源码包和jar文件

    `jsp.init()`, `jsp.service()`, `jsp.destroy()`分别对应Servlet的初始化、服务和销毁方法,但这些方法在JSP页面中是隐式的。 6. **Servlet配置**: 在`web.xml`部署描述符中,开发者可以配置Servlet和Filter,包括...

    servlet源码包

    5. **JSP转换过程**:了解JSP文件是如何被编译成Servlet Java源码,再编译为字节码并加载到内存中执行的。 6. **EL和JSTL**:查看`ExpressionLanguage`和`JSTL`相关的源码,理解它们如何简化动态内容的生成。 通过...

    servlet 源码

    Servlet的核心接口是`javax.servlet.Servlet`,它定义了Servlet的基本方法,如`init()`, `service()`, `destroy()`和`getServletConfig()`。`init()`方法在Servlet被加载时调用,用于初始化Servlet;`service()`...

    servlet官方源码

    5. **Servlet配置**:Servlet可以通过在web.xml文件中声明,或者使用Java注解(@WebServlet)进行配置。配置包括Servlet的URL映射、初始化参数、负载平衡策略等。 6. **多线程安全**:由于Servlet容器通常为每个...

    Tomcat 8源代码 Servlet源代码

    1. **Servlet接口**:Servlet规范定义了`javax.servlet.Servlet`接口,它包含`init()`, `service()`, `destroy()`等方法,这些方法在Servlet生命周期的不同阶段被调用。 2. **GenericServlet类**:`javax.servlet....

    servlet源码欢迎来取

    `GenericServlet`是一个抽象类,实现了Servlet和ServletConfig接口,提供了基本的Servlet功能,如`service()`方法。而`HttpServlet`是`GenericServlet`的子类,专门处理HTTP协议,它覆盖了`service()`方法,根据HTTP...

    Servlet 源码

    1. `service()`方法:这是Servlet的核心,根据请求的方法(GET、POST等)调用对应的`doXXX()`方法。例如,对于GET请求,它会调用`doGet()`;对于POST请求,它会调用`doPost()`。 2. `init()`方法:Servlet被创建时...

    servlet青鸟源码(1)

    Servlet青鸟源码分析(1) 在Web开发领域,Servlet技术是Java EE平台中的核心组件,用于处理HTTP请求和响应。"Servlet青鸟源码(1)"可能是指一系列关于Servlet的教程或参考资料,其中包含了青鸟团队对Servlet的源代码...

Global site tag (gtag.js) - Google Analytics