Servlet 可以被多次映射

同一个 Servlet 可以被多次映射到不同的 URL 上

  1. <servlet>
  2. <servlet-name>Demo</servlet-name>
  3. <servlet-class>com.example.Demo</servlet-class>
  4. </servlet>
  5. <!-- 映射一 -->
  6. <servlet-mapping>
  7. <servlet-name>Demo</servlet-name>
  8. <url-pattern>/demo</url-pattern>
  9. </servlet-mapping>
  10. <!-- 映射二 -->
  11. <servlet-mapping>
  12. <servlet-name>Demo</servlet-name>
  13. <url-pattern>/other</url-pattern>
  14. </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共享 资源的时候就会出现线程安全问题

原则:

  1. 如果一个变量需要多个用户共享,则应当在访问变量的时候,使用同步机制,如 synchronized 或者 Lock
  2. 如果一个变量不需要共享,则直接在 doGet() 或 doPost() 中定义

4、load-on-startup

如果在 元素中配置了⼀个 元素,那么WEB应⽤程序在启动时,就会 装载并创建Servlet的实例对象、以及调⽤Servlet实例对象的init()方法
image.png

5、tomcat 中存在一个默认的 servlet(DefaultServlet)

  • url-pattern 为 ‘/’,用于处理在 web.xml 中找不到匹配的元素的URL,包括静态图片、静态网页等
  • 如果在 web.xml 中配置了这个映射,则默认的 DefaultServlet 就不会生效

6、ServletConfig 对象:通过此对象可以读取 web.xml 中配置的初始化参数

  • 先在servlet中进行配置

    1. ![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 文件中配置的参数

    1. ![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 之间的通信:

  1. 在第一个 Servlet 将数据存入ServletContext:

    image.png

  2. 在第二个 Servlet 中通过 ServletContext.getAttribute() 获取

    image.png

使用 ServletContext 获取整个 web 站点的配置信息:

  • 在 web.xml 中对整个站点配置参数

    1. ![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 获取

    1. ![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)