Servlet 可以被多次映射
同一个 Servlet 可以被多次映射到不同的 URL 上
<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.example.Demo</servlet-class>
</servlet>
<!-- 映射一 -->
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<!-- 映射二 -->
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/other</url-pattern>
</servlet-mapping>
上面的 localhost:8080/demo 和 localhost:8080/other 指向同一个 Servlet
Servlet 映射的 URL
Servlet 支持如下的映射规则:
- 以 ‘/’ 字符开始,以 “/*” 后缀结尾的字符串用于路径匹配
- 以 “*.” 开始的字符串用于扩展名映射
- 空字符串,映射到应用的上下文根
Servlet 是单例的
1、Servlet 是单例的
浏览器多次对Servlet的请求,一般情况下,服务器之创建一个 Servlet 对象,换句话说,Servlet 对象一旦创建,就会驻留在内存中,为后续请求服务,直到服务器关闭
2、每次请求对象和响应对象都是新的
对于每次访问请求,Servlet 引擎都会创建⼀个新的 HttpServletRequest 请求对象和⼀个新的 HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调⽤的Servlet的service() 方法,service⽅法再根据请求⽅式分别调⽤doXXX方法
3、线程共享
当多个⽤户访问Servlet的时候,服务器会为每个⽤户创建⼀个线程。当多个⽤户并发访问Servlet共享 资源的时候就会出现线程安全问题
原则:
- 如果一个变量需要多个用户共享,则应当在访问变量的时候,使用同步机制,如 synchronized 或者 Lock
- 如果一个变量不需要共享,则直接在 doGet() 或 doPost() 中定义
4、load-on-startup
如果在
5、tomcat 中存在一个默认的 servlet(DefaultServlet)
- url-pattern 为 ‘/’,用于处理在 web.xml 中找不到匹配的元素的URL,包括静态图片、静态网页等
- 如果在 web.xml 中配置了这个映射,则默认的 DefaultServlet 就不会生效
6、ServletConfig 对象:通过此对象可以读取 web.xml 中配置的初始化参数
先在servlet中进行配置
![image.png](https://cdn.nlark.com/yuque/0/2020/png/750131/1606194122675-603b5b3b-cc18-497b-bd31-8565f4a0369c.png#align=left&display=inline&height=216&margin=%5Bobject%20Object%5D&name=image.png&originHeight=397&originWidth=720&size=45442&status=done&style=none&width=392)
然后在 servlet 中获取 ServletConfig 对象,然后再在 ServletConfig 对象获取在 web.xml 文件中配置的参数
![image.png](https://cdn.nlark.com/yuque/0/2020/png/750131/1606194959007-1bba20ed-6298-4b3f-ab97-1695e34b6c6c.png#align=left&display=inline&height=112&margin=%5Bobject%20Object%5D&name=image.png&originHeight=264&originWidth=933&size=38479&status=done&style=none&width=396)
7、ServletContext 对象:在 tomcat 启动时,就会创建一个 ServletContext 对象,它代表着当前站点,ServletContext 有如下作用
- 因为 ServletContext 代表当前站点,所以所有Servlet都共享着⼀个ServletContext对象, 所以Servlet之间可以通过ServletContext实现通讯
- ServletConfig 获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个 web 站点的参数信息
- 利用ServletContext读取web站点的资源文件
ServletContext 被称为域对象,可以实现 Servlet 之间的通信:
在第一个 Servlet 将数据存入ServletContext:
在第二个 Servlet 中通过 ServletContext.getAttribute() 获取
使用 ServletContext 获取整个 web 站点的配置信息:
在 web.xml 中对整个站点配置参数
![image.png](https://cdn.nlark.com/yuque/0/2020/png/750131/1606201560760-87252918-411e-4211-8910-bc5506c78d9b.png#align=left&display=inline&height=102&margin=%5Bobject%20Object%5D&name=image.png&originHeight=129&originWidth=496&size=14353&status=done&style=none&width=392)
在Servlet中通过 ServletContext 获取
![image.png](https://cdn.nlark.com/yuque/0/2020/png/750131/1606201653015-d5064e8d-657d-47a9-871f-69eaa5341c85.png#align=left&display=inline&height=88&margin=%5Bobject%20Object%5D&name=image.png&originHeight=175&originWidth=783&size=28240&status=done&style=none&width=391.5)