servlet中的service、doGet和doPost的关系

时间:2021-10-23 12:06:49

1.关系

在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方法也只能执行service方法,不会去执行doPost或是doGet方法。

2.service一定要用吗?作用是什么?是不是在程序开始运行时,自动装载执行的系统方法(类似于main)?请介绍一下它的基本情况及用途。

Service是类GenericServlet中最重要的方法,每次客户向服务器发出请求时,服务器就会调用这个方法。程序员如果想对客户的请求进行响应的话就必须覆盖这个方法,并在这个方法中加入自己的代码来实现对客户的响应。Service有两个参数(ServletRequest和ServletResponse),ServletRequest保存了客户向服务器发送的请求,而ServletResponse用来设置如何对客户进行响应。有一个问题我们应当注意:就是init()方法(Servlet的两个生命周期函数之一,另一个是destroy())和service()方法的区别,当我们改变源程序而重新生成一个新的.class文件的时候,此时如果再次执行该Servlet,会发现执行的结果跟没做更改的时候一样,原因就是因为相同的Servlet的init只执行一次,所以当我们在调试Servlet的时候要不断改变文件名和类名,或者重新启动服务(Tomcat或者JWS等)。就是说,init()方法仅在服务器装载Servlet时才由服务器执行一次,而每次客户向服务器发请求时,服务器就会调用Service()方法。