动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.use itext to create a html.
.[JAVA100例]039、生成PDF文件.
.JAVA 树中 按最长路径行驶.
.一个实现排列和组合的JavaBean.
.Nokia发布SNAP,辅助J2ME网络游戏.
.用JFace和SWT构建简单的应用程序.
.Java连接数据库实例.
.javazip_0.8alpha二进制发布版(W.
.用XSLT 和 XML改进Struts.
.在Java中如何实现长时间任务.
.JDBC中的中文处理.
.软件开发成功12法则.
.Java工具包的安装配置和使用.
.彻底明白 Java 语言中的IO系统.
.实战SWT布局.
.Java 库的建立方法及其实例(下).
.Java多线程编程详解.
.使用JDBC和Hibernate来写入Blob型.
.Resin与IIS结合的一些补充技巧.
.破除java神话之二:参数是传址的.

Servlet 容器的工作原理 ( 三 )

发表日期:2008-1-5 |



  ServletProcessor1 类
    ServletProcessor1 类用来处理对 servlet 的 HTTP 请求。 它非常简单,只包含了一个 process 方法。 而这个方法接受两个参数: 一个Javax.servlet.ServletRequest 实例和一个 avax.servlet.ServletResponse实例。 process 方法也构建了一个 java.net.URLClassLoader 对象并使用它装载 servlet 类文件。 在从类装载器获得的 Class 对象上,process 方法创建一个 servlet 实例并调用它的 service 方法。
  
  process 方法
  
  Listing 2.4. ServletProcessor1 类中 process 方法
  
  public void process(Request request, Response response) {
    String uri      = request.getUri();
    String servletName  = uri.substring(uri.lastIndexOf("/") + 1);
    URLClassLoader loader = null;
  
    try {
      // create a URLClassLoader
      URLStreamHandler streamHandler = null;
  
      URL[] urls    = new URL[1];
      File classPath  = new File(Constants.WEB_ROOT);
      String repository = (new URL("file", null,
        classPath.getCanonicalPath() + File.separator)).toString() ;
      urls[0]      = new URL(null, repository, streamHandler);
      loader      = new URLClassLoader(urls);
    }
    catch (IOException e) {
      System.out.println(e.toString());
    }
  
    Class myClass = null;
  
    try {
      myClass = loader.loadClass(servletName);
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
  
    Servlet servlet = null;
    try {
      servlet = (Servlet) myClass.newInstance();
      servlet.service((ServletRequest) request, (ServletResponse) response);
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
    catch (Throwable e) {
      System.out.println(e.toString());
    }
  }
  
  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,则要使用 java.net.URLClassLoader 类,它是java.lang.ClassLoader 的间接子类。 一旦有了 URLClassLoader 类的实例,就可以使用 loadClass 方法来装载一个 servlet 类。 实例化 URLClassLoader 是很简单的。 该类有三个构建器,最简单的是:
  
  public URLClassLoader(URL[] urls);
  urls 是一组指向其位置 java.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 方法的部分代码:
  
  // create a URLClassLoader
  URLStreamHandler streamHandler = null;
  
  URL[] urls    = new URL[1];
  File classPath  = new File(Constants.WEB_ROOT);
  String repository = (new URL("file", null,
    classPath.getCanonicalPath() + File.separator)).toString() ;
  urls[0]      = new URL(null, repository, streamHandler);
  loader      = new URLClassLoader(urls);
  
  创建储存库 (repository)的代码摘自org.apache.catalina.startup.ClassLoaderFactory内的createClassLoader 方法,而创建 URL 的代码摘自org.apache.catalina.loader.StandardClassLoader 类内的 addRepository 方法。 但在此阶段您还没有必要去关心这些类。
  
  有了类装载器,您可以使用 loadClass 方法装载 servlet 类:
  
  Class myClass = null;
  try {
    myClass = loader.loadClass(servletName);
  }
  catch (ClassNotFoundException e) {
    System.out.println(e.toString());
  }
  然后,process方法创建已装载的 servlet类的实例,传递给 javax.servlet.Servlet ,并激活 servlet 的 service 方法:
  
  Servlet servlet = null;
  try {
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) request, (ServletResponse) response);
  }
  catch (Exception e) {
    System.out.println(e.toString());
  }
  catch (Throwable e) {
    System.out.println(e.toString());
  }
  
  编译并运行该应用程序
  假如要编译该应用程序,在工作目录下键入以下命令:
  
  javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java
  假如要在 windows 下运行该应用程序,在工作目录下键入以下命令:
  
  java -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer1
  在 Linux 环境下,使用冒号来隔开类库:
  
  java -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),因为只有第一行字符送入到浏览器。[i] Tomcat 运行工作原理[/i] 随后的章节会告诉您怎样来解决这个问题。
上一篇:Servlet 容器的工作原理 ( 一 ) 人气:426
下一篇:编写 Servlet 2.3 Filter (一) 人气:539
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号