リードソースサーブレット(5)Genericサーブレットのサービスメソッド


GenericServiceソースのサービス()メソッドの実装を確認します.
 
//     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);   
        }   
    }

 
  
抽象クラスではGenericService()は抽象メソッドであるが,HttpServiceではこのメソッドを実装している.servletインタフェースで定義されたサービス()メソッドの2つのパラメータは、servletRequestとサーブレットResponseの2つのタイプです.現在のhttpリクエストは、このサービス()メソッドの内部でhttpメッセージ固有の機能、すなわちHttpServeretRequestとHttpServeretResponseで定義されたメソッドを呼び出す必要がある場合、リクエストとレスポンスオブジェクトを1つのタイプに変換する必要があるため、GenericServertでは、この作業を共同で完了するために2つのメソッドが使用されている.
親GenericServicesのサービス(ServiceRequest req,ServiceltResponse 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)     
    }  

        
Services(HttpServiceertRequest,HttpServiceletResponse)メソッド://リロードされたサービス(HttpServiceletRequest req,HttpServiceletResponse 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);   
        }   
    }