实现一个简单的Tomcat

1. Tomcat作用

我们的web应用会运行在Tomcat中,那么显然请求必定是先到达Tomcat的,Tomcat对于请求实际上会进行如下的处理:

  • 提供Socket服务:Tomcat的启动,必然是Socket服务,支持http协议。
  • 进行请求的分发:一个Tomcat可以为多个web应用提供服务,那么就需要把url下发到不同的web应用。
  • 需要将请求和响应封装成request和response:我们在写后端代码的时候都是直接使用request和response的,这是因为Tomcat已经做好了。

下面我们就自己来实现这三步。

2. 实现代码

项目结构:

  src└─mytomcatBookServlet.javaCarServlet.javaMyRequest.javaMyResponse.javaMyServlet.javaMyTomcat.javaServletMapping.javaServletMappingConfig.java

2.1 封装http请求和响应

package mytomcat;import java.io.IOException;
import java.io.InputStream;/*** 封装http请求*/
public class MyRequest {private String url;private String method;public MyRequest(InputStream inputStream) throws IOException {String httpRequest = "";byte[] httpRequestBytes = new byte[1024];int length = 0;if((length = inputStream.read(httpRequestBytes)) > 0) {httpRequest = new String(httpRequestBytes, 0, length);}String httpHead = httpRequest.split("\n")[0];url = httpHead.split("\\s")[1];method = httpHead.split("\\s")[0];System.out.println(this.toString());}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}@Overridepublic String toString() {return "MyRequest -- url:" + url + ",method:" + method;}}
package mytomcat;import java.io.IOException;
import java.io.OutputStream;/*** 封装http响应*/
public class MyResponse {private OutputStream outputStream;public MyResponse (OutputStream outputStream) {this.outputStream = outputStream;}public void write(String content) throws IOException {StringBuffer httpResponse = new StringBuffer();httpResponse.append("HTTP/1.1 200 OK\n").append("Content-Type: text/html\n").append("\r\n").append(content);outputStream.write(httpResponse.toString().getBytes());outputStream.close();}}

2.2 实现不同的Servlet

