分享
 
 
 

Servlet容器工作原理(四)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要:本文讨论了简单的能够用于服务静态资源,以及处理如 PrimitiveServlet 一样简单的 servlet 的 servlet 容器。 同时也提供 Javax.servlet.Servlet 的背景信息。

此为系列文章的第四篇,也是最后一篇。

Application 2

第一个应用程序里存在一个值得注意的问题。 在ServletProcessor1 类的 process 方法里,上溯 (upcast)ex02.pyrmont.Request 实例到 javax.servlet.ServletRequest,将其作为第一个参数传递给 servlet 的 service 方法。 另上溯(upcast) ex02.pyrmont.Response 实例到 javax.servlet.ServletResponse ,并将其作为第二个参数传递给 servlet 的 service 方法。

try {

servlet = (Servlet) myClass.newInstance();

servlet.service((ServletRequest) request, (ServletResponse) response);

}

这样会使安全性能大打折扣。 知道 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 类

package ex02.pyrmont;

public class RequestFacade implements ServletRequest {

private ServletRequest request = null;

public RequestFacade(Request request) {

this.request = request;

}

/* implementation of the ServletRequest*/

public Object getAttribute(String attribute) {

return request.getAttribute(attribute);

}

public Enumeration getAttributeNames() {

return request.getAttributeNames();

}

...

} 注意 RequestFacade 构造函数。 它会接受一个 Request 对象,即刻分配给私有的 servletRequest 对象引用。 还要注意,RequestFacade 内的每个方法调用 ServletRequest 对象内相应的方法。

ResponseFacade 类也是如此。

以下是 application 2 所包含的类

HttpServer2

Request

Response

StaticResourceProcessor

ServletProcessor2

Constants

HttpServer2 类类似于 HttpServer1,只是它在 await 方法内使用了 ServletProcessor2 而不是ServletProcessor1。

if (request.getUri().startsWith("/servlet/")) {

ServletProcessor2 processor = new ServletProcessor2();

processor.process(request, response);

}

else {

...

}

ServletProcessor2 类也类似于 ServletProcessor1,只是在以下 process 方法的部分代码有点不同:

Servlet servlet = null;

RequestFacade requestFacade = new RequestFacade(request);

ResponseFacade responseFacade = new ResponseFacade(response);

try {

servlet = (Servlet) myClass.newInstance();

servlet.service((ServletRequest) requestFacade,

(ServletResponse) responseFacade);

}

编译并运行该应用程序

如果要编译该应用程序,在工作目录下键入以下命令:

javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java

如果要在 windows 下运行该应用程序,在工作目录下键入以下命令:

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

在 Linux 环境下,使用分号来隔开类库:

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

您可以使用和 application 1 相同的 URL 以收到同样的结果。

总结

本文讨论了简单的能够用于服务静态资源,以及处理如 PrimitiveServlet 一样简单的 servlet 的 servlet 容器。 同时也提供 javax.servlet.Servlet 的背景信息。

关于翻译作者:

petrel ,java 爱好者,在深圳从事 java 和数据库的开发工作,喜爱各项运动!可以通过petrel.zhang@ccjk.com 与她联系.也可以点击http://www.matrix.org.cn/user_view.ASP?username=petrel查看她的信息.

进入讨论组讨论。

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有