【问题标题】:how http method works in servlet?http方法如何在servlet中工作?
【发布时间】:2019-10-19 05:10:40
【问题描述】:

我的servlet 有问题。我有一个 HTML 页面,当我提交表单时,我调用 get 方法获取两个数字的总和,它给了我一个错误。但我已经在 servlet 类中声明了 get 方法。

类型:状态报告

消息:此 URL 不支持 HTTP 方法 POST

说明请求行中接收的方法是源服务器已知的,但目标资源不支持。

Servlet 代码:

public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        int a=Integer.parseInt(req.getParameter("num1"));
        int b=Integer.parseInt(req.getParameter("num2"));
        int sum=a+b;
        resp.getWriter().println(sum+ " doGet method");
    }
}

html代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Servlet</title>
  </head>
  <body>
    <form action="add" method="get" >
      Enter 1st number<input type="text" name="num1">
      Enter 2st number<input type="text" name="num2">
      <input type="submit">
    </form>
  </body>
</html>

部署描述符代码: web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletPractice1</display-name>
  <servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>com.meet.servlet.AddServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/add</url-pattern>
  </servlet-mapping>
</web-app>

【问题讨论】:

    标签: java servlets get deployment-descriptor


    【解决方案1】:

    你没有有效的doGet()方法,当你直接在地址栏中输入servlet的路径时,像Tomcat这样的web容器会尝试调用doGet()方法。

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException{
        ....        
    }
    

    或者像这样覆盖服务方法:

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(请求,响应); }

    【讨论】:

      【解决方案2】:

      Servlets 是一种允许在服务器上调用代码的技术。 HttpServlet 是一种抽象,如果您决定使用 HTTP 作为所有浏览器都使用的通信协议,它允许在服务器上调用代码。

      因此,为了了解会发生什么,您应该记住所有通信都是通过 HTTP 完成的(我知道这个问题是出于教育目的而提出的,因此答案是教育性的)

      现在,HTTP 引入了不同类型的请求,即 GET、PUT、POST 等。

      HttpServlet 通过引入不同的覆盖方法(doGetdoPost 等)来解决这个问题。 很简单,如果客户端(在这种情况下呈现表单的浏览器)想要使用 POST 方法(并且在内部提交表单),则在 servlet 中调用 doPost

      你怎么知道使用哪种方法?好吧,最简单的方法是在浏览器中按 F12,转到网络选项卡并检查请求,它会告诉你这是什么类型的请求。当您了解为什么实际上存在不同类型的请求时,您会更清楚。在这种情况下,由于您想向服务器“提交”可能会导致服务器更改的信息,因此使用 POST 方法。

      现在很明显你重写了错误的方法,现在你的 servlet 可以响应 get 请求,但与 post 请求无关,因此出现错误。覆盖 doPost 就可以了

      【讨论】:

        猜你喜欢
        • 2020-10-24
        • 2015-05-14
        • 2016-01-02
        • 2013-08-10
        • 2012-10-01
        • 2013-02-15
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多