- 浏览: 333554 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- oracle (2)
- j2se (18)
- 应用服务器 (2)
- 操作系统 (21)
- j2ee (3)
- web (9)
- Junit (0)
- 项目 (0)
- IDE (0)
- 五花八门 (1)
- excel导入导出 (0)
- DWR (0)
- display标签总结 (0)
- JS (7)
- FCKeditor (0)
- Spring (3)
- webservice (1)
- JVM (14)
- 传输协议 (6)
- maven (3)
- 服务器 (2)
- 数据结构 (11)
- HTTPClient (2)
- JQUERY (9)
- 设计模式 (4)
- 数据库 (6)
- 看书笔记 (0)
- 工具 (4)
- MINA (3)
- mysql (5)
- jetty (1)
- JAVA网络编程 (7)
- Hessian (1)
- ibatis (1)
- socket (4)
- Native (1)
- http (2)
- nosql (2)
- linux (1)
- hadoop (1)
最新评论
-
applezjv:
可以...
maven常见问题 -
andyboy_bin:
p
Jetty -
ye_wx:
...
TableSpace -
ye_wx:
TableSpace -
极限_裁决:
引用第二:不要把“好像”;“有人会……”;“大概”;“晚些时候 ...
可以让你少奋斗10年的工作经验
Servlet容器工作原理
本 文介绍一个简单 servlet
容器的基本原理。现有两个servlet容器,第一个很简单,第二个则是根据第一个写出。为了使第一个容器尽量简单,所以没有做得很完整。复杂一些的
servlet容器(包括TOMCAT4和5)在TOMCAT运行内幕的其他章节有介绍。
init、 service和 destroy 方法是 Servlet 生命周期的方法。当 Servlet 类实例化后,容器加载 init,以通知 servlet 它已进入服务行列。init 方法必须被加载,Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等等,程序员可以重写这个方法。在其他情况下,这个方法一般为空。 service 方法由 Servlet 容器调用,以允许 Servlet 响应一个请求。Servlet 容器传递 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。ServletRequest 对象包含客户端 HTTP 请求信息,ServletResponse 则封装servlet 响应。这两个对象,您可以写一些需要 servlet 怎样服务和客户怎样请求的代码。 从service中删除Servlet实例之 前,容器调用destroy方法。在servlet容器关闭或servlet容器需要更多的内存时,就调用它。这个方法只有在servlet的 service方法内的所有线程都退出的时候,或在超时的时候才会被调用。在 servlet 容器调用 destroy方法之后,它将不再调用servlet的service方法。destroy 方法给了 servlet 机会,来清除所有候住的资源(比如:内存,文件处理和线程),以确保在内存中所有的持续状态和 servlet的当前状态是同步的。Listing 2.1 包含了PrimitiveServlet 的代码,此servlet非常简单,您 可以用它来测试本文中的servlet容器应用程序。 PrimitiveServlet 类实现了javax.servlet.Servlet 并提供了五个servlet方法的接口 。它做的事情也很简单:每次调用 init,service 或 destroy方法的时候,servlet就向控制口写入方法名。service 方法也从ServletResponsec对象中获得java.io.PrintWriter 对象,并发送字符串到浏览器。
HttpServer1 类
此文 await 方法和前文的不同点就是,此文的 await 方法中的请求调度到StaticResourceProcessor 或 ervletProcessor 。 如果 URI中包含 "/servlet/.",请求推进到后面,否则,请求传递到 StaticResourceProcessor 实例 Request 类 Servlet service 方法接受 servlet 容器的 javax.servlet.ServletRequest 和javax.servlet.ServletResponse 实例。因此,容器必须构建 ServletRequest和ServletResponse对象,然后将其传递到正在被服务的service 方法。 ex02.pyrmont.Request 类代表一个请求对象传递到 service 方法。同样地,它必须实现 javax.servlet.ServletRequest 接口。这个类必须提供接口内所有方法的实现。这里尽量简化它并只实现几个方法。要编译 Request 类的话,必须提供这些方法的空实现。再来看看 request 类,内部所有需要返回一个对象实例都返回null,如下:
另外,request 类仍需有前文有介绍的 parse 和getUri 方法。 Response 类 response 类实现 javax.servlet.ServletResponse,同样,该类也必须提供接口内所有方法的实现。类似于 Request 类,除 getWriter 方法外,其他方法的实现都为空。
PrintWriter 类构建器的第二个参数是一个代表是否启用 autoflush 布尔值 ,如果为真,所有调用println 方法都 flush 输出。而 print 调用则不 flush 输出。因此,如果在servelt 的service 方法的最后一行调用 print方法,则从浏览器上看不到此输出 。这个不完整性在后面的应用程序内会有调整。 response 类也包含有前文中介绍的 sendStaticResource方法。 StaticResourceProcessor 类 StaticResourceProcessor 类用于服务静态资源的请求。它唯一的方法是 process。
process 方法接受两个参数:Request 和 Response 实例。它仅仅是调用 response 类的 sendStaticResource 方法。 ServletProcessor1 类 ServletProcessor1 类用来处理对 servlet 的 HTTP 请求。 它非常简单,只包含了一个 process 方法。 而这个方法接受两个参数: 一个javax.servlet.ServletRequest 实例和一个 avax.servlet.ServletResponse实例。 process 方法也构建了一个 jsp servlet ejb .net.URLClassLoader 对象并使用它装载 servlet 类文件。 在从类装载器获得的 Class 对象上,process 方法创建一个 servlet 实例并调用它的 service 方法。 process 方法 Listing 2.4. ServletProcessor1 类中 process 方法
process方法接受两个参数:一个 ServletRequest实例和一个 ServletResponse 实例。process方法通过调用 getRequestUri 方法从 ServletRequest获取 URI。 String uri = request.getUri();切记 URI 的格式: /servlet/servletName servletName是servlet类的名称。 如 果要装载 servlet 类,则需要使用以下代码从 URI 获知 servlet 名称:String servletName = uri.substring(uri.lastIndexOf("/") + 1);然后 process 方法装载 servlet。 要做到这些,需要创建一个类装载器,并告诉装载器该类的位置, 该 servlet 容器可以指引类装载器在 Constants.WEB_ROOT 指向的目录中查找。 在工作目录下,WEB_ROOT 指向 webroot/ 目录。 如果要装载一个 servlet,则要使用 jsp servlet ejb .net.URLClassLoader 类,它是java.lang.ClassLoader 的间接子类。 一旦有了 URLClassLoader 类的实例,就可以使用 loadClass 方法来装载一个 servlet 类。 实例化 URLClassLoader 是很简单的。 该类有三个构建器,最简单的是: public URLClassLoader(URL[] urls); urls 是一组指向其位置 jsp servlet ejb .net.URL 对象, 当装载一个类时它会自动搜索其位置。任一以 / 结尾的 URL 都被假定为一目录, 否则,就假定其为 .jar 文件,在需要时可以下载并打开。 在 一个 servlet 容器内,类装载器查找 servlet 类的位置称为储存库 (repository)。在所举的应用程序中,类装载器只可在当前工作目录下的 webroot/ 目录查找,所以,首先得创建一组简单的 URL。 URL 类提供了多个构建器,因此有许多的方法来构建一个URL 对象。 在这个应用程序内,使用了和 TOMCAT 内另外一个类所使用的相同的构建器。 该构建器头部 (signature) 如下: public URL(URL context, String spec, URLStreamHandler hander) throws MalformedURLException 可以通过传递给第二个参数一个规范,传递给第一个和第三个参数 null 值来使用这个构建器, 但在些有另外一种可接受三个参数的构建器: public URL(String protocol, String host, String file) throws MalformedURLException 因此,如果只写了以下代码,编译器将不知道是使用的哪个构建器: new URL(null, aString, null); 当然也可以能过告诉编译器第三个参数的类型来避开这个问题,如: URLStreamHandler streamHandler = null; new URL(null, aString, streamHandler); 对于第二个参数,可以传递包含储存库 (repository) 的 String 。 以下代码可创建: String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString(); 结合起来,以下是构建正确 URLClassLoader 实例的 process 方法的部分代码
创 建储存库 (repository)的代码摘自org.apache.catalina.startup.ClassLoaderFactory内的 createClassLoader 方法,而创建 URL 的代码摘自org.apache.catalina.loader.StandardClassLoader 类内的 addRepository 方法。 但在此阶段您还没有必要去关心这些类。 有了类装载器,您可以使用loadClass方法装载servlet类:
然后,process方法创建已装载的 servlet类的实例,传递给 javax.servlet.Servlet ,并激活 servlet 的 service 方法:
编译并运行该应用程序 如果要编译该应用程序,在工作目录下键入以下命令: javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java 如果要在 windows 下运行该应用程序,在工作目录下键入以下命令: jsp servlet ejb -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer1 在 linux 环境下,使用冒号来隔开类库: jsp servlet ejb -classpath ./lib/servlet.jar:./ ex02.pyrmont.HttpServer1 如果要测试该应用程序,请在 URL 或浏览器地址栏键入以下命令: http://localhost:8080/index.html 或者是: http://localhost:8080/servlet/PrimitiveServlet 您将会在浏览器中看到以下文本: Hello. Roses are red. 注意:您不能看到第二行字符 (Violets are blue),因为只有第一行字符送入到浏览器。 Tomcat 运行工作原理 随后的章节会告诉您怎样来解决这个问题。 Application 2 第 一个应用程序里存在一个值得注意的问题。 在ServletProcessor1 类的 process 方法里,上溯 (upcast)ex02.pyrmont.Request 实例到 javax.servlet.ServletRequest,将其作为第一个参数传递给 servlet 的 service 方法。 另上溯(upcast) ex02.pyrmont.Response 实例到 javax.servlet.ServletResponse ,并将其作为第二个参数传递给 servlet 的 service 方法。
这 样会使安全性能大打折扣。 知道 servlet 容器工作原理的程序员可以将 ServletRequest 和 ServletResponse 实例向下转型 (downcast) 到Request 和 Response ,并调用它们的 public 方法。 Request 实例能调用它的 parse 方法; Request 实例能调用它的 sendStaticResource 方法。 可以将 parse 和 sendStaticResource 方法设为 private,因为在 ex02.pyrmont 里将会从其他类里调用它们。 然而,这两个方法在 servlet 内应该是不可用的。 一个解决方法是:给 Request 和 Response 类一个默认的访问修饰符,以致他们在 ex02.pyrmont 外不能被使用。 但还有一个更好的解决方法: 使用 facade 类。 在 第二个应用程序内,添加两个 facade 类:RequestFacade 和 ResponseFacade。 RequestFacade 类实现 ServletRequest 接口,并通过传递 Request 实例来实例化, Request 实例将在 ServletRequest 对象的构建器里被引用 。 ServletRequest 对象本身是 private 类型的,不能在类之外访问。 就构建 RequestFacade 对象,并将其传递给 service 方法,而不上溯 (upcast) Request 对象给 ServletRequest,并将其传递给 service 方法。 servlet 程序员仍旧可以向下转型 (downcast) ServletRequest 到 RequestFacade,但是,只要访问 ServletRequest 接口的可用方法就可以了。 现在,parseUri 就安全了。 Listing 2.5 显示 RequestFacade 类部分代码: Listing 2.5. RequestFacade 类
注意 RequestFacade 构造函数。 它会接受一个 Request 对象,即刻分配给私有的 servletRequest 对象引用。 还要注意,RequestFacade 内的每个方法调用 ServletRequest 对象内相应的方法。 ResponseFacade 类也是如此。 以下是 application 2 所包含的类
转自:http://lxs9731.blog.163.com/blog/static/34793702007112263521960/
|
发表评论
-
Session详解
2013-01-16 20:09 1028摘要:虽然session机制 ... -
tomcat与apache集群
2012-07-10 16:48 0集群与负载平衡 使用mod_jk默认的以轮循方式进 ... -
JSP文件上传组件
2011-11-14 21:25 12375JSP上传组件整理 第1个上传组件commons-f ... -
cookie和session机制之间的区别与联系
2011-11-14 21:09 1053cookie和session机制之 ... -
永久区域内存不足(PermGen space)
2011-11-08 18:44 1159PermGen space问题:java. ... -
http和https的区别
2011-10-12 23:02 1151什么是HTTPS: HTTPS(Secure Hyperte ... -
JSP页面中文乱码问题
2011-10-12 20:13 1233一、JSP页面显示乱码 二、表单提交中文时出现乱码 三 ... -
HTTPClient4.0基本应用
2011-09-15 21:21 3487HttpClient最新版本的应用:HttpCl ... -
Jetty
2011-07-31 23:24 2014Jetty 是一个开源的servlet容器,它为基于Java的 ... -
tocmat apache负载均衡
2011-07-31 16:56 179ubuntu下apache+tomcat+jk配置 ... -
tocmat与apache区别
2011-07-31 16:40 221Apache vs Tomcat ... -
tomcat与apache
2011-07-31 16:27 158本文转自:http://myb.iteye.com/blog/ ... -
HTTP协议
2011-06-23 15:14 1068HTTP简介 1.WEB浏览器与WEB服务器之间的一问一 ... -
关于open.window()
2009-09-17 23:55 1330系统中用javascript中的window.open后,页面 ...
相关推荐
SERVLET 基本原理 SERVLET 基本原理是指 SERVLET 的装载、初始化、服务和销毁等过程。SERVLET 是一种小型的 Java 程序,可以在 Web 服务器中运行,提供动态网页服务。 SERVLET 生命周期是指 SERVLET 从创建到销毁...
### Servlet容器工作原理 #### 一、概述 Servlet容器,如Tomcat,是Java Web应用的基础组成部分之一。本文旨在深入探讨Tomcat中的Servlet容器工作原理,重点解释Servlet容器如何加载和管理Servlet,以及如何处理...
### Servlet工作原理详解 #### 一、Servlet简介与工作流程 Servlet是一种服务器端的Java应用程序,主要用于接收客户端发送的HTTP请求,并返回响应结果。Servlet在Java Web开发中扮演着核心角色,它负责处理用户...
`init()`方法由Servlet容器自动调用,开发者可以在其中进行一些基本的初始化工作,如数据库连接、读取配置文件等。 - 当Servlet类继承自`HttpServlet`时,如果子类没有定义自己的`init()`方法,则会默认调用父类...
本文将通过使用Servlet来模拟Struts1的工作流程,深入理解其核心机制。 首先,让我们探讨Struts1的基本架构。Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml...
**Servlet基本工作原理** Servlet的核心工作流程包括: 1. `HttpServlet`是一个抽象类,我们创建的Servlet需要继承它,并覆盖`doPost()`和`doGet()`方法。 2. 当Web容器接收到请求时,会调用`service()`方法,该方法...
在这个讲解中,我们将深入探讨Servlet容器的工作原理以及Servlet接口的关键方法。 首先,Servlet容器(如Tomcat)的核心职责是管理和调度Servlet实例。当一个HTTP请求到达服务器时,Servlet容器负责解析请求,识别...
下面将详细阐述这三个阶段以及Servlet的工作原理。 1. 初始化阶段: 当Servlet容器(如Tomcat)启动时,可以通过在`web.xml`配置文件中设置`<load-on-startup>`标签来指定Servlet在容器启动时自动加载,或者在容器...
### Servlet工作原理深入解析 #### 一、引言 随着互联网技术的快速发展,Web应用程序已成为企业和个人进行在线交互的重要手段。在众多Web开发框架和技术中,Servlet作为一种基于Java的服务器端编程模型,自诞生...
Servlet是Java Web开发中的核心组件,它是一种服务器端的Java应用程序,用于处理来自客户端(通常是Web浏览器)的请求并...通过源码阅读和实践,我们可以更好地掌握Servlet的工作机制,并利用相关工具提高开发效率。
### Servlet工作原理与生命周期解析 #### 一、Servlet概述 Servlet是Java Web开发中的核心组件之一,主要用于处理客户端发送到服务器端的HTTP请求,并生成相应的响应。Servlet技术由Sun Microsystems在1997年推出...
Servlet的基本原理 使用Ajax增强用户体验 使用分层思想进行程序设计 使用session保存用户和购物车信息 使用面向对象编程进行实现功能开发 能够使用JDBC实现数据库访问 能够使用EL+JSTL简化页面布局
- **无参 init() 方法**:首先调用无参的 `init()` 方法,进行一些基本的初始化工作。 - **有参 init(ServletConfig config) 方法**:随后调用有参的 `init(ServletConfig config)` 方法,传入 `ServletConfig` ...
Servlet的工作原理可以分为三个主要步骤: 1. **请求**:当客户端(通常是浏览器)发起HTTP请求时,该请求被Web服务器接收。如果请求的目标是一个Servlet,Web服务器会根据`web.xml`配置文件找到对应的Servlet实例...
### 深入Java Web心脏:Servlet工作原理全解析 ...以上内容涵盖了Java语言的基本特征、应用领域以及Servlet的工作原理和实现方式。通过了解这些知识点,开发者能够更好地利用Java进行Web应用的开发。
以下将详细讲解Servlet框架的基本源码及其工作原理。 1. **Servlet的生命周期** Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。在Web应用启动时,Servlet容器(如Tomcat)会根据web.xml配置文件加载...