servlet中service() doGet() doPost() 方法
2016-10-09 21:15
495 查看
http://blog.csdn.net/truong/article/details/17038687
1、HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个
HTTP Servlet,就需要扩展 HttpServlet 类,该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。当表单信息被提交时,会指定服务器应执行哪一个Servlet(或其它的程序)。HttpServlet 类包含 init()、destroy()、service() 等方法,其中 init() 和 destroy() 方法是继承的.
2、HTTP Servlet 的service() 方法
service() 方法是 Servlet 的核心。
每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。
在 HttpServlet 中已存在 service()方法.缺省的服务功能是调用与
HTTP 请求的方法相应的 do 功能。
例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet()。
service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!
service()是在javax.servlet.Servlet接口中定义的, 在 javax.servlet.GenericServlet中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet
是javax.servlet.GenericServlet 的子类.
Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能.因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的
do 方法就可以了。
当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
当一个客户通过HTML 表单发出一个HTTP
GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
我们也需要把Servlet做成既能处理GET请求,也能够处理POST请求(eg:Servlet要处理GET和POST两种请求),这只需要在doPost方法中调用doGet方法,或者覆盖 service方法(service方法调用doGet、doPost、doHead等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。
注意:一般会在service()中实现对父类方法的同参数表重载,即写上super.service(req, resp);
即使有了service()方法,也要把doGet()和doPost()方法标识出来!!
-------------------------------------------
HttpServlet 里的三个方法:service(HttpServletRequest
req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系:
在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet
或是doPost方法,我们可以查看HttpServlet 类的service方法: 我在tomcat的lib目录下,解压servlet-api.jar,然后用反编译软件把lib\javax\servlet\http下的HttpServlet.class反编译,看里头的service()方法的原代码:
注意,sun只是定义了servlet接口,而实现servlet接口的就是类似于tomcat的服务器,所以我是在tomcat的安装目录下找到实现的类。
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if(method.equals("GET"))
{
long lastModified = getLastModified(req);
if(lastModified == -1L)
{
doGet(req, resp);
} else
{
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if(ifModifiedSince < (lastModified / 1000L) * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else
{
resp.setStatus(304);
}
}
} else
if(method.equals("HEAD"))
{
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else
if(method.equals("POST"))
doPost(req, resp);
else
if(method.equals("PUT"))
doPut(req, resp);
else
if(method.equals("DELETE"))
doDelete(req, resp);
else
if(method.equals("OPTIONS"))
doOptions(req, resp);
else
if(method.equals("TRACE"))
{
doTrace(req, resp);
} else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object errArgs[] = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
从上面可以看出 这里的service是用来转向的,但是如果你在自己的servlet类中覆盖了service方法,比如说你的service是这样的:
Java代码
1. public void service(ServletRequest req, ServletResponse res)
2. throws ServletException, IOException {
3. res.getOutputStream().print(
4. "image is <img src='images/downcoin.gif'></img><br>");
5. }
那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet
都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。
比如说:你的客户端代码是:
Java代码
1. <%@page contentType="text/html; charset=utf-8"%>
2. <html>
3. <head><title>选择</title></head>
4. <body>
5. 请选择你喜欢的水果:<br>
6. <form action = "Test" method = "post">
7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>
8. <input type="checkbox" name="fruit" value ="orange">桔子<br>
9. <input type="checkbox" name="fruit" value ="mango">芒果<br>
10. <input type="submit" value="提交">
11. </form>
12. </body>
13. </html>
14.
15. 服务端servlet是:Test类
16.
17. import java.io.IOException;
18.
19. import javax.servlet.ServletException;
20. import javax.servlet.ServletOutputStream;
21. import javax.servlet.ServletRequest;
22. import javax.servlet.ServletResponse;
23. import javax.servlet.http.HttpServlet;
24. import javax.servlet.http.HttpServletRequest;
25. import javax.servlet.http.HttpServletResponse;
26.
27. /**
28. * 演示service方法
29. */
30. public class Test extends HttpServlet {
31.
32. public void service(ServletRequest req, ServletResponse res)
33. throws ServletException, IOException {
34. res.getOutputStream().print("This is the service");
35.
36. }
37.
38. protected void doGet(HttpServletRequest request,
39. HttpServletResponse response) throws ServletException, IOException {
40. doPost(request,response);
41.
42. }
43. protected void doPost(HttpServletRequest request,
44. HttpServletResponse response) throws ServletException, IOException {
45. ServletOutputStream out=response.getOutputStream();
46. String[] args=(String[])request.getParameterValues("fruit");
47. for(int i=0;i<args.length;i++){
48. out.print(args[i]+"<br>");
49. }
50.
51. }
52. }
点击提交后:页面输出结果为“This is the service“;
所以,我们在写servlet的时候,一般都是重写doGet或doPost方法,不会管service方法。
1、HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个
HTTP Servlet,就需要扩展 HttpServlet 类,该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。当表单信息被提交时,会指定服务器应执行哪一个Servlet(或其它的程序)。HttpServlet 类包含 init()、destroy()、service() 等方法,其中 init() 和 destroy() 方法是继承的.
2、HTTP Servlet 的service() 方法
service() 方法是 Servlet 的核心。
每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。
在 HttpServlet 中已存在 service()方法.缺省的服务功能是调用与
HTTP 请求的方法相应的 do 功能。
例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet()。
service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!
service()是在javax.servlet.Servlet接口中定义的, 在 javax.servlet.GenericServlet中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet
是javax.servlet.GenericServlet 的子类.
Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能.因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的
do 方法就可以了。
当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
当一个客户通过HTML 表单发出一个HTTP
GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
我们也需要把Servlet做成既能处理GET请求,也能够处理POST请求(eg:Servlet要处理GET和POST两种请求),这只需要在doPost方法中调用doGet方法,或者覆盖 service方法(service方法调用doGet、doPost、doHead等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。
注意:一般会在service()中实现对父类方法的同参数表重载,即写上super.service(req, resp);
即使有了service()方法,也要把doGet()和doPost()方法标识出来!!
-------------------------------------------
HttpServlet 里的三个方法:service(HttpServletRequest
req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系:
在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet
或是doPost方法,我们可以查看HttpServlet 类的service方法: 我在tomcat的lib目录下,解压servlet-api.jar,然后用反编译软件把lib\javax\servlet\http下的HttpServlet.class反编译,看里头的service()方法的原代码:
注意,sun只是定义了servlet接口,而实现servlet接口的就是类似于tomcat的服务器,所以我是在tomcat的安装目录下找到实现的类。
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if(method.equals("GET"))
{
long lastModified = getLastModified(req);
if(lastModified == -1L)
{
doGet(req, resp);
} else
{
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if(ifModifiedSince < (lastModified / 1000L) * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else
{
resp.setStatus(304);
}
}
} else
if(method.equals("HEAD"))
{
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else
if(method.equals("POST"))
doPost(req, resp);
else
if(method.equals("PUT"))
doPut(req, resp);
else
if(method.equals("DELETE"))
doDelete(req, resp);
else
if(method.equals("OPTIONS"))
doOptions(req, resp);
else
if(method.equals("TRACE"))
{
doTrace(req, resp);
} else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object errArgs[] = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
从上面可以看出 这里的service是用来转向的,但是如果你在自己的servlet类中覆盖了service方法,比如说你的service是这样的:
Java代码
1. public void service(ServletRequest req, ServletResponse res)
2. throws ServletException, IOException {
3. res.getOutputStream().print(
4. "image is <img src='images/downcoin.gif'></img><br>");
5. }
那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet
都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。
比如说:你的客户端代码是:
Java代码
1. <%@page contentType="text/html; charset=utf-8"%>
2. <html>
3. <head><title>选择</title></head>
4. <body>
5. 请选择你喜欢的水果:<br>
6. <form action = "Test" method = "post">
7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>
8. <input type="checkbox" name="fruit" value ="orange">桔子<br>
9. <input type="checkbox" name="fruit" value ="mango">芒果<br>
10. <input type="submit" value="提交">
11. </form>
12. </body>
13. </html>
14.
15. 服务端servlet是:Test类
16.
17. import java.io.IOException;
18.
19. import javax.servlet.ServletException;
20. import javax.servlet.ServletOutputStream;
21. import javax.servlet.ServletRequest;
22. import javax.servlet.ServletResponse;
23. import javax.servlet.http.HttpServlet;
24. import javax.servlet.http.HttpServletRequest;
25. import javax.servlet.http.HttpServletResponse;
26.
27. /**
28. * 演示service方法
29. */
30. public class Test extends HttpServlet {
31.
32. public void service(ServletRequest req, ServletResponse res)
33. throws ServletException, IOException {
34. res.getOutputStream().print("This is the service");
35.
36. }
37.
38. protected void doGet(HttpServletRequest request,
39. HttpServletResponse response) throws ServletException, IOException {
40. doPost(request,response);
41.
42. }
43. protected void doPost(HttpServletRequest request,
44. HttpServletResponse response) throws ServletException, IOException {
45. ServletOutputStream out=response.getOutputStream();
46. String[] args=(String[])request.getParameterValues("fruit");
47. for(int i=0;i<args.length;i++){
48. out.print(args[i]+"<br>");
49. }
50.
51. }
52. }
点击提交后:页面输出结果为“This is the service“;
所以,我们在写servlet的时候,一般都是重写doGet或doPost方法,不会管service方法。
相关文章推荐
- [Jweb] 在 servlet 中重写 service() 方法,不重写 doGet, doPost 方法,示例。
- Servlet的几个方法介绍(init() 、service()、doGet() 、doPost()、destroy()、getServletConfig()、getServletInfo())
- 封装Servlet,跳过service,doPost,doGet直接写方法
- servlet中service() doGet() doPost() 方法
- servlet中service() doGet() doPost() 方法
- 【转载】servlet中service() doGet() doPost() 方法
- Servlet_4th_service、doGet、doPost方法
- servlet中service() doGet() doPost() 方法
- servlet的service()方法与doGet()、doPost()方法的关系
- servlet中service() doGet() doPost() 方法
- servlet中service() doGet() doPost() 方法
- Servlet 基础-doGet方法 doPost方法 service方法
- servlet中service() doGet() doPost() 方法
- servlet中service() doGet() doPost() 方法
- servlet中service() doGet() doPost() 方法
- servlet中service() doGet() doPost() 方法
- [转]servlet中的service, doGet, doPost方法的区别和联系
- servlet中service() doGet() doPost() 方法
- servlet中service方法、doGet方法、 doPost() 方法 的关系
- WEB应用中的servlet的 service,doPost,doGet方法的关系