实现一个简单的Tomcat 1
实现一个简单的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相关推荐
- 实现一个简单的Tomcat
实现一个简单的Tomcat 1. Tomcat作用 我们的web应用会运行在Tomcat中,那么显然请求必定是先到达Tomcat的,Tomcat对于请求实际上会进行如下的处理: 提供Socket服务: ...
- 【Tomcat】——纯手写实现一个简单的Tomcat
前言 心血来潮,记得上大学时老师曾经简单讲过Tomcat底层的实现原理,并给我们演示过简单的实现,趁着刚毕业还没有全部忘记,回温一下记录在这里,在这里纯底层实现一个简单可以访问静态文件以及动态请求的T ...
- 一个简单的静态web服务器实现
看完tomcat原理后,想自己用java仿一个简单的tomcat,先实现一个静态的web服务器.需要的技术有java网络编程(tcp/ip协议.http协议.socket等基础知识) 源码下载链接ht ...
- tomcat(2)一个简单的servlet容器
[0]README 0.1)本文部分文字转自 "深入剖析Tomcat",旨在学习 一个简单的servlet容器 的基础知识: 0.2)for complete source c ...
- tomcat(1)一个简单的web server
[0]README 0.1)本文部分描述转自"深入剖析tomcat", 旨在学习 一个简单的web server 的基础知识: 0.2)for complete source ...
- tomcat原理解析(一):一个简单的实现
一 概述 前段时间去面试,被人问到了tomcat实现原理.由于平时没怎么关注容器的实现细节,这个问题基本没回答上来.所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP ...
- eclipse maven项目 class类部署不到tomcat下_Springboot介绍以及用Eclipse搭建一个简单的Springboot项目教程
简述 本文主要介绍Springboot以及用Eclipse搭建一个简单的Springboot项目. Springboot简介 Springboot是由Pivotal团队提供的全新框架,其设计目的是用来 ...
- IDEA 开发一个简单的 web service 项目,并打包部署到 Tomcat
文章目录 实现的效果 一.创建 web service 项目 二.测试类运行 web service 服务端 三.IDEA 打包 web service 项目 四.web service 项目部署到 ...
- 一个简单可参考的API网关架构设计
http://www.infoq.com/cn/articles/api-gateway-architecture-design 网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由 ...
- java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...
最新文章
- 如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)
- tensorflow与keras的关系
- Linux find查找文件夹(目录)所在位置
- 作业三--阅读《构建之法》1-5章
- windows7系统安装更新补丁提示0x80240037错误如何解决,文件的后缀名怎么换?
- 新的生活,新的工作,新的挑战
- TensorFlow基础篇(六)——tf.nn.max_pool()和tf.nn.avg_pool()
- java基础篇---网络编程(TCP程序设计)
- bandgap带隙基准电路设计,cadence,
- 文件搜索工具ProFind for Mac
- 手机测试wifi的延迟的软件,六款最佳、免费的网络延迟测试工具
- Ubuntu 16.04+CUDA8.0+Caffe+OpenCV3.1
- 什么是合成孔径雷达(SAR)
- 一篇不错的关于VSS的入门介绍
- TI电量计--BQ34Z100踩坑总结
- 如何杜绝发生手游更新失败这种现象?
- LaTeX调整三线表行间距
- scrapy打包exe 成功详细教程
- Flutter,Android,java现在又来了个国产鸿蒙,字节跳动Android面试
- centos 7 opencv3 安装——yyw合并
热门文章
- v2ex热帖:面了几个程序员(3-5年),发现他们对MySQL的distinct关键字有误解......
- 因为一条SQL,我差点被祭天......
- 我把SpringBoot的banner换成了美女,老板说工作不饱和,建议安排加班...
- Java开发者还用SSH?大清朝都亡了,你知道吗?
- 互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)
- 流量一天一个台阶,谈映客直播服务端架构优化之路
- 对unidbgrid的单元格操作
- 图解C#的值类型,引用类型,栈,堆,ref,out
- java基础70 负责静态的网页制作语言XML(网页知识)
- JavaScriptSerializer 类