package mytomcat;
/*** Servlet抽象类*/
public abstract class MyServlet {public abstract void doGet(MyRequest myRequest, MyResponse myResponse);public abstract void doPost(MyRequest myRequest, MyResponse myResponse);public void service(MyRequest myRequest, MyResponse myResponse) {if(myRequest.getMethod().equalsIgnoreCase("POST")) {doPost(myRequest, myResponse);}else if(myRequest.getMethod().equalsIgnoreCase("GET")) {doGet(myRequest, myResponse);}}
}
package mytomcat;import java.io.IOException;/*** 处理操作'书'的http请求*/
public class BookServlet extends MyServlet {@Overridepublic void doGet(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[get] book...");}catch(IOException e) {e.printStackTrace();}}@Overridepublic void doPost(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[post] book...");}catch(IOException e) {e.printStackTrace();}}}
package mytomcat;import java.io.IOException;/*** 处理操作'车'的http请求*/
public class CarServlet extends MyServlet {@Overridepublic void doGet(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[get] car...");}catch(IOException e) {e.printStackTrace();}}@Overridepublic void doPost(MyRequest myRequest, MyResponse myResponse) {try {myResponse.write("[post] car...");}catch(IOException e) {e.printStackTrace();}}}

2.3 定义Servlet映射POJO类

package mytomcat;public class ServletMapping {private String servletName;private String url;private String className;public ServletMapping(String servletName, String url, String className) {super();this.servletName = servletName;this.url = url;this.className = className;}public String getServletName() {return servletName;}public void setServletName(String servletName) {this.servletName = servletName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}}

2.4 配置Servlet映射关系

package mytomcat;import java.util.ArrayList;
import java.util.List;/*** 配置请求url和处理的servlet的对应关系*/
public class ServletMappingConfig {public static List<ServletMapping> servletMappingList = new ArrayList<>();;static {servletMappingList.add(new ServletMapping("Book", "/book", "mytomcat.BookServlet"));servletMappingList.add(new ServletMapping("Car", "/car", "mytomcat.CarServlet"));}}

2.5 主类

package mytomcat;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;public class MyTomcat {private int port;//保存请求url和处理请求servlet的对应关系private Map<String, String> urlServletMap = new HashMap<String, String>();public MyTomcat(int port) {this.port = port;}public void start() {initServletMapping();ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(port);System.out.println("MyTomcat is start...\n监听端口:" + port);while(true) {System.out.println("等待请求...");Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();MyRequest myRequest = new MyRequest(inputStream);MyResponse myResponse = new MyResponse(outputStream);//请求分发disPatch(myRequest, myResponse);socket.close();}}catch(IOException e) {e.printStackTrace();}finally {if(serverSocket != null) {try {serverSocket.close();}catch(IOException e) {e.printStackTrace();}}}}//初始化url和处理的servlet的对应关系private void initServletMapping() {for(ServletMapping servletMapping: ServletMappingConfig.servletMappingList) {urlServletMap.put(servletMapping.getUrl(), servletMapping.getClassName());}}//分发处理请求private void disPatch(MyRequest myRequest, MyResponse myResponse) {String className = urlServletMap.get(myRequest.getUrl());//反射try {Class<MyServlet> myServletClass = (Class<MyServlet>) Class.forName(className);MyServlet myServlet = myServletClass.newInstance();myServlet.service(myRequest, myResponse);}catch(Exception e) {e.printStackTrace();}}public static void main(String[] args) {MyTomcat myTomcat = new MyTomcat(8080);myTomcat.start();}
}

3. 测试

运行MyTomcat主类,然后在浏览器输入http://localhost:8080/car,可以看到返回[get] car...,大功告成。

源码地址:

https://github.com/WangJun-SCU/mytomcat

转载于:https://www.cnblogs.com/scuwangjun/p/9917518.html

实现一个简单的Tomcat 1相关推荐

  1. 实现一个简单的Tomcat

    实现一个简单的Tomcat 1. Tomcat作用 我们的web应用会运行在Tomcat中,那么显然请求必定是先到达Tomcat的,Tomcat对于请求实际上会进行如下的处理: 提供Socket服务: ...

  2. 【Tomcat】——纯手写实现一个简单的Tomcat

    前言 心血来潮,记得上大学时老师曾经简单讲过Tomcat底层的实现原理,并给我们演示过简单的实现,趁着刚毕业还没有全部忘记,回温一下记录在这里,在这里纯底层实现一个简单可以访问静态文件以及动态请求的T ...

  3. 一个简单的静态web服务器实现

    看完tomcat原理后,想自己用java仿一个简单的tomcat,先实现一个静态的web服务器.需要的技术有java网络编程(tcp/ip协议.http协议.socket等基础知识) 源码下载链接ht ...

  4. tomcat(2)一个简单的servlet容器

    [0]README 0.1)本文部分文字转自 "深入剖析Tomcat",旨在学习  一个简单的servlet容器  的基础知识: 0.2)for complete source c ...

  5. tomcat(1)一个简单的web server

    [0]README 0.1)本文部分描述转自"深入剖析tomcat", 旨在学习  一个简单的web server  的基础知识: 0.2)for complete source ...

  6. tomcat原理解析(一):一个简单的实现

    一 概述 前段时间去面试,被人问到了tomcat实现原理.由于平时没怎么关注容器的实现细节,这个问题基本没回答上来.所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP ...

  7. eclipse maven项目 class类部署不到tomcat下_Springboot介绍以及用Eclipse搭建一个简单的Springboot项目教程

    简述 本文主要介绍Springboot以及用Eclipse搭建一个简单的Springboot项目. Springboot简介 Springboot是由Pivotal团队提供的全新框架,其设计目的是用来 ...

  8. IDEA 开发一个简单的 web service 项目,并打包部署到 Tomcat

    文章目录 实现的效果 一.创建 web service 项目 二.测试类运行 web service 服务端 三.IDEA 打包 web service 项目 四.web service 项目部署到 ...

  9. 一个简单可参考的API网关架构设计

    http://www.infoq.com/cn/articles/api-gateway-architecture-design 网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由 ...

  10. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子

    我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...

最新文章

  1. 如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)
  2. tensorflow与keras的关系
  3. Linux find查找文件夹(目录)所在位置
  4. 作业三--阅读《构建之法》1-5章
  5. windows7系统安装更新补丁提示0x80240037错误如何解决,文件的后缀名怎么换?
  6. 新的生活,新的工作,新的挑战
  7. TensorFlow基础篇(六)——tf.nn.max_pool()和tf.nn.avg_pool()
  8. java基础篇---网络编程(TCP程序设计)
  9. bandgap带隙基准电路设计,cadence,
  10. 文件搜索工具ProFind for Mac
  11. 手机测试wifi的延迟的软件,六款最佳、免费的网络延迟测试工具
  12. Ubuntu 16.04+CUDA8.0+Caffe+OpenCV3.1
  13. 什么是合成孔径雷达(SAR)
  14. 一篇不错的关于VSS的入门介绍
  15. TI电量计--BQ34Z100踩坑总结
  16. 如何杜绝发生手游更新失败这种现象?
  17. LaTeX调整三线表行间距
  18. scrapy打包exe 成功详细教程
  19. Flutter,Android,java现在又来了个国产鸿蒙,字节跳动Android面试
  20. centos 7 opencv3 安装——yyw合并

热门文章

  1. v2ex热帖:面了几个程序员(3-5年),发现他们对MySQL的distinct关键字有误解......
  2. 因为一条SQL,我差点被祭天......
  3. 我把SpringBoot的banner换成了美女,老板说工作不饱和,建议安排加班...
  4. Java开发者还用SSH?大清朝都亡了,你知道吗?
  5. 互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)
  6. 流量一天一个台阶,谈映客直播服务端架构优化之路
  7. 对unidbgrid的单元格操作
  8. 图解C#的值类型,引用类型,栈,堆,ref,out
  9. java基础70 负责静态的网页制作语言XML(网页知识)
  10. JavaScriptSerializer 类