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

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

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

例如

 <servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>cn.itcast.servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>

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

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

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

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

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

如果在<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-start>2</load-on-start>

<servlet>

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

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

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

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

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

线程安全问题

当多个客户端并发访问同一个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(过时的)。

标记接口,作用是打一个标签

Serializable

Cloneable

SingleThreadModel

子类不能比父类抛更多的异常

Servlet的一些细节的更多相关文章

  1. Servlet的一些细节问题

    Servlet的细节问题 1.一个已经注册的Servlet可以被多次映射即: <servlet> <!-- servlet的注册名 --> <servlet-name&g ...

  2. servlet中的细节

    Get方法有大小限制:1024个字符.这些信息使用 Query_String头传递,并通过Query_String环境变量访问.Post方法:请求体信息使用FromData头传递.读取所有表单参数:g ...

  3. Servlet的一些细节(2)

    1. Servlet的创建时间 Servlet是不能单独运行,调用它的叫做Servlet引擎,或者叫做web服务器 针对客户端的多长Servlet请求,通常情况下,服务器只会创建一个Servlet实例 ...

  4. Servlet的一些细节(1)

    1.  Servlet程序必须映射到一个URL地址 由于客户端是通过URL访问web服务器资源,所以Servlet程序必须映射到一个URL地址.这个工作在web.xml文件中使用<servlet ...

  5. [Java.Web] Servlet 的一些细节

    本文来自 传智播客视频PPT 1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet 程序映射到一个 URL 地址上,这个工 ...

  6. 2016-2-1 Servlet细节

    Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...

  7. JavaWeb -- Servlet运行过程 和 细节

    Servlet的运行过程 lServlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象.如果是,则 ...

  8. Servlet映射细节

    Servlet的映射细节: 1):一个Servlet程序(Web组件),可以配置多个<url-pattern>,表示一个Servlet有多个资源名称. <servlet-mappin ...

  9. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

随机推荐

  1. my.cnf重要配置参数说明

    不同存储引擎中关键参数优化 MyISAM存储引擎 MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统 官方文档:http://dev.mysql.com/doc/refman/5.6/en/ ...

  2. 每个程序员都应该了解的 CPU 高速缓存

    每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写“程序员都该知道存储器”的第二 ...

  3. matlab之fliplr()函数

    fliplr  左右翻转矩阵 语法: B = fliplr(A) 将矩阵A的列绕垂直轴进行左右翻转 matabc 如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转. 如果A是一个列向量, ...

  4. html布局 左右固定,中间只适应,三种方法实现

    html布局 左右固定,中间只适应,三种方法实现 使用自身浮动法定位 //html <h3>使用自身浮动法定位</h3> <div id="left_self& ...

  5. 封装 oschina.net 表情选择

    1. [代码]jquery.facial.js //从OSCHINA.NET 提取出来的 表情选择 插件 by zhouxiang //如果有不满足的地方 可以自己改改 没事随便写写的 style 和 ...

  6. Atom插件及使用

    Atom比较好用的编辑工具之一,之前用过 HBuilder 和 Sublime Text ,个人感觉HBuider适合初级人们的人用. Atom好处之一是他的packages管理安装非常方便,你也可以 ...

  7. java事务(一)——事务特性

    事务 什么是事务?事务通俗的讲就是要做的事,在计算机术语中一般指访问或更新数据库中数据的一个工作单元.说起事务,那么就要提到事务的ACID特性,即原子性(atomicity).一致性(consiste ...

  8. ADO-添加msado15.dll及基本类对象的了解

    一.dll文件的导入 参考文献:https://blog.csdn.net/qq_31209383/article/details/51199762 要使用数据库,首先在stdafx.h中导入msad ...

  9. 数据库的join查询

    假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示: id name id name -- ---- -- ---- 1 ...

  10. FFMPEG实现H264的解码(从源代码角度)

    农历2014年底了,将前段时间工作中研究的FFMPEG解码H264流程在此做一下整理,也算作年终技术总结了! H264解码原理: H264的原理参考另一篇博文 http://blog.csdn.net ...