tomcat 与 servlet

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就会创建对应的线程来处理,这里势必会造成不必要的开销,当然可以采用线程池优化


猜你喜欢

转载自blog.csdn.net/banjing_1993/article/details/80046221