【问题标题】:What is called first doGet or doPost? [duplicate]什么叫做先doGet或doPost? [复制]
【发布时间】:2018-12-04 13:06:45
【问题描述】:

我对 doGet doPost 优先级有疑问(如果有的话)。这是我的 HelloServlet 类:

public class HelloServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    doPost(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.getWriter().println("Hello, World Post!");
}


@Override
public void init() throws ServletException {
    System.out.println("Servlet " + this.getServletName() + " has started.");
}

@Override
public void destroy() {
    System.out.println("Servlet " + this.getServletName() + " has stopped.");
}

这个类被映射到 /greeting URL。当我现在尝试访问此页面时,一切都很好。但是当我更改 doPost 和 doGet 方法时,我给了我一个错误:HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET。每次我读到 doGet 和 doPost 时,我都认为这些方法是可以互换的。那么这个版本的这些方法有什么问题呢?

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

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().println("Hello, World Post!");
}

这当然不会引起异常,因为 doGet 存在,但它不会做任何工作。当我删除 doGet 方法时,它会引发异常。

你能告诉我在我使用我的代码 URL 的那一刻到底发生了什么吗? http://localhost:8080/greeting

为什么在doGet完全丢失的情况下,客户端无法使用doPost方法从服务器获取数据?

谢谢!

更新 WEB.xml 文件

<display-name>Hello World Application</display-name>

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.wrox.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/greeting</url-pattern>
</servlet-mapping>

【问题讨论】:

  • stackoverflow.com/questions/12105584/… 检查这个问题。您在 web.xml 中的条目是否正确?
  • 我想是因为使用 doGet 方法一切正常。我的问题更可能是关于客户端发起某些请求时如何调用 doGet 和 doPost 的原则。
  • 阅读 javadoc。这一切都在那里解释。当您向该 URL 发送 HTTP GET 请求时调用 doGet();当您发送 HTTP POST 请求时调用 doPost()。它们不可互换。
  • 在我脑海深处的某个地方,我知道这两种方法之间存在更大的差异,但我仍然看不到。我现在看到的一切是我可以用这些方法做同样的事情——我知道不同的参数传递和所有基本的东西,但我仍然不知道为什么我的代码只有在我使用 doPost 方法时才能使用能够从doGet调用doPost,所有的逻辑都在doPost中,一切都会好起来的。所以这意味着 doPost 完成了所有工作。
  • 或者也许有人可以给我一个例子,只实现 doPost 方法并在没有 doGet 的情况下做一些工作?

标签: http servlets


【解决方案1】:

如果您不指定请求方法,默认情况下它将是 GET,这意味着将调用 doGet()。 例如:http://www.anywebsite.com 是默认的 GET 请求。

但是你必须指定你的请求是一个 POST 请求才能执行 doPost() 示例:

<form action="/servlet" method="POST"> <input type="text" name="something" </form>

【讨论】:

  • 谢谢,这是我的错,但我不确定 GET 是否是默认调用方法。自从我在这里发布我的最后一个问题以来,我做了一些研究,这是我期望的答案。我通常会被简单或明显的东西卡住......:)
【解决方案2】:

如果你没有提到,那么默认它调用 doGet 方法 但是如果你必须在下面的代码中指定你的请求是一个 POST 就像然后 tomcat 调用服务方法,服务方法决定请求的位置应该去

<form action="/servlet" method="POST">
 <input type="text" name="something"
</form>

受保护的服务方法检查请求的类型,如果请求类型为get,则调用doGet方法,如果请求类型为post,则调用doPost方法,以此类推。我们来看内部代码:

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);  
            }   
    //rest of the code  
        }  
    }  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2014-08-09
    • 2011-07-09
    • 2016-02-15
    • 2011-08-18
    相关资源
    最近更新 更多