问题描述
问题是这样的:我用myEclipse自动生成一个servlet,什么代码也没有写!我只是想测试一下tomcat是怎么调用doGet和doPost的,前提,我没有生成任何表单!!情况一:代码没做任何修改,运行tomcat,浏览器显示正常!情况二:注释整个doPost方法,浏览器显示正常!情况三:注释整个doGet方法,浏览器显示错误!!!!!(为什么tomcat不能单独调用doPost方法)情况四:doGet和doPost互相调用,浏览器显示正常!哪位大侠能解释以上述出现的情况,主要是第三个!!!(没有表单提交)求详解,不能复制网上的答案!!!积分全给!!! 问题补充:package com.amaker.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestSession extends HttpServlet {public TestSession() {super();}public void destroy() {super.destroy(); }public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" This is ");out.print(this.getClass());out.println(", using the GET method");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();} public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" This is ");out.print(this.getClass());out.println(", using the POST method");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}public void init() throws ServletException {}}
解决方案
引用fmjsjx 写道从浏览器键入URL时,浏览器会通过HTTP的GET请求连接服务器,到servlet时就会调用doGet方法,这个不是说默认调用doGet方法,而是浏览器的连接请求是GET请求。当通过某个页面的表单请求时,就要看表单的请求类型是POST还是GET了(其实还有其他的HTTP请求类型,不过现在基本都弃之不用了)。高人,能否用源代码说明你的答案!! ……我无语了,看仔细了: Servlet的实现没有默认方法这一说,HTTP请求是GET请求就调用doGet(),是POST就调用doPost()。 从浏览器键入URL来访问网站的请求都是GET请求,只有HTML一面的表单提交是POST时才会是POST请求,这和源码没有任何关系,而是HTTP协议以及HTML规范的要求! 你键入URL来访问网站当然是GET请求,自然要调用doGet()。……
解决方案二:
引用呵呵,这段代码我看过了!!!! 我怕太长发不了啊,解释在下面呢
解决方案三:
看这句String method = req.getMethod();这里的Method就是页面表单里的<form name="loginForm" method="post" action="#">当页面不指定时,默认是get
解决方案四:
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); } }
解决方案五:
从浏览器键入URL时,浏览器会通过HTTP的GET请求连接服务器,到servlet时就会调用doGet方法,这个不是说默认调用doGet方法,而是浏览器的连接请求是GET请求。当通过某个页面的表单请求时,就要看表单的请求类型是POST还是GET了(其实还有其他的HTTP请求类型,不过现在基本都弃之不用了)。
解决方案六:
引用我是这么想的,但是我看了一下午的tomcat的源代码,没看出这个根据(默认的调用是doGet方法)!这个默认是指页面请求,页面请求不明确指明是post的话,默认就是发送get请求。
解决方案七:
默认就是doGet()方法吧
解决方案八:
你写一个空的表单强制以post来发送请求呢
解决方案九:
没有表单,默认就是doGet吧
解决方案十:
能把你那个自动生成的servlet贴上来么