Servlet规范

Servlet规范

一个最基本的 Java Web 项目所需的 jar 包只需要一个 servlet-api.jar ,这个 jar 包中的类大部分都是接口,还有一些工具类,共有 2 个包,分别是 javax.servlet 和 javax.servlet.http。所有的 Servlet 容器都带有这个包,你无需再放到Web项目里,放到这里只不过是编译的需要,运行是不需要的。如果你硬是把 servlet-api.jar 放到 webapp/WEB-INF/lib 目录下,那么 Tomcat 启动时还会报一个警告信息。

Servlet 是 J2EE 最重要的一部分,有了 Servlet 你就是 J2EE 了,J2EE 的其他方面的内容择需采用。而 Servlet 规范你需要掌握的就是 servlet 和 filter 这两项技术。绝大多数框架不是基于 servlet 就是基于 filter,如果它要在 Servlet 容器上运行,就永远也脱离不开这个模型。

为什么 Servlet 规范会有两个包,javax.servlet 和 javax.servlet.http ,早先设计该规范的人认为 Servlet 是一种服务模型,不一定是依赖某种网络协议之上,因此就抽象出了一个 javax.servlet ,同时在提供一个基于 HTTP 协议上的接口扩展。但是从实际运行这么多年来看,似乎没有发现有在其他协议上实现的 Servlet 技术。

Servlet 规范其实就是对 HTTP 协议做面向对象的封装,HTTP协议中的请求和响应就是对应了 HttpServletRequest 和 HttpServletResponse 这两个接口。可以通过 HttpServletRequest 来获取所有请求相关的信息,包括 URI、Cookie、Header、请求参数等等,别无它路。因此当你使用某个框架时,你想获取HTTP请求的相关信息,只要拿到 HttpServletRequest 实例即可。

而 HttpServletResponse接口是用来生产 HTTP 回应,包含 Cookie、Header 以及回应的内容等等。

HTTP 协议里是没有关于 Session 会话的定义,Session 是各种编程语言根据 HTTP 协议的无状态这种特点而产生的。其实现无非就是服务器端的一个哈希表,哈希表的Key就是传递给浏览器的名为 jsessionid 的 Cookie 值。

当需要将某个值保存到 session 时,容器会执行如下几步:

a. 获取 jsessionid 值,没有的话就生成一个,也就是 request.getSession() 这个方法

b. 拿到的 HttpSession 对象实例就相当于一个哈希表,你可以往哈希表里存放数据(setAttribute)

c. 你也可以通过 getAttribute 来获取某个值

而这个名为 jsessionid 的 Cookie 在浏览器关闭时会自动删除。把 Cookie 的 MaxAge 值设为 -1 就能达到浏览器关闭自动删除的效果。

在 servlet 中有一个包 javax.servlet.jsp 是跟 JSP 相关的一些接口规范定义。JSP 比 Servlet 方便的地方在于可直接修改立即生效,不像 Servlet 修改后必须重启容器才能生效。

因此 JSP 适合用来做视图,而 Servlet 则适合做控制层。

Servlet线程安全

servlet中默认线程不安全,单例多线程,因此对于共享的数据(静态变量,堆中的对象实例等)自己维护进行同步控制,不要在service方法或doGet等由service分派出去的方法,直接使用synchronized方法,很显然要根据业务控制同步控制块的大小进行细粒度的控制,将不影响线程安全的耗时操作移出同步控制块;

 针对Servlet的线程安全问题,Sun公司是提供有解决方案的:让Servlet去实现一个SingleThreadModel接口,如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。

  查看Sevlet的API可以看到,SingleThreadModel接口中没有定义任何方法和常量,在Java中,把没有定义任何方法和常量的接口称之为标记接口,经常看到的一个最典型的标记接口就是"Serializable",这个接口也是没有定义任何方法和常量的,标记接口在Java中有什么用呢?主要作用就是给某个对象打上一个标志,告诉JVM,这个对象可以做什么,比如实现了"Serializable"接口的类的对象就可以被序列化,还有一个"Cloneable"接口,这个也是一个标记接口,在默认情况下,Java中的对象是不允许被克隆的,就像现实生活中的人一样,不允许克隆,但是只要实现了"Cloneable"接口,那么对象就可以被克隆了。

  让Servlet实现了SingleThreadModel接口,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。

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

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

Servlet(Filter)中的url-pattern

