《深入剖析Tomcat》一2.3 应用程序2

2.3 应用程序2

应用程序1中有一个严重的问题。在ServletProcessor1类的process()方法中,必须将ex02.pyrmont.Request的实例向上转型为javax.servlet.ServletRequest实例,将ex02.pyrmont.Response实例向上转型为javax.servlet.ServletResponse实例,然后将它们作为参数传递给servlet的service()方法:

这是不安全的做法,了解这个servlet容器内部工作原理的servlet程序员可以将ServletRequest实例和ServletResponse实例分别向下转型为ex02.pyrmont.Request实例和ex02.pyrmont.Response实例,就可以调用它们各自的公共方法了。有了Request实例后,就可以调用其parse()方法;而有了Response实例后,就可以调用其sendStaticResource()方法。
不能将parse()方法和sendStaticResource()方法设置为私有方法,因为它们会被其他的类调用,但是这两个方法在servlet中不应该是可用的,所以这个方法不好。一种解决方法是将Request类和Response类都设为默认的访问修饰符,这样就不能从ex02.pyrmont包外对它们进行访问了。但是,这里有一个更完美的方法:使用外观类。UML 关系图如图2-2所示。

在第2个应用程序中,添加了两个外观类:RequestFacade和ResponseFacade。RequestFacade类实现servletRequest接口,在其构造函数中需要把它指定的一个Reuqest对象传递给ServletRequest对象引用。ServletRequest接口中每个方法的实现都会调用Request对象的相应方法。但是,ServletRequest对象本身是私有的,无法从类的外部进行访问。相比于将Request对象向上转型为ServletRequest对象,并将其传给service()方法,这里会创建一个RequestFacade对象,再将其传递给service()方法。servlet程序员仍然可以将servletRequest实例向下转型为RequestFacade对象,但它们只能访问ServletRequest接口中提供的方法。现在parse()方法和getUri()方法是安全的了。
代码清单2-7给出了RequestFacade类的定义。

注意RequestFacade类的构造函数,它接受一个Request对象,但立即将其赋给私有的servletRequest对象引用。还要注意的是,RequestFacade中的每个方法会调用servletRequest对象中相对应的方法来执行。
ResponseFacade类的情况与此相同。
应用程序2中共需要使用6个类:
HttpServer2
Request
Response
StaticResourceProcessor
servletProcessor2
Constants
HttpServer2类与HttpServer1类相似,只是在其await()方法中它会使用servletProcessor2类,而不是servletProcessor1类:

servletProcessor2类与servletProcessor1类相似,只是在其process()方法的以下部分中有些许不同:

运行应用程序
要在Windows平台上运行该程序,可以在工作目录下执行如下命令:

java -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer2

在Linux平台上,需要用冒号分割两个库文件:

java -classpath ./lib/servlet.jar:./ ex02.pyrmont.HttpServer2

可以使用与应用程序1相同的URL来测试,结果是相同的。

时间: 2024-10-01 06:38:25

《深入剖析Tomcat》一2.3 应用程序2的相关文章

在docker中部署tomcat并且部署java应用程序的步骤详解_docker

先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创建Dockerfile,命令如:touch Docker

《深入剖析Tomcat》一3.1 StringManager类

3.1 StringManager类 像Tomcat这样的大型应用程序必须小心仔细地处理错误消息.在Tomcat中,错误消息对系统管理员和servlet程序员来说都是很有用的.例如,系统管理员可以很容易地根据Tomcat的错误日志消息定位到发生异常的位置.而对于servlet程序员来说,在抛出的每个javax.servlet.servletException异常中,Tomcat都会发送一条特殊的错误消息,这样,程序员就可以知道servlet程序到底哪里出错了.Tomcat处理错误消息的方法是将错

《深入剖析Tomcat》一3.2 应用程序

3.2 应用程序 从本章开始,每章的应用程序都会按照模块进行划分.本章的应用程序包含3个模块:连接器模块.启动模块和核心模块. 启动模块只有一个类(Bootstrap),后者负责启动应用程序.连接器模块中的类可分为以下5个类型: 连接器及其支持类(HttpConnector和HttpProcessor): 表示HTTP请求的类(HttpRequest)及其支持类: 表示HTTP响应的类(HttpResponse)及其支持类: 外观类(HttpRequestFacade和HttpResponseF

《深入剖析Tomcat》一2.2 应用程序 1

2.2 应用程序 1 下面从servlet容器的角度审视servlet程序的开发.简单来说,对一个Servlet的每个HTTP请求,一个功能齐全的servlet容器有以下几件事要做: 当第一次调用某个servlet时,要载入该servlet类,并调用其init()方法(仅此一次): 针对每个request请求,创建一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例: 调用该servlet的service()方法,将

《深入剖析Tomcat》一1.3 应用程序

1.3 应用程序 本章的Web服务器应用程序位于ex01.pyrmont包下,包括三个类: HttpServer Request Response 应用程序的入口点(静态main()方法)在HttpServer类中.main()方法创建一个HttpServer实例,然后,调用其await()方法.顾名思义,await()方法会在指定端口上等待HTTP请求,对其进行处理,然后发送响应信息回客户端.在接收到关闭命令前,它会保持等待状态. 该应用程序仅发送位于指定目录的静态资源的请求,如HTML文件和

《深入剖析Tomcat》一导读

前 言 欢迎阅读本书.本书剖析了Tomcat 4.1.12版本和Tomcat 5.0.18版本的基本结构,并解释了其servlet容器Catalina的内部工作原理.Catalina是开源.免费的,也是最受欢迎的servlet容器之一.Tomcat本身是一个复杂的系统,包含了许多不同的组件.若你想学习Tomcat的工作方式,应该从了解这些组件开始.本书描述Tomcat的总体结构,并针对每个组件建立一个简单的版本,使你更好地理解组件的工作机制,之后对真实组件进行描述."本书结构"一节会对

《深入剖析Tomcat》一第 3 章 连 接 器

第 3 章 连 接 器 正如前言所述,Catalina中有两个主要的模块,连接器(connector)和容器(container).在本章中,将会建立一个连接器来增强第2章中的应用程序的功能,用一种更好的方法来创建request对和response对象.兼容Servlet 2.3和2.4规范的连接器必须要负责创建javax.servlet.http.HttpServletRequest对象和javax.servlet.http.HttpServletResponse的实例,并将它们作为servl

tomcat第二次访问LambdaProbe程序提示权限不够

问题描述 我无奈了.每次部署probe以后,即刻访问probe,可以进去.重新启动tomcat,再次从manager里连到probe,提示权限不够,让我修改probe.xml的privileged为true,但privileged就是true阿如果把probe卸载了,重新部署一次,就又能进去了.但重启tomcat,就又进不去了,说权限不够.我在tomcat5,tomcat6上都遇到这个问题.按照probe官网所说(如下),给tomcat多配置了四个权限,问题依然存在.Lambda Probe r

深入剖析tomcat之一个简单的web服务器

这个简单的web服务器包含三个类 HttpServer Request Response 在应用程序的入口点,也就是静态main函数中,创建一个HttpServer实例,然后调用其await()方法.顾名思义,await方法会在制定的端口上等待http请求,并对其进行处理,然后发送相应的消息回客户端.在接收到命令之前,它会一直保持等待的状态. HttpServer类 package simpleHttpServer; import java.io.File; import java.io.IOE