码迷,mamicode.com
首页 > 其他好文 > 详细

How Tomcat Works读书笔记2

时间:2015-04-17 01:15:34      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

我们回顾一下,第一章实现的Web服务器类图大致如下:
技术分享

其中HttpServer中的await()方法会使用一个ServerSocket来监听8080端口,用来接收客户端的请求。当接收到用户请求后会创建一个Socket对象,通过与Socket关联的InputStream来创建并填充一个Request对象(这里只是简单的填充了Uri)。然后用Socket关联的OutputStream创建一个Response对象,并持有一个Request对象。最后通过调用Response对象中的sendStaticResource()方法来向客户端发送静态页面(其中根据request.getUri()来决定返回哪个页面)。

而第二章实现的Web服务器有什么改进的地方?
首先摒弃了第一章中自定义的ResponseRequest类,而是根据Servlet标准提供的接口来定义类。Servlet 编程是通过 javax.servletjavax.servlet.http 这两个包的类和接口来实现的。其中一个至关重要的就是javax.servlet.Servlet 接口了。所有的 servlet 必须实现实现或者继承实现该接口的类。Servlet接口有五个方法:


public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

其中initservicedestoryServlet的生命周期方法。init只会在Servlet实例化完成后被调用一次,service会在每次请求该Servlet时被调用,而destory会在该Servlet卸载时被调用,这通常发生在Servlet容器正在被关闭或者Servlet容器需要一些空闲内存的时候。

在第二章中实现的Web服务器将会以Servlet容器的角度来编程。总的来说,一个全功能的Servlet容器会为servlet的每个HTTP请求做下面一些工作:

  • 当第一次调用Servlet的时候,加载该Servlet类并调用Servletinit方法(仅一次)
  • 对每次请求,构造一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例
  • 调用servletservice方法,并传入ServletRequestServletReponse实例
  • servlet容器被关闭时,调用servletdestory方法并卸载servlet

那么如何加载Servlet类呢,我们可以用

Class.forName(xxx)

来加载一个类。也可以用java.net.URLClassLoader类,它是java.lang.ClassLoader类的一个直接子类。拥有一个URLClassLoader实例,那么就可以直接使用它的loadClass方法去加载Servlet类了。这里我们就直接用URLClassLoader最简单的构造函数:URLClassLoader(URL[] urls),这里的URL数组就指定了类所在的目录位置(通常叫repository)。不过由于双亲加载机制,如果在classpath下已经存在某个类,就加载不到repository中的对应类了。

刚才说了这里会摒弃第一章的RequestResponse类。而新的RequestResponse类分别实现了 javax.servlet.ServletRequest接口和javax.servlet.ServletResponse接口,只不过在目前很多方法都留空了。第二章的类图大致如下:
技术分享

HttpServer依旧监听8080端口等待客户端连接,根据请求内容创建并填充Request对象,并创建Response对象。RequestResponse类中的大多数方法都是留空的。然后会根据请求内容来判断是创建ServletProcessor实例还是创建StaticResourceProcessor实例,对了,这里的话我个人觉得在两个Processor之上再创建一个Processor接口并让它们实现这个接口更加好一些。如果是StaticResourceProcessor,那么直接返回请求的静态内容。而如果是ServletProcessor,那么则去加载请求的Servlet类,然后调用ServletdoService方法来进行处理并响应给客户端。

How Tomcat Works读书笔记2

标签:

原文地址:http://blog.csdn.net/u012345283/article/details/44789179

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!