• 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,然后用反编译软件把libjavaxservlethttp下的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“;
  • 相关阅读:
    maven错误
    angularjs的一点总结
    工具汇总
    重启outlook的bat脚本
    前端框架参考
    imply套件以及plyql的安装
    centos下nodejs,npm的安装和nodejs的升级
    kafka错误集锦
    动态规划DP笔记
    链接
  • 原文地址:https://www.cnblogs.com/keyi/p/7636601.html
Copyright © 2020-2023  润新知