Tomcat源码分析 – HttpServlet的源码分析
本文由发表于6年前 | J2EE | 评论数 1 |  被围观 8,919 views+
1、查看HttpServlet中的service(ServletRequest req, ServletResponse res)方法:2、继续查看HttpServlet中的service(HttpServletRequest req, HttpServletResponse resp)方法:3、接下来找个相关的具体方法doGet看看:

从官网下载Tomcat源码:Source Code Distributions,关联到Eclipse中。

1、查看HttpServlet中的service(ServletRequest req, ServletResponse res)方法:
public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {

        HttpServletRequest  request;
        HttpServletResponse response;

        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
}

可以发现,这里把相应的request和response转换为了基于HTTP协议的相应对象。

Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse。

2、继续查看HttpServlet中的service(HttpServletRequest req, HttpServletResponse resp)方法:
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 = req.getDateHeader(HEADER_IFMODSINCE);
                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);
        }
}

可以发现,客户端的请求先提交给Service方法时,先获取提交的方法名,根据方法名调用相应的具体方法。

如果重写了该方法,那么就不会根据方法名调用其他具体的方法了。

3、接下来找个相关的具体方法doGet看看:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
}

发现该方法只是判断协议类型,然后抛出相应的异常,其他什么都没做。

所以,在实现自己的Servlet时,需要重写这些方法,以符合自己的需求。一般不需要重写service方法。

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/tomcat-source-code-analysis-httpservlet-source-code-analysis.html
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 11/10
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    一条评论
  1. cimo 2014年04月22日09:01:10  #-49楼 回复 回复

    实现自己的Servlet时,重写doGet方法,那上面的doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException还执行吗

给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 C语言语法笔记 – 指针与数组 一维数组 二维数组 字符数组 二维字符串 指针与一维数组 2011/8/30
2 在YUI中通过YUI.add()添加自定义模块 2012/1/10
3 ExtJS概述及其开发环境的搭建及遇到的Spket安装问题 缺少ext.jsb文件 2011/7/23
4 Sping使用单实例化简化多线程相关实现 事务 模板与回调 2014/4/7
5 服务器返回错误error on line 1 at column 1: Document is empty 2012/5/6
6 数据结构笔记 – 排序算法 简单选择排序算法 2011/9/20
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.