看了这本书的头三章,写得非常好,可谓深入浅出将tomcat分析的很透彻。虽然书中所讲述的tomcat是“简化版”,但内容也不算少,越到后面代码越多,也越复杂。为了加深印象,遂决定写读书笔记,“好记性不如烂笔头”,说不定还能方便他人。
闲话少说,直入主题:
Chapter One:A Simple Web Server
第一章是一个非常简单的web server,主要目的在于让读者了解Java的web server 编程模式。此外还讲了一下Http协议的一些基础知识,譬如http请求和响应的格式。
基本的web server,就是用java.net.ServerSocket类持续的监听特定的端口,有连接过来时,则返回一个Socket对象,再对Socket对象的输入输出流进行操作。其实这也是大部分服务器的基本思路。
简单贴一些代码
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1,
InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
// Loop waiting for a request
while (!shutdown) {
Socket socket = null;
InputStream input = null;
OutputStream output = null;
try {
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();
// create Request object and parse
Request request
= new Request(input);
request.parse();
// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();
其中,Request对象的parse方法,是对输入流的字节进行解析,当然这里只做了最基本的工作,将输入流的内容一字不漏的打印出来。
的确很简单~这里的Request对象实现了Servlet规范中的Request接口,后面我们会看到,如何运用设计模式令Request更加“优雅”。
Chapter Two——A Simple Servlet Container
J2EE流行“容器Container”这一说法,所以这一章开始针对Servlet做一些工作。先说说这个“容器”的架构:
像第一章那样,我们使用一个HttpServer类监听端口,然后将得到的inputStream交给一个Request对象进行解析。然后,根据
HTTP请求行(Request
Line)的内容,判断是静态页面还是Servlet页面,再分别交给StaticResoureProcessor类或者
ServletProcessor类进行处理:
// check if this is a request for a servlet or
// a static resource
// a request for a servlet begins with "/servlet/"
if (request.getUri().startsWith("/servlet/")) {
ServletProcessor1
processor = new ServletProcessor1();
processor.process(request, response);
}
else {
StaticResoureProcessor
processor =
new StaticResourceProcessor();
processor.process(request, response);
}
StaticResoureProcessor类没什么“技术含量”,只是利用Response类,单纯地将静态页面的内容从html文件中读出来原样返回给客户端(说白了是写到Socket的输出流OutputStream中)。
而Request类在这一章实现了javax.servlet.ServletRequest接口,因此不得不实现接口中的一大堆方法。出于简化考虑,现在大部分方法还是空的,返回一个null而已。
ServletProcessor类
比较出彩的是ServletProcessor类,出彩之处在于通过类加载器从class文件中动态载入Servlet(这里的Servlet的功能只是简单打印字符串),其源代码据说是从tomcat中copy过来的
String uri = request.getUri();
String servletName = uri.substring(uri.lastIndexOf("/") + 1
URLClassLoader loader
= null;
try {
// create a URLClassLoader
URL[] urls = new URL[1];
URLStreamHandler streamHandler = null;
File classPath = new File(Constants.WEB_ROOT);
// the forming of repository is taken from the
// createClassLoader method in
// org.apache.catalina.startup.ClassLoaderFactory
String repository
=
(new URL("file", null, classPath.getCanonicalPath() +
File.separator)).toString() ;
// the code for forming the URL is taken from
// the addRepository method in
// org.apache.catalina.loader.StandardClassLoader.
urls[0] = new URL(null, repository, streamHandler);
loader = new URLClassLoader(urls);
}
需要解释一下的是,这里的repository 指的是编译好的类文件的存放路径,也算是tomcat里的一个专门术语了
最后,简单的load进来,调用Servlet的经典方法“service”,把Request和Response传进去,就算大功告成了。
myClass = loader.loadClass(servletName);
servlet = (Servlet) myClass.newInstance();
servlet.service
((ServletRequest) request, (ServletResponse) response);
Facade模式
仔细观察上面那行代码,我们将request对象向上转型为ServletRequest,交给service方法。但如果哪个Servlet的开
发者清楚tomcat的内部设计,那么他就可以在service方法中将request向下“还原为”Request对象。Request类提供了许多
tomcat内部使用的功能,譬如解析http流。如果让外人乱用一气,后果很严重。为了避免这个问题,tomcat采用了Facade
设
计模式,即通过一个RequestFacade类(实现了ServletRequest接口),替换Request类传递给service方法。而在
RequestFacade内部,保存我们的request对象,外人只能通过调用RequestFacade实现了的ServletRequest接口
的方法,间接的使用Request的“部分功能”,不能调用Request的一些内部方法,从而优雅的解决了上述问题。
public class RequestFacade implements ServletRequest {
private ServleLRequest 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();
}
至此,一个简单的Servlet容器就造出来了。
分享到:
相关推荐
How Tomcat Works中文版
How Tomcat Works【英文PDF+中文HTML+源码】 How Tomcat Works 主要是讲解Tomcat如何运行的一些核心资料。
How Tomcat Works 中文版+例程源码; 源码在src目录下
NULL 博文链接:https://asialee.iteye.com/blog/521414
How Tomcat works(PDF),不可用于商业用途,如有版权问题,请联系删除!
tomcat的基本思想,学习完可以对理解spring的基本原理有大致了解,很值得学习
HowTomcatWorks 中文版+源码.rar HowTomcatWorks 中文版+源码.rar
How Tomcat Works》这本书的读书笔记,及主要内容感想。 作为一个世界范围广泛使用的强大框架,Tomcat必然有非常多的设计思想、设计模式,让我们学习。
how tomcat works中文版 + 英文版,深入解析了tomcat的实现机制
How Tomcat Works 全书共20章!
how tomcat works 高清版 学习tomcat必备书籍 how tomcat works
HowTomcatWorks(书和源码)
How Tomcat Works Tomcat原理的书
How Tomcat Works 深入剖析Tomcat (英文版)
tomcat工作原理深入详解——HowTomcatWorks中文版.pdf
how tomcat works( 深入剖析tomcat) 的随书源码 之前找了很久,后来从官网下载下来的
How Tomcat Works 中文版+例程源码,源码在src包下面, 祝大家学习愉快
Welcome to How Tomcat Works. This book dissects Tomcat 4.1.12 and 5.0.18 and explains the internal workings of its free, open source, and most popular servlet container code-named Catalina. Tomcat is ...