java web原理

来源:互联网 发布:51单片机用的电机驱动 编辑:程序博客网 时间:2024/06/06 20:38

一.tomcat结构


1 - Server

代表一个服务器。

2 - Service

包含多个Connector组件以及一个Engine组件。负责处理所有Connector所获得的客户请求。

3 - Connector

一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。

TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求。

Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求。

Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求。

4 - Engine

Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名,当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理。

Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理。

5 - Host

代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配。每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path。当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context。所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。

6 - Context

一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成。Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类。当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类,如果找到,则执行该类,获得请求的回应,并返回。


二.tomcat启动过程

1.初始化环境变量,设置Tomcat类加载体系的顶级类加载器(主要是CommonLoader、CatalinaLoader以及SharedLoader)。

附1:java web类加载顺序

2.解析server.xml,初始化各个组件(包含各个web应用,解析对应的web.xml进行初始化

由于Tomcat内部设计的问题,整个组件的启动并不是分散的,父级组件的启动会带动子级元素组件的启动,依次类推,会使整个组件都启动起来,例如Server的启动会使相关的Service组件都启动,而Service的启动又会带动Connector的启动等等。

附2:web应用加载过程

3.初始化连接器:初始化声明的Connector,以指定的协议打开端口,等待请求。


三.tomcat工作原理

tomcat就是一个典型的web 容器,当浏览器向服务器发送一个请求时,该请求会发送给web容器,web容器的作用就是选择合适的资源处理该请求(servlet或者jsp)。并将结果封装并返回给web服务器,然后web服务器将响应内容返回给客户端。

如果web容器收到请求后发现该请求需要由一个servlet处理,则web容器会创建两个对象:HttpServletRequest和HttpServletResponse,然后它基于url找到合适的servlet,并为该请求创建一个线程。然后web容器将调用servlet的service方法。service方法将根据请求类型调用doXXX方法(比如get请求,将会调用doget方法)。servlet方法生成动态页面并返将其写入response中。一旦servlet线程工作完成后,容器便会将response转化为httpresponse并返回给浏览器。

附3:Tomcat Server处理一个http请求的过程


附1:java web类加载顺序

在Java中,类加载器是以一种父子关系树来组织的。除Bootstrap外,都会包含一个parent 类加载器。一般以类加载器需要加载一个class或者资源文件的时候,他会先委托给他的parent类加载器,让parent类加载器先来加载,如果没有,才再在自己的路径上加载。这就是人们常说的双亲委托,即把类加载的请求委托给parent。需要注意一下,对于Web应用的类加载,和双亲委托是有所区别的。

在tomcat7.x里,ClassLoader的模型应该是下图这样: 


jvm默认定义了三种classloader,分别是bootstrapclassloader、extension classloader、system classloader

 bootstrap是jvm的一部分,用C写的,每一个java程序都会启动它,去加载%JAVA_HOME%/jre/lib/rt.jar,

 extension也差不多,它会去加载%JAVA_HOME%/jre/lib/ext/下的类,

 system则是会去加载系统变量CLASSPATH下的所有类。

这3个部分,在上面的tomcat classloader模型图中都有体现。不过可以看到extension没有画出来,可以理解为是跟bootstrap合并了,都是去%JAVA_HOME%/jre/lib下面加载类

Common — 这个classloader加载的类,对tomcat的类和web app的类都是可见的。通常来说,应用程序的类不应该放在这里。该加载器的加载路径是在$CATALINA_BASE/conf/catalina.properties文件里,通过common.loader属性来定义的。

WebappX — 该classloader加载所有WEB-INF/classes里的类,以及WEB-INF/lib里的jar。

 该classloader就有意违反了上述的委托模型,它首先看WEB-INF/classes和WEB-INF/lib里是否有请求的类,而不是委托parentclassloader去加载。但是,JRE里定义的类不能被覆盖(比如java.lang.String),以及Servlet API会明确地被忽略。前面说的bootstrap、system、common,都遵循普通的委托模型。


附2:web应用加载过程

1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:  

  <listener></listener> 和<context-param></context-param>

2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.

3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.

4.容器创建<listener></listener>中的类实例,即创建监听.

5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:

  ServletContext = ServletContextEvent.getServletContext();  

  context-param的值= ServletContext.getInitParameter("context-param的键"); 

6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比 所 有的Servlet都要早.

换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.

举例.你可能想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源.比如说数据库连接的关闭。


附3:Tomcat Server处理一个http请求的过程

假设来自客户的请求为:

http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得

2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应

3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host

4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)

5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context

6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)

7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet

8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类

9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法

10)Context把执行完了之后的HttpServletResponse对象返回给Host

11)Host把HttpServletResponse对象返回给Engine

12)Engine把HttpServletResponse对象返回给Connector

13)Connector把HttpServletResponse对象返回给客户browser



原创粉丝点击