【问题标题】:The default service() function of servlet classservlet 类的默认 service() 函数
【发布时间】:2015-08-06 06:33:49
【问题描述】:

我试图了解 Java 中 servlet 类的默认 service()。我正在阅读此页面:http://www.jguru.com/faq/view.jsp?EID=47730 这说 注意:doGet() 和 doPost() 方法(以及其他 HttpServlet 方法)由 service() 方法调用。 但是我在一个程序中进行了测试,我只让默认的 service() 函数运行,但我观察到只有 doGet() 被调用? doPost() 没有被调用.. 我错过了什么吗?

【问题讨论】:

  • 您是否尝试过发布操作?提供一些你试过的代码。
  • 那么HTTP请求方式是什么?显然是 GET。
  • 我的HTTP请求是 localhost:8080/Encryption/ServletLifeCycleExample" rel="nofollow">点击关注 ......如何生成对应的 Post 请求进行测试?
  • GET 请求通过在请求的 URL 部分中指定参数来从 Web 服务器检索数据。 - 这意味着 Get 方法用于将数据从服务器传输到浏览器。当您想向服务器发送一些数据时使用 POST 方法,例如文件更新、表单数据等......这意味着 POST 方法将用于将信息从浏览器传输到服务器。我上面的代码在我看来浏览器向服务器发送信息,所以应该调用 POST。奇怪!!
  • 我想我现在明白了 - GET 和 POST 必须使用如下方法标记进行编码:
    ${error} form> 然后就可以从 LoginServlet.java 文件中调用 doPost 方法。这并不是说必须发布导致调用 doPost 的 URL(如我发布的 localhost:8080... 上面)。谢谢大家。

标签: java servlets


【解决方案1】:

以下是来自hereservice 方法的完整实现 从实现中可以看出,它从请求中获取 http 方法,并根据方法调用适当的实现

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
        long lastModified = getLastModified(req);
        if (lastModified == -1) {
            // servlet doesn't support if-modified-since, no reason
            // to go through further expensive logic
            doGet(req, resp);
        } else {
            long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
            if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                // If the servlet mod time is later, call doGet()
                // Round down to the nearest second for a proper compare
                // A ifModifiedSince of -1 will always be less
                maybeSetLastModified(resp, lastModified);
                doGet(req, resp);
            } else {
                resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
            }
        }

    } else if (method.equals(METHOD_HEAD)) {
        long lastModified = getLastModified(req);
        maybeSetLastModified(resp, lastModified);
        doHead(req, resp);

    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);

    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);

    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);

    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req, resp);

    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req, resp);

    } else {
        //
        // Note that this means NO servlet supports whatever
        // method was requested, anywhere on this server.
        //

        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[1];
        errArgs[0] = method;
        errMsg = MessageFormat.format(errMsg, errArgs);

        resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    }
}

【讨论】:

  • 谢谢。这消除了疑问。根据浏览器上发生的情况调用适当的方法(我是否正确?)[向 service() 发送什么样的请求:我的意思是 Get 或 Post]。它不是来自 service() doGet() 和 doPost() 是默认调用的。
  • 是的,这就是它为 servlet API 实现的方式。此实现可能因其他供应商而异。但它几乎是一样的。
  • 如果正确,请接受此答案,以便对其他人也有帮助
【解决方案2】:

GET方法在2种情况下被调用: 1) 发出 url 请求(您输入网页) - 这就是为什么如果您没有 doGet() 的实现,您将收到异常 2) 从 html/jsp 提交表单,方法设置为“GET” 当使用 method="POST" 提交表单时调用 Post 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多