首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

servlet中service、doGet、doPost的联系于差异

2012-11-20 
servlet中service、doGet、doPost的联系于区别转载于‘舞动的画笔’的空间:http://hi.baidu.com/zhf_109/blog/

servlet中service、doGet、doPost的联系于区别
转载于‘舞动的画笔’的空间:http://hi.baidu.com/zhf_109/blog/item/8e5cc9fb8d35569a59ee90ac.html
在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet或是doPost方法,如果form的提交方式是get,则转向doGet方法,如果是post方式,则转向doPost方法。可以看HttpServlet 类的service方法:

Java代码
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);   
        }   
    }  
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是这样的:


Java代码
public void service(ServletRequest req, ServletResponse res)   
                   throws ServletException, IOException {   
         res.getOutputStream().print(   
         "image is <img src='images/downcoin.gif'></img><br>");   
     }  
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方法。


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

Java代码
<%@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.HttpServletRequest;   
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>");   
   }   
     
}   
}  

热点排行