首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Servlet中使用服务方法而已经存在doGet和其他6种方法

在Servlet中使用服务方法而已经存在doGet和其他6种方法
EN

Stack Overflow用户
提问于 2015-04-01 14:04:52
回答 4查看 2.5K关注 0票数 1

我正在编写一个简单的servlet。它只打印用户传递的值,或者在相应的URL参数中。现在,在实现doGet方法时,我看到服务方法也可以执行相同的函数。其代码如下:

代码语言:javascript
运行
复制
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生命周期和其他相关概念,所以请不要解释所有这些概念。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-01 14:12:39

HttpServlet类中的服务方法检查head请求中的哪个方法,并重定向到指定的方法,比如在GET请求时调用doGet方法,当您的servlet为不同的方法做出不同的响应时使用它,比如在REST服务中,当您有get请求时,您将返回一个信息,但是当您有一个PUT请求时,您将更新一个信息,所以servlet为您提供了这个方法。

此外,它还保证您的servlet不会回答错误的请求,与您一样使用服务方法,我甚至可以使用一个奇怪的请求(如“请求方法测试”)调用您的servlet,并且servlet将响应,并保持代码的整洁。

请参阅原始服务代码:

代码语言:javascript
运行
复制
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,您可以发送测试,您的服务将抛出一个“方法而不是实现”异常,但是如果您重写了它简单的回答的服务方法,那么您的servlet代码无论如何都会被执行。

票数 4
EN

Stack Overflow用户

发布于 2015-04-01 14:12:51

您有doGet和doPost,因此servlet可以根据访问时使用的HTTP谓词以不同的方式作出反应。

规范还定义了doHead、doOptions等。

票数 1
EN

Stack Overflow用户

发布于 2015-04-01 14:15:46

可能会出现这样的情况:您希望以特定的方式响应GET请求,并以某种方式响应POST请求。通常,GET请求只用于获取数据,并将back.And POST请求提供给它用于更新后端的某些内容。这就是为什么它被称为幂等的原因。但是,如果您已经重写了服务方法,那么您将只有一种响应方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29392915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档