javaweb与tomcat


简单了解javaweb三大件

javaweb三大件

上面说过javaweb的内存马有三种,servlet、filter、listener

所以javaweb三大件就是servlet、filter、listener

servlet

servlet是一个运行在web上的程序,处在一个中间层的位置(在http客户端的请求和http上的数据库或者应用程序之间)。

servlet对请求的处理过程如下:

  1. 客户端发送http请求,比如一个get/post请求等
  2. servlet接收请求,并且根据请求的信息封装成HttpServletRequestHttpServletResponse对象
  3. servlet调用init()方法,init()只在第一次请求时被调用
  4. servlet调用service()方法
  5. servlet根据请求类型调用相应的doxxx()方法,比如get型就调用doGet(),该doxxx方法内写的就是我们自己的业务逻辑
  6. 处理完成后,将结果返回servlet,然后再由servlet返回给客户端
  7. 调用destory方法

servlet的生命周期:

  1. 服务器启动(web.xml中配置load-on-startup=1,默认为0)或者第一次请求servlet的时候,调用init()
  2. servlet处理请求,调用service(ServletRequest req, ServletResponse res)
  3. 关闭时,调用destory方法销毁这个servlet对象
  4. jvm进行垃圾回收

filter

filter称为过滤器,是对servlet技术的一个强补充。在HttpServletRequest到达servlet之前,拦截下这个对象,然后检查该对象或者修改其中的Request头和数据。同样地,在HttpServletResponse到达客户端之前拦截下这个对象,然后检查该对象或者修改HttpServletResponse头和数据

简单点说就是filter就像是一个保安,分别拦截Request和Response对象,然后根据需要对其进行检查和修改再放行

filter的工作原理

  1. filter程序是一个实现了特殊接口的java类,和servlet类似。由servlet容器进行调用和执行
  2. 在web.xml注册了一个filter来对某个servlet进行拦截处理的时候,filter可以决定是否将请求继续传递给servlet程序,还可以对请求进行修改
  3. 当servlet容器开始调用某个servlet程序的时候,如果发现了它已经注册了一个filter程序对servlet进行拦截的时候,容器就不会再直接调用service()方法,而是先调用doFilter()方法,然后再由doFilter()方法决定是否去执行service()方法
  4. 一些细节就是在doFilter里也不是由doFilter直接调用service方法,而是调用FilterChain.doFilter方法来调用service方法。而FilterChain对象是通过Filter.doFilter方法的参数传递进来的
  5. 只要在调用FilterChain.doFilter方法前后增加某些程序代码,就可以在servlet进行相应前后实现某些特殊功能
  6. 如果Filter.doFilter方法没有调用到FilterChain.doFilter方法的话,就不会调用service方法,这样通过filter就可以阻止某些非法的访问请求

filter的生命周期

与servlet一致,filter的创建与销毁由容器负责

  • web应用启动时,创建filter对象,并调用其init方法,读取web.xml,完成对象的初始功能,为拦截做好准备工作,其中filter和init方法都只会执行一次
  • 开发者可以通过init方法的参数,获得代表当前filter配置信息的filterconfig对象,filter对象创建后会驻留在内存,当web应用移除或者服务器停止的时候才销毁
  • 在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
  • 当多个filter同时存在的时候就构成了filter链,此时会根据在web.xml中的注册顺序来决定先调用哪个filter。当第一个filter的doFilter方法被调用的时候,web服务器就会创建一个代表filter链的filterchain对象传递给该方法。通过判断filterchain中是否还有filter来决定后面是否继续调用filter

Listener

javaweb中的监听器,是application、session和request三大对象创建、销毁或者增删改时自动执行代码的功能组件

  • ServletContextListener,顾名思义是对Servlet上下文的监听。对servlet上下文的创建和销毁进行监听
  • ServletContextAttributeListener,监听servlet上下文属性的监听器(增加、删除、替换)
  • HttpSessionListener,对session的创建和销毁进行监听。session的销毁又有两种情况:session超时、调用session对象的invalidate()方法使其失效
  • HttpSessionAttributeListener,对session的属性的增加、删除、替换进行监听
  • ServletRequestListener,对请求对象的初始化和销毁进行监听

Listener可以用于监听客户端的请求、操作等。通过listener可以触发一些动作,比如监听用户的在线数量、网站访问量等

Tomcat

汤姆猫(

tomcat作为web服务器实现了两个核心功能:

  • HTTP服务器功能。进行socket通信(tcp),解析http报文
  • Servlet容器。加载和管理Servlet,由Servlet具体负责处理Request请求

tomcat以上的两个功能对应着tomcat的两个核心组件:Connector和Container。Connector负责对外交流(http服务器),而Container负责内部(Servlet功能)

  • Server:tomcat服务器
  • Service:服务器内部的组件,一个Server可以拥有多个service,它能过将若干个connector组件绑定到一个container
  • Connector:连接器,是service的核心组件之一。主要连接客户端请求,并且接收请求然后将其封装成Request对象和Response,交给Container进行处理,在Container处理完毕后交给Connector返回给客户端
  • Container:容器,负责处理用户的Servlet请求

对于Connector,他需要完成三个功能

  • Socket通信
  • 封装请求变成Request对象
  • Request转换成ServletRequest对象,将Response转成ServletResponse

所以Connector也有对应的三个组件分别负责上面的三个功能(反过来也是一样的,这里描述的是请求):

  • EndPoint,负责TCP/IP通信,提供请求字节流给Processer
  • Processer,提供Request对象给Adapter
  • Adapter,提供标准的ServletRequest对象给Container

其中EndPoint和Processer的组合又叫ProtocolHandler

对于Container组件,它又叫Catalina

Container又有四种容器,分别叫

  • Engine,是整个组件的Servlet引擎,用于管理多个虚拟站点,一个Service最多只有一个Engine,而一个Engine可以有多个host
  • Host,一个站点/虚拟主机,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机地址下面可以包含多个Context
  • Context,表示一个web应用程序,每一个Context都有唯一的路径,一个web应用有多个wrapper
  • Wrapper,表示一个Servlet,负责管理整个Servlet的生命周期,包括装载、初始化、回收等

Tomcat的container又可以由下图概括: