关于doGet和doPost

问题是这样的:
我用myEclipse自动生成一个servlet,什么代码也没有写!我只是想测试一下tomcat是怎么调用doGet和doPost的,前提,我没有生成任何表单!!
情况一:代码没做任何修改,运行tomcat,浏览器显示正常!
情况二:注释整个doPost方法,浏览器显示正常!
情况三:注释整个doGet方法,浏览器显示错误!!!!!(为什么tomcat不能单独调用doPost方法)
情况四:doGet和doPost互相调用,浏览器显示正常!

哪位大侠能解释以上述出现的情况,主要是第三个!!!(没有表单提交)
求详解,不能复制网上的答案!!!

积分全给!!!

10个回答

[quote]fmjsjx 写道
从浏览器键入URL时,浏览器会通过HTTP的GET请求连接服务器,到servlet时就会调用doGet方法,这个不是说默认调用doGet方法,而是浏览器的连接请求是GET请求。当通过某个页面的表单请求时,就要看表单的请求类型是POST还是GET了(其实还有其他的HTTP请求类型,不过现在基本都弃之不用了)。

高人,能否用源代码说明你的答案!! [/quote]
……
我无语了,看仔细了:
Servlet的实现没有默认方法这一说,HTTP请求是GET请求就调用doGet(),是POST就调用doPost()。
从浏览器键入URL来访问网站的请求都是GET请求,只有HTML一面的表单提交是POST时才会是POST请求,这和源码没有任何关系,而是HTTP协议以及HTML规范的要求!
你键入URL来访问网站当然是GET请求,自然要调用doGet()。
……

能把你那个自动生成的servlet贴上来么

没有表单,默认就是doGet吧

你写一个空的表单强制以post来发送请求呢

默认就是doGet()方法吧

[quote]我是这么想的,但是我看了一下午的tomcat的源代码,没看出这个根据(默认的调用是doGet方法)![/quote]
这个默认是指页面请求,页面请求不明确指明是post的话,默认就是发送get请求。

从浏览器键入URL时,浏览器会通过HTTP的GET请求连接服务器,到servlet时就会调用doGet方法,这个不是说默认调用doGet方法,而是浏览器的连接请求是GET请求。当通过某个页面的表单请求时,就要看表单的请求类型是POST还是GET了(其实还有其他的HTTP请求类型,不过现在基本都弃之不用了)。

[code="java"]protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();

if (method.equals("GET")) {
  long lastModified = getLastModified(req);
  if (lastModified == -1L)
  {
    doGet(req, resp);
  } else {
    long ifModifiedSince = req.getDateHeader("If-Modified-Since");
    if (ifModifiedSince < lastModified / 1000L * 1000L)
    {
      maybeSetLastModified(resp, lastModified);
      doGet(req, resp);
    } else {
      resp.setStatus(304);
    }
  }
}
else if (method.equals("HEAD")) {
  long lastModified = getLastModified(req);
  maybeSetLastModified(resp, lastModified);
  doHead(req, resp);
}
else if (method.equals("POST")) {
  doPost(req, resp);
}
else if (method.equals("PUT")) {
  doPut(req, resp);
}
else if (method.equals("DELETE")) {
  doDelete(req, resp);
}
else if (method.equals("OPTIONS")) {
  doOptions(req, resp);
}
else if (method.equals("TRACE")) {
  doTrace(req, resp);
}
else
{
  String errMsg = lStrings.getString("http.method_not_implemented");
  Object[] errArgs = new Object[1];
  errArgs[0] = method;
  errMsg = MessageFormat.format(errMsg, errArgs);

  resp.sendError(501, errMsg);
}

}[/code]

看这句
[code="java"]
String method = req.getMethod();
[/code]
这里的Method就是页面表单里的
[code="html"]


[/code]
当页面不指定时,默认是get

[quote]呵呵,这段代码我看过了!!!! [/quote]
我怕太长发不了啊,解释在下面呢

立即提问
相关内容推荐