Serlvet和Filter有三种不同的匹配规则: 
(1)精确匹配:/foo; 
(2)路径匹配:/foo/*; 
(3)后缀匹配:*.html; 
Serlvet的匹配顺序是: 
首先进行精确匹配;如果不存在精确匹配的进行路径匹配;最后根据后缀进行匹配;一次请求只会匹配一个Servlet;(Filter是只要匹配成功就添加到FilterChain)

PS:其他写法(/foo/,/*.html,*/foo)都不对;“/foo*”不能匹配/foo,/foox;

时间: 2024-10-27 18:01:15

Servlet规范的相关文章

Servlet 规范笔记—基于http协议的servlet

在上一章节,我们大概的描述了servlet的规范以及servlet和servlet容器的概念和用途,我们清楚的知道servlet容器提供了接收来自client端的请求,然后根据请求进行处理(如:执行对应的servlet生成动态内容,或读取静态资源等),最后将client请求的资源响应给client端.在以上过程中,有一点需要注意,那就是根据servlet容器的作用,client端和server端需要交互传输数据,而在internet上的数据传输一定是基于某种传输协议的,如http.ftp等. 而

Servlet规范简介

引言 Web 框架一般是通过一个 Servlet 提供统一的请求入口,将指定的资源映射到这个 servlet, 在这个 servlet 中进行框架的初始化配置,访问 Web 页面中的数据,进行逻辑处理后,将结果数据与的表现层相融合并展现给用户. WEB 框架想要在符合 Servlet 规范的容器中运行,同样也要符合 Servlet 规范. 将一个 WEB 框架注入到一个 servlet 中,主要涉及到 Servlet 规范中以下部分: Ø         部署描述符 Ø         映射请求

第十章 Web Application(JavaTM Servlet 规范3.1 )

Web 应用 Web应用是Web服务器上组成一个完整应用的 servlets,HTML pages,classes 和其他资源的一个集合.Web应用可以被捆绑并运行在不同供应商的不同容器内. 10.1 Web服务器中的Web应用? Web服务器里的Web应用以一个特定的路径为根.例如,catalog应用可能定位到http://www.mycorp.com/catalog.所有以此前缀为开始的请求会被路由到代表该 catalog 应用的 ServletContext.servlet 容器可以创建

第二章 Servlet 接口(JavaTM Servlet 规范3.1 )

Servlet 接口 Servlet 接口是 Java Servlet API 的核心抽象.所有 servlet 要么直接要么间接地实现该接口,通过扩展一个类实现此接口.在 Java Servlet API 中有两个类 GenericServlet 和 HttpServlet 实现了此 Servlet 接口.为了更多目的,开发者将扩展 HttpServlet 来实现他们的 servlet. 2.1 请求处理方法 为处理客户端请求,基础 Servlet 接口定义了一个 service 方法.ser

第十二章 映射请求到Servlet(JavaTM Servlet 规范3.1 )

Mapping Requests to Servlets 映射请求到 Servlet The mapping techniques described in this chapter are required for Web containers mapping client requests to servlets. Web 容器需要使用本章描述的映射技术将客户端请求映射到 servlet. 12.1 Use of URL Paths 使用 URL 路径 Upon receipt of a c

servlet及编程规范

servlet规范 一 servlet简介 servlet是运行在服务器中的动态资源,能接收用户的请求,发出响应. 二 servlet的执行过程 1.在地址栏输入访问的路径 2.tomcat解析路径找到要访问的APP文件夹,找到web.xml文件 3.根据访问的url查找文件映射 找到配置的sevlet名称 4.根据sevelet名称找到对应的类名 5.运用反射机制 实例化servlet类 6.创建request 和 response 对象 7.调用service方法 三 servlet的生命周

Servlet的历史与规范

一.Servlet历史 1. Servlet的由来 背景 上世纪90年代,随着Internet和浏览器的飞速发展,基于浏览器的B/S模式随之火爆发展起来. 最初,用户使用浏览器向WEB服务器发送的请求都是请求静态的资源,比如html.css等. 但是可以想象:根据用户请求的不同动态的处理并返回资源是理所当然必须的要求. CGI 必须要满足上述需求,所以CGI(Common Gateway Interface)出现了.CGI程序使用C.Shell Script或Perl编写,CGI是为特定操作系统

servlet是一组规范--Servlet是JavaEE规范的一种

Java Servlet API是Servlet容器和Servlet之间的接U,它定义了Servlet的各种方法, 还定义了Servlet容器传送给Servlet的对象类,其中最重要的是请求对象ServletRequest和 响应对象ServletResponseo这两个对象都是由Servlet容器在客户端调用Servlet时产生的, Servlet容器把客户请求信息封装在ServletRequest对象中,然后把这两个对象都传送给要调 用的Servlet,Servlet处理完后把响应结果写入S

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------