Servlet的一些细节
由于客户端是通过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的一些细节的更多相关文章
- Servlet的一些细节问题
Servlet的细节问题 1.一个已经注册的Servlet可以被多次映射即: <servlet> <!-- servlet的注册名 --> <servlet-name&g ...
- servlet中的细节
Get方法有大小限制:1024个字符.这些信息使用 Query_String头传递,并通过Query_String环境变量访问.Post方法:请求体信息使用FromData头传递.读取所有表单参数:g ...
- Servlet的一些细节(2)
1. Servlet的创建时间 Servlet是不能单独运行,调用它的叫做Servlet引擎,或者叫做web服务器 针对客户端的多长Servlet请求,通常情况下,服务器只会创建一个Servlet实例 ...
- Servlet的一些细节(1)
1. Servlet程序必须映射到一个URL地址 由于客户端是通过URL访问web服务器资源,所以Servlet程序必须映射到一个URL地址.这个工作在web.xml文件中使用<servlet ...
- [Java.Web] Servlet 的一些细节
本文来自 传智播客视频PPT 1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet 程序映射到一个 URL 地址上,这个工 ...
- 2016-2-1 Servlet细节
Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...
- JavaWeb -- Servlet运行过程 和 细节
Servlet的运行过程 lServlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象.如果是,则 ...
- Servlet映射细节
Servlet的映射细节: 1):一个Servlet程序(Web组件),可以配置多个<url-pattern>,表示一个Servlet有多个资源名称. <servlet-mappin ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
随机推荐
- P3338 [ZJOI2014]力(FFT)
题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...
- debian下配置dynamic printk以及重新编译内核
在以前的一篇博文<编译debian内核>已经提过了重新编译内核的方法,但是整个过程花费时间较长,并且生成deb包. 这里我采用稍微简单一些的方法,因为我并没有对内核或者驱动代码做任何修改, ...
- Struts2的使用
Struts2的核心类库 名称 说明 Struts2-core-2.3.4.jar 核心类库 Xwork-core-2.3.4.jar Xwork的核心类库 Ognl-3.0.5.jar Ognl表达 ...
- CSS控制表格嵌套
网页设计应用中,当我们不能完全放弃表格的使用时,为了达到预期的效果,不免要用到表格嵌套(特别是多层嵌套)方式来进行布局.可能很多同仁都遇到过这样的问题,为了达到显示效果要为每一个(每一层)的表格写不同 ...
- Java丨JDK与JRE
小编是以为热爱Java的程序员,可是在我身边的一部分人他们不知道JDK和JRE是什么,有什么区别! 今天小编以个人的理解来说一说,不足之处还望大家指证. 首先我们来看看JDK和JRE他们两个的英文意思 ...
- SQL的CASE表达式用法
case 表达式从SQL-92标准开始引入,因此是不依赖于具体的数据库技术,可提高SQL代码的可移植性. case表达式注意事项: 1. 统一各个分支返回数据类型,并保证各个when字句的排他性,因为 ...
- php实现多文件上传和下载。
http://1229363.blog.163.com/blog/static/19743427200751291055264/
- C语言小程序(三)、判断两个日期之差
输入两个日期,计算之间相差多少天. 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样. 1.普通的写法 #include <stdio.h> int leapyear(int ...
- 本地未安装Oracle数据库,如何连接远程Oracle数据库
方法一:用Navicat Premium连接 注意,这里用的要是黄色的版本,而不是只针对Mysql的绿色版本 工具栏选择[工具]-[选项],点击[其他-OCI] 你会发现有个OCI librar ...
- noip退役赛
上下午 6 题一起考 自闭了 T1 小明要参加一场比赛,赛制给你一个表格 $p$ ,$p_{(i,j)}$ 表示他在第 $i$ 场比赛前如果输了 $j$ 场,他这一场赢的概率,他也可以故意输掉任意多场 ...