【发布时间】:2014-12-04 11:07:50
【问题描述】:
servlet container如何知道是调用doGet还是doPost方法。
当我发出 get 请求时,doGet 被调用,当我发出 post 请求时,doPost 被调用,但是决定这个的逻辑在哪里。
【问题讨论】:
标签: java servlets servlet-container
servlet container如何知道是调用doGet还是doPost方法。
当我发出 get 请求时,doGet 被调用,当我发出 post 请求时,doPost 被调用,但是决定这个的逻辑在哪里。
【问题讨论】:
标签: java servlets servlet-container
您永远不会真正调用doGet() 或doPost()(service() 方法会调用,并且在您阅读生命周期时由Web 容器调用)。
service() 方法检测使用的 HTTP 方法,并委托给doGet()、doPost() 和其他在HTTPServlet 中处理 HTTP 请求的方法。它还将ServletRequest 和ServletResponse 对象封装在HttpServletRequest 和HttpServletResponse 对象中,这些对象包含来自HTTP 标头的附加上下文数据。
感谢@helderdarocha。
【讨论】:
逻辑在 HTTP 协议中,它由 servlet 容器(Tomcat、Glassfish、Jetty...)管理
请求的第一个词(在 TCP 级别)是 HTTP 动词,通常是 GET 或 POST,但也可以是 DELETE、PUT、OPTIONS、HEAD、TRACE...
servlet 容器调用servlet 的service 方法,但HttpServlet.service 方法的默认实现包含调度到正确方法的逻辑。从 Javadoc 中提取:
public void service(ServletRequest req,
ServletResponse res)
throws ServletException,
java.io.IOException
将客户端请求分派到受保护的服务方法。无需重写此方法。
protected void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,
java.io.IOException
从公共服务方法接收标准 HTTP 请求并将它们分派到此类中定义的 doXXX 方法。此方法是 Servlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) 方法的 HTTP 特定版本。无需重写此方法。
【讨论】:
javax.servlet.http.HttpServlet.service(HttpServletRequest req, HttpServletResponse resp) 包含相应的逻辑。
【讨论】:
Request Method 是标准的 HTTP/1.1 令牌,作为请求标头的一部分发送
【讨论】: