仿写tomcat服务器项目分析
来源:互联网 发布:广告终结者 mac 编辑:程序博客网 时间:2024/05/16 08:49
一,项目分析:
1.v1 是一个http服务器.
2.v2 是一个servlet容器, 可以提供servlet的服务. => 动态load servlet字节码,并运行它( 按生命周期).
3.servlet容器它来控制servlet的生命周期.
4.Servlet类必须要实现一个接口 Servlet , 提供所有的Servlet都要有的方法( 生命周期)
5.对于要处理的资源有两种: 静态资源/动态资源. 定义一个接口,写两个实现.
动态资源: http://localhost:8888/servlet/hello
GET /servlet/hello HTTP/1.1 静态资源: http://localhost:8888/index.html GET /index.html HTTP/1.1=> 将这种处理定义成一个接口 Processor ( process() ) -> StaticProcessor -> DynamicProcessorServlet运行; 第一次访问: 构造方法 -> init() -> service() -> doGet()/doPost() 第二次访问: -> service() -> doGet()/doPost()gethttp://localhost:8080/servlet/Hi?name=zy&age=20 GET /servlet/Hi?name=zy&age=20功能: 1. 等待http请求, 接收请求,做一些解析 -> uri ( 静态资源/动态资源)2. 解析http请求, 构造成一个 HttpServletRequest对象, HttpServletResponse对象. 3. 判断请求的资源的类型静态的资源/动态的资源 , 静态的资源 -> StaticProcessor类 动态资源 -> DynamicProcessor类, 必须要有 Request和Response对象4. 动态加载Servlet的字节码,并调用service() -> 判断请求的方法, 调用对应的 Servlet中的doGet()/doPost()
二,具体代码分析:
接口:
1,Servlet接口:作用 :规范servlet生命周期;
带有init(),service(),doGet(),doPost()方法;
2,ServletRequest接口:作用:包装http请求 parse():解析请求=>1解析 uri 2解析参数 3解析出请求的方式 get/post getParameter():取请求的参数 getUri():获取解析出来的uri地址 getMethod():获取请求方法 3,ServletResponse接口: getWriter():获取输出流的方法。 sendRedirect():重定向 4,Processor接口:运用了工厂模式,即有多个实现类,根据不同的条件 调用实现类。 process()资源处理器:处理静态或动态资源实现类: 1,HttpServletRequest类: HttpServletRequest实现了ServletRequest接口 A,构造方法,参数:输入流 B,parse()解析协议: 1,指定初始容量的字符串缓冲区StringBuffer sb 2,创建字节流 bute[] 3,从输入流中将数据读到字节流里 4,循环字节流将其添加到缓存区间 5,将字符串缓冲区转化为String protocal 6,取到要访问的页面地址parseUri(): A,根据协议,通过split(空格)分割字符串将其存在一个 字符串数组内。 B,判断字符是否为空,不为空则返回200 C,知道ss字符数组中第二个就是地址和参数通过indexof(?)判断是否带有参数 如果有参数则需要截取,如果没有则直接返回ss[1]; 7,取到method:parseMethod(): 通过substring直接截取protocal; 8,解析参数parseParameter(): GET/servlet/Hello?uname=zy&age=10 HTTP/1.1 POST/servlet/Hello unme=zy&age=20 上面是参数的两种类型:GET POST A,判断为那个方法: GET方法: 1,通过split(空格)分割protocal 并将其存到字符数组ss中 2,取到数组的第二位即路径参数部分,通过indexOf("?")返回一个索引, 再通过substring截取到参数部分 POST方法: 直接通过截取获取参数。 B,将参数通过split("&"),拆分,循环数组 取到键值,并将其存入map. 2,HttpServletResponse类: 响应的功能 HttpServletResponse实现了ServletResponse接口: A,构造方法:参数: request ,输出流 B,以输出流将文件写到客户端,加入响应协议sendRedirect() 1,从request中取出要访问的地址(uri) 2,根据 wbroot 路径名字符串和 uri 路径名字符串创建一个新 File 实例 3,如果文件不存在,则返回404错误 a,通过readFile(File)取到404页面内容 1,通过FileImageInputStream构造一个将从给定 File 进行读取的 FileImageInputStream。 2,通过byte[]从流中将数据读取出来,并且存到一个StringBusffer中 3,将StringBuffer转化为字符串返回 4,文件存在则返回页面 5,将该字符串,转化为字节数组,以流的形式,写出 3,HttpServlet类: HttpServlet实现了Servlet接口: 这里是对接口,进行了空实现,采用适配器的方式,隐藏方法,后面的类继承它就可以了。 在其service()中还是实现了判断了,是通过什么请求的 GET/POST 4,StaticProcessor类: StaticProcessor实现了Processor接口: 它是用来实现加载静态资源的。 process()就是返回响应。 5,DynamicProcessor类: DynamicProcessor实现了Processor接口: 它是用来加载动态资源的。 process()参数 ServletRequest ServletResponse: A,取出要访问的地址(uri)通过request B,从uri中截取到文件名 C,创建一个RUL,并将初始要搜索的资源类型,(这里是file)和 初始路径赋给他。 D,将URL转为URL[] E,创建URLClassLoader并将urls赋给他,再通过 .loadClass(servletName)搜索该路径下的该资源 注意:这里用了Class泛型,再通过.newInstance(); 创建此 Class 对象所表示的类的一个新实例。 并强转为Servlet类型 F.在通过方法控制Servlet的生命周期。 servlet.init(); servlet.service(request, response); 6,服务器运行类ServerService: ServerService实现了Runnable接口: A,构造方法:参数 Scoket. B,run(): 1,取到流 2,创建请求对象,request 调用request.parse(); //解析协议 3,创建响应对象 4,定义一个处理器 Processor 5,判断资源类型: 这里即运用了工厂模式 uri是否以/serlvet/开头 是的 则表明请求是动态资源 否则静态资源 创建对应的处理对象 6,以回调的形式 调用处理器方法 processor.process(request, response);服务器: HttpTomcat类: startServer(): 1,创建服务器和分配端口号 2,设置死循环,不断接受来自客户的消息 3,将ServerService设置到线程并启动线程 4,在主方法中启动服务。测试: Hello2类 继承HttpServlet类,实现其doGet/doPost, 这里即使用了适配器模式。项目链接:http://download.csdn.net/detail/young_so_nice/9287837
0 0
- 仿写tomcat服务器项目分析
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
- tomcat服务器不写端口号、不写项目名访问项目、虚拟目录配置
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
- 仿迅雷下载项目分析
- 浅析Tomcat----自己动手写服务器
- 从写项目到部署linux服务器全过程-linux下tomcat的安装篇
- 从写项目到部署linux服务器全过程-linux下tomcat的集群配置篇
- 搭建tomcat服务器,配置项目
- tomcat服务器部署项目问题
- 在linux服务器上,用tomcat直接执行WAR包项目报404原因分析
- Java编写高仿tomcat的web服务器Joncat
- 深入学习Tomcat----自己动手写服务器
- Myeclipse和tomcat模拟写服务器数据
- Tomcat服务器发布项目 取消项目名称
- C++11 为自定义容器实现标准的forward迭代器
- 项目1 - 图基本算法库
- 退役
- C++赋值操作符重载简介
- path与classpath区别,内存管理
- 仿写tomcat服务器项目分析
- HTML5之file控件
- Android moveTaskToBack()方法实现手动隐藏当前Activity
- 94Binary Tree Inorder Traversal
- JAVA Socket基础例程
- NSTimer 两种常用创建方式的区别
- Picasso学习笔记
- 在iOS 8中使用UIAlertController
- LeetCode 之 Lowest Common Ancestor of a Binary Search Tree