我正在编写一个简单的servlet。它只打印用户传递的值,或者在相应的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生命周期和其他相关概念,所以请不要解释所有这些概念。
发布于 2015-04-01 14:12:39
HttpServlet类中的服务方法检查head请求中的哪个方法,并重定向到指定的方法,比如在GET请求时调用doGet方法,当您的servlet为不同的方法做出不同的响应时使用它,比如在REST服务中,当您有get请求时,您将返回一个信息,但是当您有一个PUT请求时,您将更新一个信息,所以servlet为您提供了这个方法。
此外,它还保证您的servlet不会回答错误的请求,与您一样使用服务方法,我甚至可以使用一个奇怪的请求(如“请求方法测试”)调用您的servlet,并且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,您可以发送测试,您的服务将抛出一个“方法而不是实现”异常,但是如果您重写了它简单的回答的服务方法,那么您的servlet代码无论如何都会被执行。
发布于 2015-04-01 14:12:51
您有doGet和doPost,因此servlet可以根据访问时使用的HTTP谓词以不同的方式作出反应。
规范还定义了doHead、doOptions等。
发布于 2015-04-01 14:15:46
可能会出现这样的情况:您希望以特定的方式响应GET请求,并以某种方式响应POST请求。通常,GET请求只用于获取数据,并将back.And POST请求提供给它用于更新后端的某些内容。这就是为什么它被称为幂等的原因。但是,如果您已经重写了服务方法,那么您将只有一种响应方式。
https://stackoverflow.com/questions/29392915
复制相似问题