Servlet的运行过程

lServlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 

Tip:Servlet的一些细节(1)

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。

一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

<web-app>

<servlet>

<servlet-name>AnyName</servlet-name>

<servlet-class>HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>AnyName</servlet-name>

<url-pattern>/demo/hello.html</url-pattern>

</servlet-mapping>

</web-app>

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

在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

<servlet-mapping>

<servlet-name>

AnyName

</servlet-name>

<url-pattern>

*.do

</url-pattern>

</servlet-mapping>

3.

Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

4.

如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

 举例:

 <servlet>

  <servlet-name>invoker</servlet-name>

  <servlet-class>

   org.apache.catalina.servlets.InvokerServlet

  </servlet-class>

  <load-on-startup>2</load-on-startup>

 </servlet>

用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。

5.

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。



6.

当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

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

SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。 

对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。

实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。

最新文章

  1. linux下,如何把整个文件夹上传到服务器(另一台linux)
  2. 编译安装nginx并修改版本头信息—参考实例
  3. EditText默认不显示光标,不可编辑,点击它,进入编辑状态,光标显示
  4. DataNode连接错误Retrying connect to server
  5. Bootstrap3.0学习第八轮
  6. GitHub的实践
  7. cxgrid学习
  8. win32多线程编程
  9. Oracle EBS R12文件系统结构(学习汇总网上资料)
  10. spring学习总结——高级装配学习三(Bean的作用域)
  11. python基础-----变量和简单数据类型
  12. MacOs 安装cordova报无权访问题解决方案
  13. Linux之cp、rm、mv
  14. 解决eclipse中Tomcat服务器的server location选项不能修改的问题
  15. mysql主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)
  16. 自学huawei之路-AC6005版本升级步骤
  17. no matching editors or conversion strategy found
  18. ubuntu下没有ping命令
  19. 水晶报表VS2010防止出现用户登录问题
  20. 160615、Spring3 MVC 拦截器拦截不到的问题

热门文章

  1. sgu101-欧拉回路
  2. Python基础之模块2
  3. hdu 1398 Square Coins 分钱币问题
  4. 2017年Android百大框架排行榜(转)
  5. sam配置命令概要
  6. django定时任务实现(言简意赅) Django折腾记之启动定时任务(转)
  7. ubuntu16.04下hive安装与配置
  8. ASP.NET MVC + ADO.NET EF 项目实战(一):应用程序布局设计
  9. python查询IP地址所属地
  10. 算法设计 mac 字符串 标识 n维度 2 3维度 字符串 标识值 特征值