设为首页 收藏本站
查看: 894|回复: 0

[经验分享] tomcat实现http协议中的请求方法

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-30 13:52:57 | 显示全部楼层 |阅读模式
本帖最后由 kiloyp 于 2016-3-30 13:54 编辑

   Tomcat是实现了http协议的web服务器。      HttpServlet是整个J2EE体系的核心类。来自客户端的全部请求均有该类进行处理和转发。它由Tomcat根据web.xml中的servlet配置标记进行装载和管理。
      以下是servlet继承结构。
javax.servlet.http
Class HttpServlet
java.lang.Object  javax.servlet.GenericServlet      javax.servlet.http.HttpServlet
  • All Implemented Interfaces:
  • Serializable, [url=]Servlet[/url], [url=]ServletConfig[/url]
      Servlet生命周期从init()开始(启动Tomcat时候自动调用),当客户端发来Http请求时候,调用service()处理方法,service方法中含有很多Http请求方法,如post,get,delete,option,put,delete,trace,head。这些方法的实现在http报文中请求方法一栏。最后关闭Tomcat时候调用destroy()方法。(servlet是单例)
wKioL1THNfahGAkDAAFu--59S3M173.jpg
      下面来看Tomcat源码中三个方法的实现:
     //初始化配置信息,在web.xml中
1
2
3
4
  public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
    }

Http协议RFC2616.pdf (1.03 MB, 下载次数: 0)

       //service()主要调用doXXX方法,XXX对于Http协议中的请求方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
   protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        //从Req请求中取出方法,并判断方法类型
        String method = req.getMethod();
        if (method.equals(METHOD_GET)) {
                //获取服务器资源最后修改时间lastModified(缓存机制的一种)
            long lastModified = getLastModified(req);
            //-1的话不支持if-modified-since
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
            //响应头中返回lastModified,再次请求时候请求头增加一个
            //ifModifiedSince,询问当前页面是否是最新的。
                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);
        }
    }
    //总的逻辑就是先去缓存中的数据,再去调用相应的方法。



     //一次请求生命周期结束,而不是销毁容器,销毁容器是Catalina类中的stopServer()方法。没找到destroy的具体方法。就这么销毁了?对应gc吗?一个疑问?求评论。
1
2
public void destroy() {
    }



       下面是HttpServlet中的一些方法与属性:
        private static final String METHOD_DELETE = "DELETE";
        private static final String METHOD_HEAD = "HEAD";
        private static final String METHOD_GET = "GET";
        private static final String METHOD_OPTIONS = "OPTIONS";
        private static final String METHOD_POST = "POST";
        private static final String METHOD_PUT = "PUT";
        private static final String METHOD_TRACE = "TRACE";
        private static final String HEADER_IFMODSINCE = "If-Modified-Since";
        private static final String HEADER_LASTMOD = "Last-Modified";
        private static final String LSTRING_FILE ="javax.servlet.http.LocalStrings";
        private static ResourceBundle lStrings =ResourceBundle.getBundle(LSTRING_FILE);
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        protected void doHead(HttpServletRequest req, HttpServletResponse resp)
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        protected void doPut(HttpServletRequest req, HttpServletResponse resp)
       protected void doDelete(HttpServletRequest req, HttpServletResponse resp).............

        这就是Http协议中请求方法对应的Tomcat实现。换个提法:Tomcat中有几种请求类型?其实质再问Htpp协议中的方法理解。每个方法都有其特性。为什么Http协议需要这么方法?比如哪些方法是安全的,哪些方法是等幂方法?(具体区别详见--Http协议RFC2616 9.1节)。也许知道这些背后的原理,才可以知道Http协议的精髓。我觉得一个苹果砸醒了牛顿,而一个协议带领人类走向互联网时代。堪比计算机届的E=MC^2!!!
       附HttpRFC2616协议。

      

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-197666-1-1.html 上篇帖子: linux系统使用tomcat服务器部署web项目 下篇帖子: 让eclipse自动向tomcat导入lib
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表