WebServer
AsONgaS
这个作者很懒,什么都没留下…
展开
-
实现一个简易版的Tomcat(十七)
前言此版本将会完善项目的一些细节,如:表单提交请求为post等...一、支持post请求提交form表单页面上要提交用户输入内容我们使用了form表单,而form表单的提交方式是通过method属性设置的,默认值为GET。还有一种提交方式为POST请求,使用这种方式提交表单时,数据会被包含在请求的消息正文中。因此服务端如果想获取POST形式提交的数据,需要在HttpRequest中实现解析消息正文的工作。通常页面上用户提交的数据包含敏感信息,比如密码。或者表单中包含附件信息时就要使用PO原创 2020-09-04 22:50:10 · 416 阅读 · 3 评论 -
实现一个简易版的Tomcat(十六)
前言完成二维码生成功能过程:用户访问生成二维码的页面,并输入要在二维码上显示的内容,并点击生成按钮提交数据。服务端将该请求交给生成二维码的Servlet来处理,在其中我们获取到用户输入的信息并生成二维码数据,然后通过设置响应回复给浏览器显示该二维码图片。实现:1:在webapps/myweb目录下新建一个页面:createQR.html并在index.html页面中添加超链接访问这个页面,再新建两个成功和失败的页面(过于简单,不再展示代码)2:createQR.html上定义一个表单,原创 2020-09-04 21:29:24 · 152 阅读 · 0 评论 -
实现一个简易版的Tomcat(十五)
前言使用thymeleaf,生成动态页面。关于动态页面和静态页面:动态资源(数据):通过程序生成的数据,比如:验证码。 静态资源(数据):事先准备好的,不会变的。比如图片,html页面等。本版本需求:在一个页面上显示所有注册用户的信息。该页面上展示的用户数据来源于user.dat。该文件随着用户做注册修改等操作在随时变化,因此展示注册用户的页面不可能是事先准备好的不变的内容。因此该页面上的用户数据是程序每次根据请求该页面时生成并体现到页面中。thymeleaf是一个用于生成动态页面...原创 2020-09-04 21:11:39 · 187 阅读 · 0 评论 -
实现一个简易版的Tomcat(十四)
前言此版本实现登录业务(流程与注册相像)登录的流程:1:用户访问登录页面(可以在首页上点击超链接进入登录页面)2:在登录页面输入用户名和密码并点击登录按钮提交表单3:表单提交路径action="loginUser"<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title>原创 2020-09-04 19:02:58 · 155 阅读 · 0 评论 -
实现一个简易版的Tomcat(十三)
前言本版本开始,完成业务的处理,这里先以注册用户为例开始实现。需要了解的知识点:1:浏览器如何将用户在页面上输入的信息提交给服务端了解页面的"表单"元素。2:服务端如何通过浏览器发送过来的请求解析到用户提交的数据本版本先将上述两个工作完成,因为这个步骤时通用的,无论用户将来完成什么业务,只要提交数据,解析工作是一样的。这一步完成后,再在下个版本中实现具体的处理注册用户的业务步骤。实现:1:在webapps/myweb/下新建一个页面:reg.html 注册页面在这里我们学习...原创 2020-09-04 18:53:11 · 235 阅读 · 0 评论 -
实现一个简易版的Tomcat(十二)
前言上个版本中我们设计了一个类HttpContext,并在其中定义了一个静态属性mimeMapping,这里面在初始化时存放了6组键值对,保存了6中不同资源后缀与对应的Content-Type的值。但是实际上资源后缀有1000多种,我们需要将它们全部支持,才可保证任何资源都可以给客户端正确响应。本版本将解决如何解析XML文件。实现:TOMCAT的安装目录下有一个config目录,在该目录下有一个web.xml文件,这个文件中记录了所有的资源类型。我们直接使用这个文件将内容解析出来初始化mimeM原创 2020-09-04 16:09:59 · 167 阅读 · 0 评论 -
实现一个简易版的Tomcat(十一)
前言上一个版本中为了让服务端支持根据浏览器请求的资源的实际类型发送响应头Content-Type可以有对应正确的值,我们在Clienthandler中添加了一个Map。随之而来的问题:由于每次请求都会创建一个ClientHandler,那么这个Map也会随之每次创建,但是其内容则是固定不变的,因此没有必要每次都创建,所有要将其定义为静态的,全局一份即可。实现:1.创建HttpContext:在com.webserver.http包中新建一个类:HttpContext使这个类保存所有和HTT原创 2020-09-04 15:12:16 · 148 阅读 · 0 评论 -
实现一个简易版的Tomcat(十)
前言本版本要对响应中发送响应头的工作做两个重构:首要解决的问题是,不能让HttpResponse发送响应头的工作中只固定发送两个头,因为随着后期的扩展,服务端可以发送更多响应头,因此响应头内容应当是可扩展的。 发送响应头Content-Type时的值应当随着客户端请求的资源类型不同而产生变化,让浏览器理解其请求的资源。问题一的解决:要想让response发送响应头的内容可以扩展,我们可以在响应对象HttpResponse中定义一个响应头相关信息的属性:private Map<Strin原创 2020-09-02 18:30:49 · 135 阅读 · 0 评论 -
实现一个简易版的Tomcat(九)
前言在页面上显示一张图片,从中了解页面中含有其他资源时,浏览器与服务端的交互过程。实现:1:在webapps/myweb目录下保存一张图片,名字任意。2:在webapps/myweb目录下的index.html页面上添加图片的展示。3:通过浏览器访问服务端该页面查看图片的显示。通过测试发现,当一个页面上含有其他资源时,浏览器要通过多次请求将这些资源全部下载后才能完整显示页面,而由于我们的服务端目前只接收一次请求,所以导致页面不能正确被下载以便展示。解决办法:由于服务端已原创 2020-09-01 23:02:14 · 182 阅读 · 0 评论 -
实现一个简易版的Tomcat(八)
前言上个版本我们处理了响应404页面,此版本我们将对代码进行重构。重构思想:与请求一样,既然响应也是由三部分构成,我们可以设计一个类, 取名:HttpResponse,并用这个类的每一个实例表示客户端发送的 相应内容。将来可以根据实际响应内容不同,对响应的对象中各部分 信息进行设置,最终发送给客户端。实现:1.新建类HttpResponse2.定义结构定义HttpResponse的结构,以及方法flushflush方法用于将当前响应对象的各部分信息最终以标准的Http响应格式原创 2020-09-01 22:34:14 · 189 阅读 · 0 评论 -
实现一个简易版的Tomcat(七)
前言上个版本我们处理了客户端请求的页面路径的问题,此版本我们将完成响应404页面的工作。实现:1.在webapps目录下新建一个子目录root,并在这个目录下新建404页面,起名:404.html注意:root目录用于保存所有网络应用中公用的内容,比如404页面...无论用户访问哪个网络应用中的资源都可能存在该资源不存在的情况,我们都应当响应404页面,因此这个页面就是共用页面了,没有必要在每个网络应用目录下都新建这个404页面。页面如下(能表达意思即可^_^)<!DOC原创 2020-09-01 22:20:51 · 114 阅读 · 0 评论 -
实现一个简易版的Tomcat(六)
前言此版本完成根据客户端请求的页面进行响应本版本的几个思考点: 浏览器想请求服务端webapps目录下某个网络应用中的页面,地址栏中"???"部分应该写什么:http://localhost:8088/??? 上面地址栏中输入的路径中"???"部分内容在request对象中哪个属性上保存? 能否根据request中得到这部分的路径,并在创建File时根据它定位到这个文件并进行响应。 解决思考点1:”http://localhost:...原创 2020-09-01 22:09:36 · 144 阅读 · 0 评论 -
实现一个简易版的Tomcat(五)
前言此版本测试给客户端响应一个页面回去在这个版本中我们要了解两个知识点:1:HTML页面的基本语法。2:HTTP响应的格式定义。因为只有基于该格式要求才能给客户端发送响应。实现:一、创建页面 在项目目录下新建一个目录webapps. 这个目录用于保存服务端所有的网络应用(webapp),每个网络应用在webapps下单独以一个目录形式保存。目录命名就作为网络应用的名字。 注意:每个网络应用相当于一个"网站",会包含如:页面、素材、以及用于 处理业务的逻辑代码。 在we原创 2020-08-28 19:05:02 · 176 阅读 · 0 评论 -
实现一个简易版的Tomcat(三)
前言此版本开始完成解析请求的工作上一个版本中我们在WebServer里测试与浏览器的连接,并且读取了浏览器发送过来的请求内容。一个请求由三部分构成,其中请求行和消息头都是由一行字符串构成的,特点都是以回车符换行符结尾。因此在正式开始解析钱先测试读取一行字符串的操作。实现:一、创建类ClientHandler在com.webserver.core包下创建类:ClientHandler这个是线程任务,用于处理一个客户端的交互 其中start方法中的代码需要改为如下: ...原创 2020-08-25 22:38:01 · 224 阅读 · 0 评论 -
实现一个简易版的Tomcat(二)
前言本文开始将借助IDEA开发工具详细阐述Tomcat的底层实现原理一、创建Maven项目关于Maven项目的创建在之前的文章中有详细介绍,这里就不再过多赘述二、创建WebServer主类我们可以通过创建的WebServer主类测试与浏览器的连接,并且读取后续浏览器发送过来的请求在WebServer主类中我们需要一个无参构造,一个start方法,一个main方法代码如下:public class WebServer { private ServerSocke...原创 2020-08-25 22:25:05 · 221 阅读 · 0 评论 -
实现一个简易版的Tomcat(一)
目录1.Http(超文本传输协议)简要Http协议交互规则:Http协议对于浏览器和服务器之间交互的数据格式:Http规定字符集:请求Request:1.Http(超文本传输协议)简要 Http协议交互规则: 要求浏览器与服务端之间必须遵循一问一答的规则,即:浏览器与服务端建立TCP连接后需要 先发送一个请求(问)然后服务端接收到请求并予以处理后再发送响应(答)。注意,服务端永远 不会主动给浏览器发送信息。 HTTP要求浏览器与服务端的传输..原创 2020-08-25 22:04:35 · 650 阅读 · 0 评论 -
实现一个简易版的Tomcat(四)
前言上一个版本中已经测试完成了读取客户端发送过来一行字符串的操作,因此,本版本开始完成解析请求。由于一个请求包含信息比较多,因此我们设计一个类:HttpRequest并用该类的每一个实例表示客户端发送过来的一个Http请求内容。实现:一、com.webserver.http新建一个包com.webserver.http注意:将来有关http协议的类都放在这个包里二、HttpRequest在http包中新建一个类:HttpRequest 即:请求对象 这...原创 2020-08-28 18:47:55 · 339 阅读 · 0 评论