[Java.Web] Servlet 的一些细节

本文来自 传智播客视频PPT

1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet

程序映射到一个 URL 地址上,这个工作在 web.xml 文件中使用 <servlet> 元素和 <servlet-mapping> 元素完成。

2. <servlet> 元素用于注册 servlet ,它包含有两个主要的子元素:<servlet-name> 和<servlet-class>

分别用于设置 Servlet 的注册名称和 Servlet 的完整类名。

3. 一个<servlet-mapping> 元素用于映射一个已注册的 Servlet 的一个对外访问路径,它包含有两个子元素:

<servlet-name> 和 <url-pattern> ,分别用于指定 Servlet 的注册名称和 Servlet 的对外访问路径。

4. 同一个 Servlet 可以被映射到多个 URL 上,即多个 <servlet-mapping> 元素的<servlet-name> 子元素的设置值

可以是同一个 Servlet 的注册名。

5. 在 Servlet 映射到的 URL 中也可以使用 * 通配符,但是只能有两种固定的格式:

一种格式是 “*.扩展名”,另一种格式是以正斜杠(/)开头并以(/*)结尾。利用 * 可以做伪静态网站。

6. 映射匹配优先级示例:

  Servlet1 映射到 /abc/*

  Servlet2 映射到 /*

  Servlet3 映射到 /abc

  Servlet4 映射到 *.do

当请求URL 为 /abc/a.html 时,1和2 都匹配,Servlet 引擎会调用 1.

当请求URL 为 /abc 时,1、2和3 都匹配,Servlet 引擎会调用 3.

当请求URL 为 /abc/a.do 时,1和4 都匹配,Servlet 引擎会调用 1.

当请求URL 为 /a.do 时,2和4 都匹配,Servlet 引擎会调用 2.

当请求URL 为 /xxx/yyy/a.do 时,2和4 都匹配,Servlet 引擎会调用 2.

7. Servlet 是一个供其他 Java 程序(Servlet 引擎)调用的 Java 类,它不能独立运行,它的运行完全由

 Servlet 引擎来控制和调度。

8. 针对客户端的多次 Servlet 请求,通常情况下,服务器只会创建一个 Servlet 实例对象,也就是说

 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至 web 容器退出,

 Servlet 实例对象才会销毁。

9. 在 Servlet 的整个生命周期内,Servlet 的 init 方法只被调用一次。

 而对一个 Servlet 的每次访问请求都导致 Servlet 引擎调用一次 servlet 的service 方法。

 对于每次访问请求,Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个新的

 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet 的 service()

 方法,service 方法再根据请求方式分别调用 doXXX 方法。

10. 当多个客户端并发访问同一个 Servlet 时,web 服务器会为每一个客户端的访问请求创建一个线程,

 并在这个线程上调用 Servlet 的 service 方法,因此 service 方法内如果访问了同一个资源的话,就有可能

 引发线程安全问题。

11. 如果某个 Servlet 实现了 SingleThreadModel 接口,那么 Servlet 引擎将以单线程模式来调用其 service 方法。

12. SingleThreadModel 接口中没有定义任何方法,只要在 Servlet 类的定义中增加实现 SingleThreadModel 接口

 的声明即可。

13. 对于实现了 SingleThreadModel 接口的 Servlet,Servlet 引擎仍然支持对该 Servlet 的多线程并发访问,

 其采用的方式是产生多个 Servlet 实例对象,并发的每个线程分别调用一个独立的 Servlet 实例对象。

14. 实现 SingleThreadModel 接口并不能真正解决 Servlet 的线程安全问题,因为 Servlet 引擎会创建多个 Servlet

 实例对象,而真正意义上解决多线程安全问题是指一个 Servlet 实例对象被多个线程同时调用的问题。

 事实上,在 Servlet API 2.4 中,已经将 SingleThreadModel 标记为 Deprecated (过时的)。

原文地址:https://www.cnblogs.com/z5337/p/6785775.html