How tomcat work连载二:简易的Servlet容器
? ? ? ?以下代码是仿照《How tomcat work》第二章:如何创建一个简易的Servlet容器,当然会是在上一篇文章http://bestchenwu.iteye.com/blog/1513984的基础上创建的。
?
? ? ? ?代码示例如下:
? ? ? ?先创建一个简易的Servlet,如下所示:
? ? ? ?package ex02.pyrmont;
?
? ? ? ?这里我引入了一个自己编写的日期操作类的静态方法,代码如下所示:
? ? ??package util;
??
? ? ? 看到与之前的HttpServer的区别没?这里的HttpServer尝试去判断uri是否是去请求一个servlet,我们假定所有的Servlet请求都是以/servlet/Servelt类名来结尾的。
? ? ? 接下来是Request、Response,这次Request改为实现ServletRequest、ServletResponse,当然很多方法我们都是仅提供默认实现或者空实现。
? ? ? Request代码如下所示:
? ? ??package ex02.pyrmont;
?? ? ? ?动态文件的处理类如下所示:
?
? ? ? ?至此,一个简易的 Servlet容器创建完毕,先启动HttpServer,然后在浏览器里输入:
? ? ? ?http://127.0.0.1:8773/servlet/ex02.pyrmont.PrimeServlet
? ? ? ?http://127.0.0.1:8773/pages/index.html
? ? ? ?看下是不是可以看到我们的响应输出
?
? ? ? ?当然这里所述的文件寻址目录都位于工程下的webRoot一级目录,所以你需要确保所有的静态文件、servlet在运行期间都会存在于该目录下,比较简单的方法就是把静态文件也放到src目录下,为它们创建一个单独的目录,比如pages
?
? ? ? ? 这个容器还有个小问题,就是我们的servlet去服务的时候,传入的参数还是Request、Response类型,这里我们可以创建一个适配所有ServletRequest 、ServletResponse的接口,让我们的servlet的服务方法传入的参数是这个适配接口,就像下面这样:
? ? ? ??import java.io.BufferedReader;
Class<Servlet> servletClass = (Class<Servlet>) loader.loadClass(servletClassName); Servlet servlet = (Servlet) servletClass.newInstance(); /** 初始化Servlet **/ servlet.init(null); /** 执行它的服务方法 **/ RequestFacade requestFacade = new RequestFacade(request); ResponseFacade responseFacade = new ResponseFacade(response); servlet.service(requestFacade, responseFacade); /** 销毁Servlet **/ servlet.destroy();?
? ? ? ? ? 再次启动HttpServer,看下修改后是否能通过。
?
?
?
?