Servlet的方法剖析:
1.service()方法里面做了什么?
2.doGet()与doPost()做了什么?应该怎么写?
回答
1.service()方法里面做了什么?
如果你的service方法中没有写super.service(req, resp); 那么后果是doget()和dopost()方法永远不会调用.这是为什么呢?
我们可以查看一下HttpServlet的源代码:(Ps:已经有删除 , 补录中有完整的代码....)
------------------------Service()--------------------------------------------------
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {String method = req.getMethod();
if (method.equals(METHOD_GET)) {//如果" 请求 "是get方法 , 那就调用doget , 否则看看是不是post
long lastModified = getLastModified(req); if (lastModified == -1) { doGet(req, resp);//调用 }else if (method.equals(METHOD_POST)) { doPost(req, resp);.......后面是诺干个if-else语句
从这个源代码中就可以看出Service()主要是干什么了吧-----他就是用来区分是get方法还是post方法的
2.doGet里面做了什么?
下卖个关子 , 请看这句代码对不对,会不会出现异常.....
答案是:一定会出现异常,原因就是你写了一个super.doGet();
这个会调用父类的doGet()方法 , 这样做的结果就是: 会出现405(请求错误)或者是illegalXXXException
Why? 为什么doget()不可以调用父类的方法?
原因就是:
这段源代码就是在告诉我们:无论如何,他都会调用requset.sendError方法的 ,
如果你还想在super.doGet()下面获取参数的话那就是错误的 ,因为sendError之后上下文已经改变了 , 你就没法获取参数了;
例如:
这个:
然后调用之后:
-------补录------------------------------------------------
/** * Receives standard HTTP requests from the public * <code>service</code> method and dispatches * them to the <code>do</code><i>Method</i> methods defined in * this class. This method is an HTTP-specific version of the * {@link javax.servlet.Servlet#service} method. There's no * need to override this method. * * @param req the {@link HttpServletRequest} object that * contains the request the client made of * the servlet * * @param resp the {@link HttpServletResponse} object that * contains the response the servlet returns * to the client * * @exception IOException if an input or output error occurs * while the servlet is handling the * HTTP request * * @exception ServletException if the HTTP request * cannot be handled * * @see javax.servlet.Servlet#service */protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); } catch (IllegalArgumentException iae) { // Invalid date header - proceed as if none was set ifModifiedSince = -1; } if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } }} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp);} else if (method.equals(METHOD_POST)) {
doPost(req, resp);} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);} else {
// // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. //String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}}