2016-05-11 3 views
0

下の画像は、サーブレットのアーキテクチャを示しています。HttpServletクラスのdoGet()/ doPost()メソッドは、スーパークラスGenericServletのservice()メソッドにリンクされていますか?

Servlet Architecture

それは、HttpServletをクラスはGenericServletからクラスによってそのもの世話などのサービス()メソッドを実装する必要はないと言います。 HttpServletクラスでは、doGet()メソッドとdoPost()メソッドのみを実装する必要があります。

すなわちのdoGet()メソッドとdoPost()本の署名であり、この図の階層では、ダウト

方法のdoGet()の実装/ doPostメソッド()は、サービスへの呼び出しをトリガされます() GenericServletクラスではdoGet()およびdoPost()の抽象シグネチャさえも存在しないため、GenericServletクラスでは使用できません。

質問

私はサービスでこれらのメソッドにネストされた呼び出し()スーパークラスGenericServletからの方法があるという信念を持っています。これは正しい認識ですか、それとも他の方法で動作しますか?

答えて

0

あなたの疑惑はほぼ正しいです。doGet()doPost()およびその他のdoメソッドの呼び出しはHttpServletクラスにあり、GenericServletに拡張されています。これはServlet API jarのバージョン3.1(the source code starting at line 677を参照)から取られました:

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) { 
       // 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); 
    } 
} 
+0

情報の宝を明らかにしてくれてありがとうございます:) –

関連する問題