Tomcat的体系结构
开发中,最常用的就是使用http协议以及https协议
tomcat作用:充当servlet容器及web服务器
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。那么在Tomcat服务器中,如何进行虚拟目录的映射呢?总共有如下的几种方式
方式一:在server.xml的host进行配置进行配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/viewSource" docBase="d:\ht-editor\instance\storage\scenes" debug="0" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
其实主要就是使用<context>标签,每一个context标签可以认为是一个web应用,后来可以把<contetx>标签从server.xml中分离出来,单独写到context.xml中去
context.xml中其实也都是一些context标签
方式二:tomcat自动加载webapps文件夹下的各个项目
方式三:在tomcat服务器的\conf\Catalina\localhost目录下添加一个以xml作为扩展名的文件,xml文件的名字可以任意取,比如下面的webDemo.xml,这一句话的意思翻译过来就是"context元素的path属性源自于是这个xml文件的名字",上面提到过,Context元素的path属性是用来配置虚似目录的名称的,所以虚似目录的名称就是这个xml文件的名称。
里面内容如下:
<Context docBase="F:\JavaWebDemoProject" />
tomcat与浏览器交互过程
这个话题其实就是:tomcat是如何处理一个请求的
主要查看tomcat的server.xml配置文件,其顺序大致如下:
在输入http://localhost:8080/myweb/index.jsp的时候;
1,请求被端口为8080的connector监听到,对应于server.xml里:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
- 1
2,connector将请求交给他所在的service里对应的engine,来处理;
connector在接受到请求后,也就是一个socket连接,将socket封装成Request和Response对象
<Engine defaultHost="localhost" name="Catalina">
- 1
3,engine获得请求后,将匹配他所有的host主机,如果匹配不到则交给默认的defaultHost,也就是localhost;此时,从请求localhost/myweb/index.jsp中解析到,对应的host主机名为“localhost”;
4,host接收到请求后,匹配他下面的context,也就是你部署的项目,这里从请求路径“/myweb/index.jsp”中,解析到对应的context为“myweb”,故交给name=”myweb”的context处理;
5,context随后在自己的mapping table里寻找servlet-mapping拦截路径为*.jsp的servlet,这里找到得是JSPServlet处理(下面解释);
6,找到JSPServlet后,调用servlet的service()方法,进行业务处理;
7,context执行完毕后,将HttpServletResponse 返回给Host;
8,host将HttpServletResponse 返回给engine;
9,engine 将HttpServletResponse 返回给 connector;
10, connector 将 HttpServletResponse 返回给用户的browser;
补充1:tomcat容器在启动后,context对应的项目在初始化的时候,要加载相应的servlet,加载的顺序为:
1,$CATALINA_HOME/conf/web.xml里定义的servlet(对应于上面第5步的JSPServlet);
2,context对应的项目WEB-INF下的web.xml中定义的servlet;
补充2:tomcat采用的是BIO的方式,即同步阻塞方式,也就是说,一个连接创建一个线程,注意,是一次“连接”,也就是说,只要有一个TCP连接,tomcat就会创建对应的线程来处理,这里势必会造成不必要的开销,当然可以采用线程池优化