在已经存在 doGet 和其他 6 个方法的情况下在 Servlet 中使用 Service 方法

Use of the Service method in Servlet while there is already doGet and other 6 methods present

我正在编写一个简单的 servlet。它只打印 user 传递的值,或者在各自的 URL 参数中。现在在实现 doGet 方法时,我看到服务方法也可以执行相同的功能。下面的代码:

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {


    PrintWriter o = resp.getWriter();
    String user = req.getParameter("username");

    HttpSession session = req.getSession();
    ServletContext context = req.getServletContext();

    if (user != "" && user != null) {

        session.setAttribute("myhuzu", user);
        context.setAttribute("myhuzu", user);
    }

    o.println("request parameter has value " + user);
    o.println("session parameter  has user name as "
            + session.getAttribute("myhuzu"));

    o.println("context parameter  has user name as "
            + context.getAttribute("myhuzu"));

    o.println("init parameter  has user name as "
            + getServletConfig().getInitParameter("default"));


}

}

所以我的问题是,为什么我们需要 doGet 或 doPOST 方法,当服务方法本身负责所有这些时 thing.As 上面的代码运行完美,如果保留在 doGet 方法中它也运行完美,那么为什么他们不只保留一个呢? 注意:我非常了解 servlet 生命周期和其他相关概念,所以请不要解释所有这些概念。

HttpServlet 中的服务方法 class 检查头部请求中的方法并重定向到指定的方法,例如当它是一个 get 请求时将调用 doGet 方法,当您的 servlet 响应时使用它对于不同的方法有不同的目的,比如在 REST 服务中,当你有一个 GET 请求时,你会 return 一个信息,但是当你有一个 PUT 请求时,你会更新一个信息,所以 servlet 提供这个方法给你。

另外它保证你的 servlet 不会回答错误的请求,像你一样使用服务方法,我可以调用你的 servlet,即使有像 "request method TEST" 这样的奇怪请求,servlet 也会响应,并让您的代码更简洁。

查看原服务代码:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long errMsg;
        if(method.equals("GET")) {
            errMsg = this.getLastModified(req);
            if(errMsg == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < errMsg) {
                    this.maybeSetLastModified(resp, errMsg);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if(method.equals("HEAD")) {
            errMsg = this.getLastModified(req);
            this.maybeSetLastModified(resp, errMsg);
            this.doHead(req, resp);
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg1 = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg1 = MessageFormat.format(errMsg1, errArgs);
            resp.sendError(501, errMsg1);
        }

    }

它根据使用的请求方法做出不同的反应。

如果您执行自定义 http 请求,您可以设置您想要的方法,而不是 GET、PUT 或 DELETE,您可以发送 TEST,您的服务将抛出 "Method not implementation" 异常,但如果您覆盖简单的服务方法会回答,无论如何都会执行您的 servlet 代码。

您有 doGet 和 doPost 以便 servlet 可以根据访问它时使用的 HTTP 动词以不同的方式做出反应。

该规范还定义了 doHead、doOptions 等

可能有这样的场景,比如您想以特定方式响应 GET 请求,并以某种方式响应 POST 请求。GET 请求通常只用于获取数据并给它 back.And POST 请求是为了更新 backend.That 中的某些东西,为什么它被称为幂等。 但是,如果您改写了服务方法,您将只有一种响应方式。

服务方法可以服务于 Get 和 Post 请求。

但是让我们假设有一种情况,您希望确保除了使用 POST 请求之外没有人调用您的 servlet, 例如:提交登录请求时

如果您允许任何人在这种情况下使用 GET;您将制造严重的安全漏洞(因为 GET 请求将显示 URL 中的所有登录信息)

所以你实施POST方法作为保证。