【发布时间】: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 的情况下做一些工作?