我正在读一本关于servlet的书,在那本书中给出了关于servlet类以及HttpServlet
类的简要解释。
有一个示例用于填写表单 - 该表单,servlet的doPost()
方法被类重写。但是对于登录表单的另一个示例,将覆盖service()
方法。
我想知道为什么这两种不同的方法 - 我认为通常我们会将自定义代码放入doPost()
(或doGet()
)并让service()
保持不变。使用这两种方法中的任何一种是否有任何原因,或者我可以在任何情况下使用这两种方法吗?
答案 0 :(得分:13)
不要覆盖service()
方法。首选方法是使用doPost()
进行发布,使用doGet()
进行获取。这是一个关于每个人的优秀帖子。 http://www.jguru.com/faq/view.jsp?EID=47730
如果您必须回复未使用该客户端的客户提出的请求 HTTP协议,必须使用service()。
答案 1 :(得分:4)
我认为您需要了解流程才能自行决定。 service()
的{{1}}的默认实现只是为请求方法调用适当的处理程序(GET,POST,等等)。
当您希望使用相同的方法处理所有传入方法时,您需要覆盖HttpServlet
(无论是GET,PUT还是POST请求,您都会回答所有传入方法)。如果您对单独处理每个方法感到满意,请使用默认的service()实现并覆盖特定的处理程序。
答案 2 :(得分:1)
您最有可能覆盖doXXX()方法,其中XXX代表HTTP方法,如GET,POST等。容器调用的service()
方法将决定调用哪个doXXX()。
答案 3 :(得分:1)
service()方法属于 Genericservlet ,可以重载以支持任何类型的协议,如Http,Ftp等。
然后你有专门用于处理HttpProtocol的servlet,我们称之为 HttpServlet 。 HttpServlet还为service()和doGet()以及doPost()方法提供默认实现。
为什么我们不应该覆盖service()方法?
因为覆盖服务方法不是一个好习惯。如果我们在内部调用任何doxxx方法,它将调用HttpServlet的服务方法。因此,您无需明确地调用它。
服务执行顺序():
服务(ServletRequest中,ServletResponse的) - >
- >调用
- > service(HttpServletRequest req,HttpServletResponse res)
- >调用
- > doGet / doPost(HttpServletRequest req,HttpServletResponse res)
以下是您可以覆盖服务的方式:
protected void service(HttpServletRequest req, HttpServletResponse resp) {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
doGet(req, resp);
} else if (method.equals(METHOD_HEAD)) {
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 {
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}}
仅来自SO社区的 Tomasz Nurkiewicz 提供的实施代码 Overriding Service Method
答案 4 :(得分:0)
如果您必须响应HTTP协议客户端(通常是浏览器)发出的GET或POST请求,请不要犹豫,扩展HttpServlet并使用其便捷方法。 如果必须响应未使用HTTP协议的客户端发出的请求,则必须使用service()