JR 精品文章 - Servlet容器工作原理讲解(4)
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » JSP/Servlet/JSF 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
Servlet容器工作原理讲解(4)
kevin_yu 原创   更新:2006-12-04 11:35:32  版本: 1.0   

Servlet容器工作原理讲解(4)

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 的背景信息。 

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     14       1
作者其它文章: 作者全部文章
评论人:mrou2001 发表时间: Wed Dec 06 21:52:00 CST 2006
不错的文章[java]
评论人:wwty 发表时间: Mon Dec 11 08:18:13 CST 2006
文章确实不错[java]
评论人:vampire_315 发表时间: Sun Dec 17 18:53:29 CST 2006
不错啊
评论人:vampire_315 发表时间: Sun Dec 17 20:28:35 CST 2006
好啊
评论人:fennsky 发表时间: Wed Apr 04 18:37:21 CST 2007
看的不是很明白啊
评论人:yibotian 发表时间: Sun May 06 21:38:33 CST 2007
[good]

这个文章共有 6 条评论
主题: Servlet、Jsp性能优化 上一篇文章
返回文章列表 返回〔JSP/Servlet/JSF〕
下一篇文章 主题: 目录树  代码


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号