第二章就实现了一个很简单的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》这本书是理解Apache Tomcat服务器工作原理的重要资源,第三章主要探讨了Tomcat的架构和核心组件。以下是对这部分内容的详细解读: Tomcat作为一款开源的Java Servlet容器,其核心功能是解析...
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 ...
《How Tomcat Works》是一本经典的书籍,详细解释了Tomcat的工作原理,对于理解其内部机制非常有帮助。 Tomcat的核心功能可以分为几个主要部分: 1. **Catalina**:这是Tomcat的主要组件,负责Servlet和JSP的处理...
《How Tomcat Works》中文版笔记详细介绍了Apache Tomcat的内部架构和运行机制,Tomcat是一个广泛使用的Java开源Web服务器和Servlet容器,它为处理基于Java的Web应用提供平台。本书不仅深入分析了Tomcat的核心组件和...
第十二章StandardContext 第十三章主机和引擎 第十四章服务器组件和服务组件 第十五章消化器库 第十六章关闭钩子 第十七章启动Tomcat 第十八章部署器 第十九章Manager应用程序的servlet类 第二十章基于JMX的管理
#### 1.11《How Tomcat Works》读书笔记(二): Connector - **Connector 介绍**:Connector组件是Tomcat的重要组成部分,负责接收来自客户端的网络请求并将它们转换为内部请求对象。 - **协议支持**:Connector...
8. **《How Tomcat Works》读书笔记** 这一系列笔记详细介绍了Tomcat的工作原理,包括Connector如何处理网络连接,Container如何管理Servlet,以及默认的Connector和容器配置。通过阅读这些笔记,可以深入理解...
《How Tomcat Works》这本书是理解Tomcat工作原理的重要参考资料。书中详细介绍了Tomcat如何处理HTTP请求,如何加载和执行Servlet,以及它是如何管理线程和内存的。通过阅读这本书,你可以深入理解Tomcat的内部架构...
tomcat-work 是《How Tomcat Works》的代码,可惜是Jdk1.4的,也可以作为学习用。 ###分布式小框架Demo gh-soa 作为服务端 gh-soa-remote gh-web 作为客户端,通过hessian访问soa。 帮别人弄的一个框架Demo、基于...
2.2.1.2 技术原理(How It works) 无 2.2.1.3 总体目标(General Goals) 每个用户都是角色的成员,每个角色只允许访问那些特定的资源。你的目标是浏览本站管理所使用的访问控制规则。 2.2.1.4 操作方法...
Books中存放分布式技术学习和书籍阅读后笔记、总结和一些面试搜集的问题,具体查看Books中ReadMe.md Internet中存放分布式技术等相关的学习总结 JUC中存放系列学习内容,包括系列学习总结+优秀博文搜集等 Collection...