httpservlet的service()、doget()、dopost方法


 

HttpServlet里的三個方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的區別和聯系:

  1. 在servlet中默認情況下,無論你是get還是post 提交過來 都會經過service()方法來處理,然后轉向到doGet 
  2. 或是doPost方法,我們可以查看HttpServlet 類的service方法:  我在tomcat的lib目錄下,解壓servlet-api.jar,然后用反編譯軟件把lib\javax\servlet\http下的HttpServlet.class反編譯,看里頭的service()方法的原代碼:查看源碼發現,httpservlet繼承genericservlet並實現了service方法,從實現來看service起到了調度的作用。因此自定義servlet繼承httpservlet不需要覆蓋重寫service方法,只需覆蓋重寫doget或者dopost方法。
  3. 注意,sun只是定義了servlet接口,而實現servlet接口的就是類似於tomcat的服務器,所以我是在tomcat的安裝目錄下找到實現的類。

public abstract class HttpServlet extends GenericServlet {

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.    1.publicvoid 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.   17.import java.io.IOException;    
    25.   18.    
    26.   19.import javax.servlet.ServletException;    
    27.   20.import javax.servlet.ServletOutputStream;    
    28.   21.import javax.servlet.ServletRequest;    
    29.   22.import javax.servlet.ServletResponse;    
    30.   23.import javax.servlet.http.HttpServlet;    
    31.   24.import javax.servlet.http.HttpServletRequest;    
    32.   25.import javax.servlet.http.HttpServletResponse;    
    33.   26.    
    34.   27./**
    35.   28. * 演示service方法
    36.   29. */   
    37.   30.publicclass Testextends HttpServlet {    
    38.   31.    
    39.   32.publicvoid 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.   38.protectedvoid doGet(HttpServletRequest request,    
    46.   39.     HttpServletResponse response)throws ServletException, IOException {    
    47.   40.    doPost(request,response);    
    48.   41.    
    49.   42. }    
    50.   43.protectedvoid 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“;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM