servlet中service() doGet() doPost() 方法

Posted 梦中山河

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet中service() doGet() doPost() 方法相关的知识,希望对你有一定的参考价值。

HttpServlet 里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系:

    在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet 
  1. 注意,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是这样的: 
  1. Java代码 
  2.    1. public void service(ServletRequest req, ServletResponse res)    
  3. 2.                    throws ServletException, IOException {    
  4. 3.          res.getOutputStream().print(    
  5. 4.          "image is <img src=‘images/downcoin.gif‘></img><br>");    
  6. 5.      }   
  7.  
  8.  
  9. Java代码 
  10.    1. <%@page contentType="text/html; charset=utf-8"%>    
  11. 2. <html>    
  12. 3. <head><title>选择</title></head>    
  13. 4. <body>    
  14. 5. 请选择你喜欢的水果:<br>    
  15. 6. <form action = "Test" method = "post">    
  16. 7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>    
  17. 8. <input type="checkbox" name="fruit" value ="orange">桔子<br>    
  18. 9. <input type="checkbox" name="fruit" value ="mango">芒果<br>    
  19. 10. <input type="submit" value="提交">    
  20. 11. </form>    
  21. 12. </body>    
  22. 13. </html>    
  23. 14.    
  24. 15. 服务端servlet是:Test类    
  25. 16.    
  26. 17. import java.io.IOException;    
  27. 18.    
  28. 19. import javax.servlet.ServletException;    
  29. 20. import javax.servlet.ServletOutputStream;    
  30. 21. import javax.servlet.ServletRequest;    
  31. 22. import javax.servlet.ServletResponse;    
  32. 23. import javax.servlet.http.HttpServlet;    
  33. 24. import javax.servlet.http.HttpServletRequest;    
  34. 25. import javax.servlet.http.HttpServletResponse;    
  35. 26.    
  36. 27. /**
  37.   29. */   
  38. 30. public class Test extends HttpServlet {    
  39. 31.    
  40. 32. public void service(ServletRequest req, ServletResponse res)    
  41. 33.    throws ServletException, IOException {    
  42. 34.             res.getOutputStream().print("This is the service");    
  43. 35.    
  44. 36. }    
  45. 37.    
  46. 38. protected void doGet(HttpServletRequest request,    
  47. 39.     HttpServletResponse response) throws ServletException, IOException {    
  48. 40.    doPost(request,response);    
  49. 41.    
  50. 42. }    
  51. 43. protected void doPost(HttpServletRequest request,    
  52. 44.     HttpServletResponse response) throws ServletException, IOException {    
  53. 45.    ServletOutputStream out=response.getOutputStream();    
  54. 46.    String[] args=(String[])request.getParameterValues("fruit");    
  55. 47.   for(int i=0;i<args.length;i++){    
  56. 48.     out.print(args[i]+"<br>");    
  57. 49.    }    
  58. 50.       
  59. 51. }    
  60. 52. }   
  61. 所以,我们在写servlet的时候,一般都是重写doGet或doPost方法,不会管service方法。

以上是关于servlet中service() doGet() doPost() 方法的主要内容,如果未能解决你的问题,请参考以下文章

service方法doGet方法doPost方法的区别和一些常见错误 Servlet的生命周期

4 service() 与 doGet() doPost()

Servlet 传值调用 覆盖service()方法还是覆盖doGet方法和doPost方法区别

Servlet的Service方法和doget 和 dopost方法的区别,常见的错误解析

servlet的生命周期,啥情况下调用doGet()和doPost()?

servlet中为啥doget要调用dopost?默认调用哪个?默认都调用?