标签:
我们回顾一下,第一章实现的Web服务器类图大致如下:
其中HttpServer中的await()方法会使用一个ServerSocket来监听8080端口,用来接收客户端的请求。当接收到用户请求后会创建一个Socket对象,通过与Socket关联的InputStream来创建并填充一个Request对象(这里只是简单的填充了Uri)。然后用Socket关联的OutputStream创建一个Response对象,并持有一个Request对象。最后通过调用Response对象中的sendStaticResource()方法来向客户端发送静态页面(其中根据request.getUri()来决定返回哪个页面)。
而第二章实现的Web服务器有什么改进的地方?
首先摒弃了第一章中自定义的Response和Request类,而是根据Servlet标准提供的接口来定义类。Servlet 编程是通过 javax.servlet 和 javax.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();
}
其中init、service和destory是Servlet的生命周期方法。init只会在Servlet实例化完成后被调用一次,service会在每次请求该Servlet时被调用,而destory会在该Servlet卸载时被调用,这通常发生在Servlet容器正在被关闭或者Servlet容器需要一些空闲内存的时候。
在第二章中实现的Web服务器将会以Servlet容器的角度来编程。总的来说,一个全功能的Servlet容器会为servlet的每个HTTP请求做下面一些工作:
Servlet的时候,加载该Servlet类并调用Servlet的init方法(仅一次)javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例servlet的service方法,并传入ServletRequest和ServletReponse实例servlet容器被关闭时,调用servlet的destory方法并卸载servlet类那么如何加载Servlet类呢,我们可以用
Class.forName(xxx)
来加载一个类。也可以用java.net.URLClassLoader类,它是java.lang.ClassLoader类的一个直接子类。拥有一个URLClassLoader实例,那么就可以直接使用它的loadClass方法去加载Servlet类了。这里我们就直接用URLClassLoader最简单的构造函数:URLClassLoader(URL[] urls),这里的URL数组就指定了类所在的目录位置(通常叫repository)。不过由于双亲加载机制,如果在classpath下已经存在某个类,就加载不到repository中的对应类了。
刚才说了这里会摒弃第一章的Request和Response类。而新的Request和Response类分别实现了 javax.servlet.ServletRequest接口和javax.servlet.ServletResponse接口,只不过在目前很多方法都留空了。第二章的类图大致如下:
HttpServer依旧监听8080端口等待客户端连接,根据请求内容创建并填充Request对象,并创建Response对象。Request和Response类中的大多数方法都是留空的。然后会根据请求内容来判断是创建ServletProcessor实例还是创建StaticResourceProcessor实例,对了,这里的话我个人觉得在两个Processor之上再创建一个Processor接口并让它们实现这个接口更加好一些。如果是StaticResourceProcessor,那么直接返回请求的静态内容。而如果是ServletProcessor,那么则去加载请求的Servlet类,然后调用Servlet的doService方法来进行处理并响应给客户端。
标签:
原文地址:http://blog.csdn.net/u012345283/article/details/44789179