Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet容器
servlet容器启动过程:
在tomcat容器管理等级中,Context直接管理着Servlet在容器中的包装类Wrapper,所以Servelt容器如何运行就影响这servlet,下面就是servlet容器启动过程
Servlet容器启动时,触发servletContextEvent事件,并通知相应的监听器servletContextListener;
Servlet容器在启动的过程中通过servletContextListener监视servletContext的状态(初始化或者销毁servletContext);
servletContextListener中通过contextInitialized初始化方法,根据web.xml对servletContext进行配置,即将Context容器的属性缓存在内存中,供Service服务利用;
web应用初始化工作:
web的初始化是在contextConfig中实现的,应用的初始化主要是对web.xml进行解析,这个文件描述了Web应用的关键信息,也是整个Web应用的入口。
Tomcat将web.xml文件解析后,将其中的属性设置到Context容器中,这里包括创建Servlet实例,Filter和Listener。将Servlet包装成Context中的包装类Wrapper。
Tomcat的context容器中的StrandWrapper对象就是tomcat中对于Servlet的包装也就是,Servlet是一种JavaWeb规范而不是直接耦合成一个类包装在tomcat容器里面,这是standwapper对象的设计初衷。
Servlet实例
创建Servlet对象
如果Servlet在web.xml中load-on-startup的配置大于0,那么在Context容器启动时就会被实例化。在tomcat/conf/web.xml文件中,配置了2个load-on-startup为1,3的默认启动类,分别是Servlets.DefaultServlet、org.apache.servlet.JspServlet
初始化Servlet
前面讲了Servlet规范在tomcat的实现就是context中StandardWrapper。所以初始化的时候就是通过调用Servlet的init方法,同时把包装了StandarWrapper对象的StandarWrapperFacade作为ServletConfig传给Servlet。
Servlet从web.xml被解析到初始化。ServletConfig 和 ServletContext的区别ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
Servlet体系结构
如果说javaweb规范,概况来讲肯定离不开 servlet规范。而servlet规范主要有这3个类ServletConfig、ServletRequest、ServletResponse。ServletConfig在servlet初始化的过程中就传给了servlet了,而ServletRequest和ServletResponse在servlet运行中我很清楚的知道他们的用法。这个Servletconfig对象和Servlet采用典型的“握手型的交互”根据交互场景来组装数据。而实际上servletconfig通过其门面设计模式的servletcontext类给servlet引用,通过servletcontext 可以获得context容器的相关信息如路径 和最小版本。servletRequest和servletresponse又通过web容器封装成了 httpservletRequest和httpservletresponse对象
Servlet如何工作
先看一个典型的访问路径 http://localhost:80/test ,HTTP协议 +host名+port端口+url ,其中HTTP和host名用于服务器和客户机之间建立TCP/IP连接,而后面的url就是确立这个客户机浏览器将访问服务器web容器里面哪个servlet的。服务器的web容器中有一个mapper专门管理这种urlservlet的映射关系!
然后这个请求URL进入到这个servlet容器中之后,就会调用相应的的service方法,通常我们不是直接去实现javax.servlet.servlet类,而是实现简单点的httpservlet或者genericServlet类,然后选择性覆盖相应方法去实现我们的功能。
然后再现在的MVC框架中,对于所有请求的处理的基本原理就是将它们都映射到一个Servlet,然后再去实现其service方法,这个方法也就是MVC的入口。
最后当servlet从web容器中移除后,这个servlet的生命周期也就相应的结束了由容器调用相应的destroy方法。
Servlet中的Listener
在整个tomcat容器的设计中,其实很多容器诸如此类,listener使用的非常广泛,它是基于观察者模式而设计的。类图如下
Filter如何工作
其实在web.xml 中,filter也是一个常用的配置项,与servlet对象相比 ,除了有request和response对象,它还有一个filterchain对象,类图如下。
在tomcat容器中,FilterConifg 和FilterChain的实现类分别是ApplicationFilterConfig和ApplicationFilterChain,而Filter接口由用户自己去实现,是这3个接口与Servlet中的类似,只不过ApplicationFilterChain可以把这些Filter串联起来,组成一个Filter链,这点和Jetty的Handler链在设计上有异曲同工之妙。
再看下如图的Filter类三个接口方法:
Filter的一个比喻,如果有2条往返的加工流水线,我们可把这2条流水线看做 web交互中的request和response ,即请求和响应,在这2条流水线的远转图中,Filter就好比一个流水线工人对流动的产品进行处理,可以在某个工位存放或者取出或者拦截一些数据。
Servlet中的url-pattern
前面我们说过 Servlet 和 URL之间的对象关系 ,在tomcat有一个Mapper类实现请求访问时去对应哪个Servlet。而Filter的url匹配是在创建 ApplicationFilterChain时,对匹配的Url相应的Filter放入到ApplicationFilterChain对象的Filters数组中,然后FilterChain依次调用这些Filter。
Url在web.xml被加载时会校验这些url-pattern是否合法,这个检查是在StandardContext的ValidateURLPattern中进行,吐过不通过就会报这个java.lang.IllegalArgumentException:Invalid ...
解析规则如下