- 浏览: 326739 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 934摘要:虽然session机制 ... -
tomcat与apache集群
2012-07-10 16:48 0集群与负载平衡 使用mod_jk默认的以轮循方式进 ... -
JSP文件上传组件
2011-11-14 21:25 12327JSP上传组件整理 第1个上传组件commons-f ... -
cookie和session机制之间的区别与联系
2011-11-14 21:09 1010cookie和session机制之 ... -
永久区域内存不足(PermGen space)
2011-11-08 18:44 1119PermGen space问题:java. ... -
http和https的区别
2011-10-12 23:02 1012什么是HTTPS: HTTPS(Secure Hyperte ... -
JSP页面中文乱码问题
2011-10-12 20:13 1102一、JSP页面显示乱码 二、表单提交中文时出现乱码 三 ... -
HTTPClient4.0基本应用
2011-09-15 21:21 3440HttpClient最新版本的应用:HttpCl ... -
Jetty
2011-07-31 23:24 1946Jetty 是一个开源的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 1016HTTP简介 1.WEB浏览器与WEB服务器之间的一问一 ... -
关于open.window()
2009-09-17 23:55 1284系统中用javascript中的window.open后,页面 ...
相关推荐
描述SERVLET基本原理,包括SERVLET装载、INIT()、SERVICE()、DESTORY(),以及多线程并发处理
因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求。本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在...
Servlet的基本原理 使用Ajax增强用户体验 使用分层思想进行程序设计 使用session保存用户和购物车信息 使用面向对象编程进行实现功能开发 能够使用JDBC实现数据库访问 能够使用EL+JSTL简化页面布局
(1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术实现一个简单的聊天室,实现多人同时交流。当发送聊天信息时,信息窗口刷新。信息窗口显示发言人的姓名以及发言的内容。...
Javaee实习包含详细代码,实验步骤,学习Servlet的编写、使用JDBC访问数据库;Servlet及过滤器,包含配置截图
采用基本的servlet和jsp,jdbc,采用mvc模式的架构开发
此项目简单,便于理解基本原理,为复杂的Servlet、SSH、SSM等复杂项目的开发打下基础。 实现登录 、 注册 、 增 、 删 、 改 、 查 ; 可继续完善增加前端、校验、其他功能等; 可作为 Servlet项目 开发练习基础...
本文将介绍Servlet技术的基本原理以及使用方式。 首先,Servlet是一个Java类,它可以接收HTTP请求并且生成HTTP响应。当服务器接收到HTTP请求时,它会将请求转发给相应的Servlet进行处理。Servlet可以动态地生成HTML...
Struts1工作原理浅析 1.引入struts1 2.struts1工作原理 3.struts1工作机制 4.struts1的安装于基本配置 5.ActionServlet
掌握web服务的基本概念和工作原理,学会创建和调用web服务。JUNIT测试的应用,程序的正确需要大量的测试,JUnit是一个Java测试框架,用于编写和运行可重复的测试。学会XFire框架下开发和配置web服务
Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。
通过java的反射技术实现MVC功能的基本原理 二、主要功能 自定义注解,dom4j读取配置文件,反射读取路由,实现了登录功能的逻辑,对理解MVC原理有一定帮助 三、注意事项 开发环境为jdk1.8,无数据库
jsp 原理 jsp教程 介绍jsp基本原理和基础知识及与servlet的信息传递
基于Servlet框架的管理系统 _简洁版_ ;... 可继续完善增加前端、校验、其他功能等; 可作为 Servlet项目 开发练习基础模型;... 此项目简单,便于理解基本原理,为复杂的Servlet、SSH、SSM等复杂项目的开发打下基础。
基于Servlet框架的管理系统 _简洁版_ ;... 可继续完善增加前端、校验、其他功能等; 可作为 Servlet项目 开发练习基础模型;... 此项目简单,便于理解基本原理,为复杂的Servlet、SSH、SSM等复杂项目的开发打下基础。
Liferay门户通过扩展struts的基本类ActionServlet生成自己的MainServlet类,而所有的HTTP或WAP请求都要提交给这个类来处理,以保证能传递给合适的PortletAction来处理。
这个系统可以作为计算机相关专业的毕业设计或者课程设计项目,帮助学生掌握Java Web开发的基本原理和技术。该系统主要功能包括:用户注册与登录、商品浏览与搜索、购物车管理、订单处理、管理员管理等。通过这个系统...
MVC架构模式:通过阅读源代码,学习和理解MVC架构模式的基本原理和实现方法,掌握各个模块之间的交互关系。 JSP和Servlet编程:学习如何使用JSP和Servlet进行Web页面的设计和后端逻辑的处理,掌握JSP页面的动态生成...
通过研读源码,用户可以深入了解Servlet和JSP的工作原理,掌握Java Web开发的核心技术,为日后的学习和工作奠定坚实的基础。 说明文档则对系统的整体架构、功能模块、数据库设计以及关键代码进行了详细的解释和说明...
Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加...