加载运行servlet
servlet在tomcat中加载时,会扫描所有servlet文件,生成一个map对象,里面存储映射表,表里为key(urlPatterns)、value(class类名),运行时访问映射表,根据路径找到class类。
浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
①:第一步,浏览器输入访问路径后,携带了请求行,头,体
②:第二步,根据访问路径找到已注册的servlet名称
③:第三步,根据映射找到对应的servlet名
④:第四步,根据servlet名找到我们全限定类名,即我们自己写的类
我感觉很好的servlet执行的完整流程原文链接:https://blog.csdn.net/u010452388/article/details/80395679
Context的部署配置文件web.xml的说明
一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的。
当一个Web App被初始化的时候,便会为这个webapp创建一个context对象,并把这个context对象注册到指定虚拟主机(host)上,接着,它将用 自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类。它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类,然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类。
web.xml文件有两部分:servlet类定义和servlet映射定义
每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应。当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应
分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入
这段话转载自NiceCui:Tomcat原理详解大全
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述: 该文件是所有的WEB APP共用的部署配置文件, 每当一个WEB APP
被DEPLOY,该文件都将先被处理,然后才是WEB APP自己的/WEB-INF/web.xml -->
<!-- +-------------------------+ -->
<!-- | servlet类定义部分 | -->
<!-- +-------------------------+ -->
<!-- DefaultServlet
当用户的HTTP请求无法匹配任何一个servlet的时候,该servlet被执行
URL PATTERN MAPPING : / -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- InvokerServlet
处理一个WEB APP中的匿名servlet 当一个servlet被编写并编译放入
/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时候
该servlet被调用,把匿名servlet映射成/servlet/ClassName的形式
URL PATTERN MAPPING : /servlet/ * -->
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>org.apache.catalina.servlets.InvokerServlet </servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- JspServlet
当请求的是一个JSP页面的时候(*.jsp)该servlet被调用
它是一个JSP编译器,将请求的JSP页面编译成为servlet再执行
URL PATTERN MAPPING : *.jsp -->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- +---------------------------+ -->
<!-- | servlet映射定义部分 | -->
<!-- +---------------------------+ -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/ *</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<!-- +------------------------+ -->
<!-- | 其它部分,略去先 | -->
<!-- +------------------------+ -->
... ... ... ...
</web-app>
<!----------------------------------------------------------------------------------------------->
web.xml常用元素的含义:
<web-app>
<display-name></display-name>:定义了web应用的名字;
<description></description>:声明了web应用描述信息;
<context-param></context-param>:声明应用范围内初始化参数;
<filter></filter>:过滤元素,将一个名字与一个实现javax.servlet.Filter接口的类相关联;
<filter-mapping/>:一旦命名了过滤器,就要利用filter-mapping元素把它与一个或多个servlet或jsp页面关联;
<listener></listener>:servlet API版本2.3增加了事件监听支持,事件监听程序在建立、修改和删除回话或servlet环境时得到通知;
<servlet></servlet>:在servlet或jsp页面执行初始化参数或定制URL时,必须首先命名servlet或jsp页面;
<servlet-mapping/>:服务器一般为servlet提供一个缺省的url。在更改缺省url时,使用servlet-mapping元素;
<session-config></session-config>:设置回话超时时间,默认单位分钟;
<mime-mapping></mime-mapping>:发送到客户端为什么类型;
<welcome-file-list/>:指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件;
<error-page></error-page>:返回特定http状态码时,或者特定类型异常抛出时,能够制定要显示的页面;
<taglib></taglib>:对标记库描述文件指定别名。</webk-app>
---------------------
原文链接:https://blog.csdn.net/u010180031/article/details/54177675