2014-02-23 81 views
2

在servlet程序中,我们调用doGet()doPost()方法,但在servlet生命周期中说所有请求都会被重定向到service()方法。但是在HTTP servlet中,我们并没有在我们的程序中编写service()方法。那它怎么叫service()?请简单解释一下。doGet()或doPost方法如何在内部调用service()方法

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

.......// It is working fine but how internally it is calling service() 
} 
+0

你应该接受Sotrois的回答。这显然是正确的。他给了你时间写一个非常具有描述性的答案。通常情况下,其他有用的答案也是有礼貌的。 – jeremyjjbrown

回答

2

服务()方法检测用()()的HTTP方法和代表到的doGet,doPost方法和其它方法,该方法的HTTP请求中HTTPServlet的。它还将ServletRequest和ServletResponse对象封装在HttpServletRequest和HttpServletResponse对象中,这些对象包含来自HTTP标头的附加上下文数据。

您从来没有真正调用doGet()或doPost()(service()方法将会,并且在生命周期中读取它时由Web容器调用)。如果您正在编写HTTPServlet,则您也不应该覆盖service()方法。

0

任何服务方法都没有重载会很高兴servlet容器调用超类实现的服务方法。

3

,但它内部是如何调用服务()

事实并非如此。 The Javadoc of HttpServlet状态

提供了一个抽象类,子类来创建一个HTTP Servlet中 适合于Web站点。 的HttpServlet的子类必须覆盖在 至少一种方法,通常是这些中的一个:

  • 的doGet,如果servlet支持HTTP GET请求
  • 的doPost,对于HTTP POST请求
  • doPut,对于HTTP PUT请求
  • doDelete,用于HTTP DELETE请求
  • init和破坏,管理已持有的servlet的getServletInfo方法的生命,该servlet使用提供资源3210信息本身

几乎没有理由重写service方法。 service 通过将标准HTTP请求分派给每个HTTP请求类型(上面列出的doXXX方法)的处理程序 来处理标准HTTP请求。

您的自定义子类型HttpServlet继承service()方法。当Servlet容器决定你的servlet应该使用,它会调用其实现像这样

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

超级!我对这个答案很满意,我正在寻找的是我得到的。非常感谢你和stackoverflow.com – SaiRam

相关问题