博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杂谈:Servlet(2)
阅读量:5260 次
发布时间:2019-06-14

本文共 3665 字,大约阅读时间需要 12 分钟。

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);

    }
}

 

 


转载于:https://www.cnblogs.com/greentomlee/p/4324854.html

你可能感兴趣的文章
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
让IE浏览器支持CSS3圆角属性的方法
查看>>
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>