您的位置:首页 > 运维架构

servlet—service 与doGet、doPost 的关系

2014-04-03 11:56 190 查看
在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet

或是doPost方法,可以看HttpServlet 类的service方法:

         原代码:

    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是这样的:

   public void service(ServletRequest req, ServletResponse res)

                   throws ServletException, IOException {

        res.getOutputStream().print(

         "image is <img src='images/downcoin.gif'></img><br>");

    }

那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet

都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。

 

比如说:你的客户端代码是:

<%@page contentType="text/html; charset=utf-8"%>

<html>

<head><title>选择</title></head>

<body>

请选择你喜欢的水果:<br>

<form action = "Test" method = "post">

<input type="checkbox" name="fruit" value ="apple" >苹果<br>

<input type="checkbox" name="fruit" value ="orange">桔子<br>

<input type="checkbox" name="fruit" value ="mango">芒果<br>

<input type="submit" value="提交">

</form>

</body>

</html>

服务端servlet是:Test类

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletReque
b434
st;

import javax.servlet.http.HttpServletResponse;

/**

 * 演示service方法

 */

public class Test extends HttpServlet {

 public void service(ServletRequest req, ServletResponse res)

   throws ServletException, IOException {

           res.getOutputStream().print("This is the service");

 }

 protected void doGet(HttpServletRequest request,

   HttpServletResponse response) throws ServletException, IOException {

  doPost(request,response);

 }

 protected void doPost(HttpServletRequest request,

   HttpServletResponse response) throws ServletException, IOException {

  ServletOutputStream out=response.getOutputStream();

  String[] args=(String[])request.getParameterValues("fruit");

  for(int i=0;i<args.length;i++){

   out.print(args[i]+"<br>");

  }

  

 }

}

 

那么当你提交数据后的输出结果是:this is the service
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: