`

How Tomcat Works 读书笔记(第二章)

阅读更多
第二章就实现了一个很简单的servletContainer,不但能出来静态资源,还能处理简单的servlet, 首先我们先看一下类图:
       其实很简单,比前一个没有什么多的增加,前面的HttpServer,这个类也是拦截请求,不过做了一下判断,如果是以/servlet/开头的,就动态的加载这个servlet,并调用它的service方法,这里并没有完全按照servlet的生命周期去处理,只是说明了一下而已,估计以后会有这方面的实现吧。在后面稍微提到了Facade设计模式。
       那个PrimitiveServlet实现了Servlet接口,它的service接口会接受一个ServletRequest和ServletResponse对象,所以在代码中会将我们的Request和Response向上转换成ServletRequest和ServletResponse传入,但是有个问题,如果我们知道容器内部是这么实现的,那在service方法里面就可以再给它强制转换过来,那么我们就可以调用Request和Response里面的公有方法了。那么我们可以讲这个接口的访问权限可以变换一下,但是只是治标不治本的办法,估计以后还会变的。反思一下问题主要是只提供给我们内部使用,对外部系统不进行暴露相应的接口,设计模式里面Facade模式很好的解决了这个问题。
      就是我们在实现一个RequestFacade和ResponseFacade类,这个类的构造方法会接受一个Reqeust和Response,我们只向外暴露ServletRequest和ServletResponse的方法,同样在这个问题里面,程序员也可以将其转化成RequestFacade和ResponseFacade对象,但是它向外暴露的接口是和ServletRequest和ServletResponse是一样的,所以这样就很好了。
package ex02.pyrmont;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class HttpServer1 {
	public static void main(String[] args) {
		HttpServer1 httpServer = new HttpServer1();
		httpServer.await();
	}
	
	public void await(){
		int port = 8080;
		ServerSocket serverSocket = null;
		
		try {
			serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
		} catch (UnknownHostException e) {
			e.printStackTrace();
			System.exit(1);
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
		
		Socket socket = null;
		InputStream input = null;
		OutputStream out = null;
		
		try {
			socket = serverSocket.accept();
			input = socket.getInputStream();
			out = socket.getOutputStream();
			Request request = new Request(input);
			request.parse();
			
			Response response = new Response(out);
			String uri = request.getUri();
			if(uri.startsWith("/servlet/")){
				ServletProcessor servletProcessor = new ServletProcessor();
				servletProcessor.process(request, response);
			} else {
				StaticResourceProcessor staticProcessor = new StaticResourceProcessor();
				staticProcessor.process(request, response);
			}
			
			input.close();
			out.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}


下面是处理servlet的方法。
package ex02.pyrmont;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandler;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletProcessor {
	public void process(Request request,Response response){
		String uri = request.getUri();
		int lastSlash = uri.lastIndexOf("/");
		String servletName = uri.substring(lastSlash + 1);

		URLClassLoader loader = null;
		try {
			URL[] urls = new URL[1];
			URLStreamHandler streamHandler = null;
			File classpath = new File(Contants.WEB_ROOT);
			String repository = new URL("file",null,classpath.getCanonicalPath() + File.separator + servletName).toString();
			
			urls[0] = new URL(null,repository,streamHandler);
			loader = new URLClassLoader(urls);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		Class clazz =  null;
		try {
			clazz = loader.loadClass(servletName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Servlet servlet = null;
		
		try {
			servlet = (Servlet)clazz.newInstance();
			servlet.service((ServletRequest)request, (ServletResponse)response);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


  • 大小: 8.9 KB
分享到:
评论

相关推荐

    How Tomcat Works 读书笔记(第三章)

    《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心组件。以下是对这部分内容的详细解读: Tomcat作为一款开源的Java Servlet容器,其核心功能是解析...

    java版五子棋源码-HowTomcatWorks:HowTomcatWorks读书笔记

    java版五子棋源码HowTomcatWorks 《How Tomcat Works》 every chapter demo . Here's my ebook: Part of the UML diagram is as follows. 1.The default connector class diagram: 2.The class diagram of ...

    学习tomcat源码+英文《How Tomcat Work》和每一章的相关项目+tomcat6源码依赖jar

    《How Tomcat Works》是一本经典的书籍,详细解释了Tomcat的工作原理,对于理解其内部机制非常有帮助。 Tomcat的核心功能可以分为几个主要部分: 1. **Catalina**:这是Tomcat的主要组件,负责Servlet和JSP的处理...

    How-Tomcat-Works-中文版笔记

    《How Tomcat Works》中文版笔记详细介绍了Apache Tomcat的内部架构和运行机制,Tomcat是一个广泛使用的Java开源Web服务器和Servlet容器,它为处理基于Java的Web应用提供平台。本书不仅深入分析了Tomcat的核心组件和...

    HowTomcatWorks:《深度剖析Tomcat》原始码及笔记

    第十二章StandardContext 第十三章主机和引擎 第十四章服务器组件和服务组件 第十五章消化器库 第十六章关闭钩子 第十七章启动Tomcat 第十八章部署器 第十九章Manager应用程序的servlet类 第二十章基于JMX的管理

    Tomcat源码研究.pdf

    #### 1.11《How Tomcat Works》读书笔记(二): Connector - **Connector 介绍**:Connector组件是Tomcat的重要组成部分,负责接收来自客户端的网络请求并将它们转换为内部请求对象。 - **协议支持**:Connector...

    tomcat源码分析

    8. **《How Tomcat Works》读书笔记** 这一系列笔记详细介绍了Tomcat的工作原理,包括Connector如何处理网络连接,Container如何管理Servlet,以及默认的Connector和容器配置。通过阅读这些笔记,可以深入理解...

    Tomcat_学习

    《How Tomcat Works》这本书是理解Tomcat工作原理的重要参考资料。书中详细介绍了Tomcat如何处理HTTP请求,如何加载和执行Servlet,以及它是如何管理线程和内存的。通过阅读这本书,你可以深入理解Tomcat的内部架构...

    SomeJava:将以往项目应用中各种框架、中间件的使用方式抽取出来,希望以后给刚接触直接运行,入门参考。。

    tomcat-work 是《How Tomcat Works》的代码,可惜是Jdk1.4的,也可以作为学习用。 ###分布式小框架Demo gh-soa 作为服务端 gh-soa-remote gh-web 作为客户端,通过hessian访问soa。 帮别人弄的一个框架Demo、基于...

    WebGoat笔记三_访问控制缺陷(AccessControlFlaws).pdf

    2.2.1.2 技术原理(How It works) 无 2.2.1.3 总体目标(General Goals) 每个用户都是角色的成员,每个角色只允许访问那些特定的资源。你的目标是浏览本站管理所使用的访问控制规则。 2.2.1.4 操作方法...

    java8源码-cainiao:自娱自乐

    Books中存放分布式技术学习和书籍阅读后笔记、总结和一些面试搜集的问题,具体查看Books中ReadMe.md Internet中存放分布式技术等相关的学习总结 JUC中存放系列学习内容,包括系列学习总结+优秀博文搜集等 Collection...

Global site tag (gtag.js) - Google Analytics