关闭

Tomcat源码阅读之处理请求

标签: tomcat源码处理请求页面跳转jspServlet
244人阅读 评论(0) 收藏 举报
分类:

web开发中我们常见的请求类型有三种: 1、页面跳转请求。 2、ajax请求。3、请求静态资源,如图片,css文件等。那么我们以最常用的页面跳转请求为例看看Tomcat的处理流程。Tomcat处理请求的逻辑主要在StandardWrapperValve类的invoke方法中。
接收到页面跳转请求之后,Tomcat首先会创建JspServlet实例,但是该实例在Context容器启动的时候就已经被创建,因此StandardWrapper的allocate方法直接返回JspServlet实例。接着获取请求的路径,本次请求的路径为/user/login.jsp,这个路径会赋值给request的org.apache.catalina.core.DISPATCHER_REQUEST_PATH属性。然后Tomcat会创建过滤器工厂对象和过滤器链。

// Create the filter chain for this request
        ApplicationFilterFactory factory =
            ApplicationFilterFactory.getInstance();
        ApplicationFilterChain filterChain =
            factory.createFilterChain(request, wrapper, servlet);
            。。。。。。略
            filterChain.doFilter
                            (request.getRequest(), response.getResponse());

有了这两个对象之后就可以通过过滤器链逐个执行过滤器里的逻辑了。注意此处的request.getRequest()和response.getResponse()方法,这两个方法获取到的不是request和response对象本身,而是经过再次封装的门面类RequestFacade和ResponseFacade。使用门面类能够防止其他类直接访问request和response对象中的数据或方法,只能访问通过门面类对外提供的接口,这样就保证了程序更加安全。接着该执行过滤器的逻辑了,我们知道过滤器的执行过程封装在ApplicationFilterChain类的internalDoFilter方法中,具体的执行过程可以翻看前面过滤器部分。执行完过滤器里的逻辑之后就该执行Servlet中的逻辑了。

servlet.service((HttpServletRequest) request,
                                    (HttpServletResponse) response);

这一步是执行Servlet逻辑的入口,然后调用HttpServlet类的public void service(ServletRequest req, ServletResponse res)方法,HttpServlet的service并没有进行任何处理,接着调用了JspServlet的service方法,然后创建jsp编译器jspCompiler对象,最终来到了HttpJspBase类的service方法。

public final void service(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
    {
        _jspService(request, response);
    }

这个方法里面并没有什么实质性的逻辑处理,并且这个方法是被final修饰的,因此不能被继承,那么子类也不能重写这个方法了,也就是说jsp的处理逻辑并不在HttpJspBase类中。这个时候我们打开Tomcat的work/Catalina/localhost目录,在跟我们web应用同名的文件夹下,会发现一个跟我们请求路径同名的文件/user/login.java,只不过由.jsp变成了.java文件。打开login.java文件,我们会发现在_jspService方法中有很多out.write语句,这些语句输出的内容刚好是一个完整的jsp文件,内容与login.jsp完全一致。虽然这个文件的名字叫login.java,但是文件中的类名却是login_jsp,而且继承了HttpJspBase类,而HttpJspBase类继承了HttpServlet,因此login_jsp是一个Servlet。于是Tomcat处理页面跳转请求的流程总结起来就是Tomcat将jsp文件编译成一个Servlet类,通过Servlet类中的out.write输出原jsp中的内容。

0
0
查看评论

tomcat是如何处理请求的

主要查看tomcat的server.xml配置文件,其顺序大致如下:在输入http://localhost:8080/myweb/index.jsp的时候;1,请求被端口为8080的connector监听到,对应于server.xml里:<Connector connectionTimeout...
  • u010747201
  • u010747201
  • 2017-01-23 18:01
  • 504

Tomcat服务器t处理HTTP请求的过程

1) 客户通过客户端(IE, Chrome, etc.)向Tomcat服务器发送 http://localhost:8080/iportal/index.jsp 请求到8080端口 2) 在server.xml文件中,配置为:,用于接收客户请求,并在处理完成后向客户返回请求结果。  ...
  • promaster
  • promaster
  • 2015-03-11 11:01
  • 2236

Tomcat源码阅读之请求过程

Tomcat接收到请求之后便进行解析请求的工作。解析Http请求是个非常复杂的过程,比如解析请求头,解析请求行,解析参数等过程都比较复杂。对解析Http请求过程感兴趣的同学可以结合Http协议相关的资料深入研究。 Http请求解析完的数据会填充到request对象中,注意是org.apache.c...
  • jzq114
  • jzq114
  • 2016-08-25 22:45
  • 164

tomcat 解析(四)-处理http请求过程

声明:源码版本为Tomcat 6.0.35 前面的文章中介绍了Tomcat初始化的过程,本文将会介绍Tomcat对HTTP请求的处理的整体流程,更细节的。 在上一篇文章中,介绍到JIoEndpoint 中的内部类Acceptor用来接受Socket请求,并调用processSocket方法来进行...
  • u014044812
  • u014044812
  • 2016-06-23 18:23
  • 1879

tomcat集群实现源码级别剖析

随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦、架构解耦将web容器的逻辑处理抽离交由其他中间件处理,例如缓存中间件、消息队列中间件、数据存储中间件...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2016-02-25 09:07
  • 3996

Tomcat请求处理过程(Tomcat源码解析五)

前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程。 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求->建立Socket连接->通过Socket读取数据->根据http协议解析数据-&g...
  • jiaomingliang
  • jiaomingliang
  • 2015-08-11 09:25
  • 4664

Tomcat源码分析--一次HTTP请求过程

前两篇我们分析了Tomcat服务的启动过程和Connector(连接器)。现在让我们看看一次Tomcat服务器是怎么提供HTTP服务的。       上文我们说到endpoint是底层处理I/O具体实现类,那么一次HTTP首先也要...
  • c275046758
  • c275046758
  • 2016-05-08 20:37
  • 2468

tomcat请求处理分析(五) 请求到响应流

1.1.1.1  请求到响应界面流 请求处理的过程主要是将所有的东西解析成流,转化成对应的http报文,所以在这里我先不关注servlet因为它最终也就是解析成流里面的数据 processKey里面最终执行的是processSocket,它是线从缓存中获取对应的线程池,没有的...
  • qq_32541407
  • qq_32541407
  • 2017-08-19 00:02
  • 284

Tomcat源码阅读

Tomcat是一款非常优秀的servlet容器或者说是服务器,相信很多人都能非常熟练的使用它。但是对于技术有基情的人是不会仅仅停留在熟练使用的阶段的。为了不只当一个熟练工,那么我们就要去研究它运行的原理。研究运行原理最好的办法当然就是去阅读tomcat的源码。当然,阅读源码必须得讲究方式方法了,每个...
  • jzq114
  • jzq114
  • 2016-06-25 15:20
  • 586

Servlet之tomcat处理Http请求的流程

1.问题描述:
  • w2232097312
  • w2232097312
  • 2016-09-08 14:56
  • 690
    个人资料
    • 访问:12232次
    • 积分:423
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论