Servlet运⾏原理解析在l中的配置
Servlet机制:
Servlet是服务器端⽤来处理⽤户请求并相应返回结果的应⽤程序,它的⽣命周期由web容器来负责维护,它的多线程体系建⽴在java多线程的机制之上;Servlet被设计为多线程的,当web应⽤程序初始化的时候,Servlet会根据l中的配置⽂件实例化⼀个Servlet类,每当⼀个⽤户请求通过Tomucat获其他服务器进来直接调⽤已经实例化的Servlet对应的doGet/doPost来处理请求,⽽不会再去实例化⼀个Servlet,也就是多个线程在使⽤这个servlet,⼀般会由⼀个线程池来⽀持,线程池在初始化的期间就会创建⼀定数量的线程对象来避免频繁的创建线程、销毁线程对象,提⾼性能;(由线程来执⾏servlet的service⽅法,Servlet在tomcat中是以单例的模式存在的,但是在⼤量并发的情况下依然会出现Servlet线程安全的问题,⽽且很难发现。⼀般造成线程安全主要问题在于实例变量造成的,因此在编写servlet是尽量避免使⽤实例变量,在必须使⽤到实例变量的时候尽量使⽤同步锁的保护使⽤的实例变量)。
客户端client向服务器端发送请求,服务器(tomcat)收到请求之后会创建两个对象(HttpRequest和HttpResponse对象)并将他们的引⽤出给线程池中分配的线程,该线程访问Servlet处理⽤户请求,处理完之后,将结果返回Tomcat并将该线程返还线程池或者销毁;tomcat将结果以http响应发送回客户端
Servlet⽣命周期:
1、默认情况下,在第⼀次访问Servlet时,服务器(tomcat/jetty)会创建并调⽤init()⽅法实例化Servlet(单例),也可以修改配置⽂件l,使得Tomcat启动时就直接创建Servlet(启动时创建Servlet,数字1代表创建的次序:<load-on-startup>1</load-on-startup>);
2、之后请求进来之后Tomcat通过线程对象访问servlet处理请求并响应结果,这个过程中实例化的servlet会被反复调⽤
3、当服务停机之后,调⽤destroy()⽅法销毁servlet实例,整个⽣命周期结束
编译好的Servlet只能运⾏在web容器中,客户端不可以直接访问Servlet,所以需要在l中配置⼀下,
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="java.sun/xml/ns/javaee" xmlns:web="java.sun/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_2_5.xsd"
id="TAPWebService" version="2.5">
<!-- 定义web应⽤的名称 -->
<display-name>boss-trace</display-name>
<!-- 声明初始化参数,这⾥初始化对应的xml⽂件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/config/l,
classpath*:/config/l,
classpath*:/config/l,
classpath*:/config/l,
classpath*:/config/l,servlet和tomcat的关系
classpath*:/config/l,
</param-value>
</context-param>
<!--  设置事件,事件监听程序在建⽴、修改和删除会话或servlet环境时得到通知。 Listener元素指出事件监听程序类 -->
<!--  <listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>-->
<!-- 设置过滤器,过滤器能够对⽬标资源的请求和响应进⾏截取  -->
<!--
<filter>
<filter-name>TraceFilter</filter-name>
<filter-class&q.ace.filter.servlet.TraceAppFilterWeb</filter-class>
</filter>
// ⼀旦命名了⼀个过滤器,就要利⽤filter-mapping元素把它与⼀个或多个servlet或JSP页⾯相关联。
<filter-mapping>
<filter-name>TraceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
<!-- 命名指定servlet来处理对应URL的请求,SpringMVC中配置DispatcherServlet  -->
<servlet>
<!-- 别名  -->
<servlet-name>zxq</servlet-name>
<!-- 指定servlet类 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 1表⽰容器启动时就初始化servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置对应servlet 拦截url与应⽤中contrller的url的映射规则 -->
<servlet-mapping>
<servlet-name>zxq</servlet-name>
<servlet-name>zxq</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--  激活tomcat中defaultServlet 来拦截静态资源的请求,配置后这些拓展名结尾的不被收录为以上zxq servlet的访问请求,直接使⽤defaultServlet 来处理-->    <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/swagger-ui.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
</web-app>
该地址中包含通信协议http+服务器地址localhost+服务器端⼝+contextPath+servletPath;这⾥主要说⼀下contextPath和
servletPath,contextPath⼀般就是你配置的应⽤名,servletPath则就是tomcat根据请求URL匹配规则处理之后映射的地址,⼀般会截取contextPath之后的的字符串与你在<url-pattern>定义的匹配规则做验证,验证通过则⽤那段字符串去做servlet的地址映射,映射到对应
的servlet去处理请求;
<url-pattern>匹配规则:
1. 精确匹配:在<url-pattern>中配置的项必须与url完全精确匹配
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
2. 路径匹配:以“/”字符开头,并以“/*”结尾的字符串⽤于路径匹配
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
3.  扩展名匹配:以“*.”开头的字符串被⽤于扩展名匹配
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
4.  缺省匹配
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
则所有请求都可以匹配
使⽤时需要注意的是:
1. 路径匹配和扩展名匹配⽆法同时设置, 如<url-pattern>/user/*.action</url-pattern>是⾮法的,另外注意:<url-
pattern>/aa/*/bb</url-pattern>是精确匹配,合法,这⾥的*不是通配的含义
2. "/*"和"/"含义并不相同;“/*”属于路径匹配,并且可以匹配所有request,由于路径匹配的优先级仅次于精确匹配,所以“/*”会覆
盖所有的扩展名匹配,很多404错误均由此引起,所以这是⼀种特别恶劣的匹配模式,⼀般只⽤于filter的url-pattern;“/”是servlet中特殊的匹配模式,切该模式有且仅有⼀个实例,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。