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);
        }
    }

  1. 从上面可以看出 这里的service是用来转向的但是如果你在自己的servlet类中覆盖了service方法,比如说你的service是这样的:  
  2.   
  3. Java代码  
  4.   
  5.    1public void service(ServletRequest req, ServletResponse res)     
  6.    2.                    throws ServletException, IOException {     
  7.    3.          res.getOutputStream().print(     
  8.    4.          "image is <img src='images/downcoin.gif'></img><br>");     
  9.    5.      }    
    1. 那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet  
    2.   
    3. 都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。  
    4.   
    5. 比如说:你的客户端代码是:  
    6. Java代码  
    7.   
    8.    1. <%@page contentType="text/html; charset=utf-8"%>     
    9.    2. <html>     
    10.    3. <head><title>选择</title></head>     
    11.    4. <body>     
    12.    5. 请选择你喜欢的水果:<br>     
    13.    6. <form action = "Test" method = "post">     
    14.    7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>     
    15.    8. <input type="checkbox" name="fruit" value ="orange">桔子<br>     
    16.    9. <input type="checkbox" name="fruit" value ="mango">芒果<br>     
    17.   10. <input type="submit" value="提交">     
    18.   11. </form>     
    19.   12. </body>     
    20.   13. </html>     
    21.   14.     
    22.   15. 服务端servlet是:Test类     
    23.   16.     
    24.   17import java.io.IOException;     
    25.   18.     
    26.   19import javax.servlet.ServletException;     
    27.   20import javax.servlet.ServletOutputStream;     
    28.   21import javax.servlet.ServletRequest;     
    29.   22import javax.servlet.ServletResponse;     
    30.   23import javax.servlet.http.HttpServlet;     
    31.   24import javax.servlet.http.HttpServletRequest;     
    32.   25import javax.servlet.http.HttpServletResponse;     
    33.   26.     
    34.   27/** 
    35.   28. * 演示service方法 
    36.   29. */    
    37.   30public class Test extends HttpServlet {     
    38.   31.     
    39.   32public void service(ServletRequest req, ServletResponse res)     
    40.   33.    throws ServletException, IOException {     
    41.   34.             res.getOutputStream().print("This is the service");     
    42.   35.     
    43.   36. }     
    44.   37.     
    45.   38protected void doGet(HttpServletRequest request,     
    46.   39.     HttpServletResponse response) throws ServletException, IOException {     
    47.   40.    doPost(request,response);     
    48.   41.     
    49.   42. }     
    50.   43protected void doPost(HttpServletRequest request,     
    51.   44.     HttpServletResponse response) throws ServletException, IOException {     
    52.   45.    ServletOutputStream out=response.getOutputStream();     
    53.   46.    String[] args=(String[])request.getParameterValues("fruit");     
    54.   47.   for(int i=0;i<args.length;i++){     
    55.   48.     out.print(args[i]+"<br>");     
    56.   49.    }     
    57.   50.        
    58.   51. }     
    59.   52. }    
    60. 点击提交后:页面输出结果为“This is the service“;

    61. 所以,我们在写servlet的时候,一般都是重写doGet或doPost方法,不会管service方法。



    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值