什么是第一个doGet或doPost?

时间:2018-12-04 13:06:45

标签: http servlets

我对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>

2 个答案:

答案 0 :(得分:1)

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

但是您必须指定您的请求是执行doPost()的POST请求 例如:

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

答案 1 :(得分:1)

如果你没有提到那么默认它调用 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  
        }  
    }