tomcat服务器响应设置,EasyTomcat

EasyTomcat

一、介绍

一个简易版Tomcat服务器。可以实现简单的请求-响应过程。

主要用于学习Java中的网络编程、线程、反射机制以及一些API的使用,并且可以了解HTTP协议的一些知识。

二、HTTP协议

超文本传输协议。从服务器传输超文本到本地浏览器的传送协议。

2.1、HTTP协议介绍

http是一个简单的请求/响应模式的协议。

http协议中文名称是超文本传输协议。是基于TCP/IP协议之上的。

主要作用:

指定客户端可以发送什么样的消息给服务器,以及服务器可以响应什么样的消息给客户端。

本质上就是约束客户端与服务器如何进行消息交互的一种规范。

2.2、HTTP协议特点

一次请求,一次连接。请求结束,连接断开。

无状态协议。即服务器与浏览器交互过程中,不能保存任何的状态信息。

无连接的。是指每次连接只处理一个请求。处理完请求之后,立即断开连接。

2.3、HTTP协议工作原理

客户端与服务器端建立请求连接.

客户端发送请求给服务器端.

服务器端接受请求,并且响应数据给客户端.

客户端与服务器端断开连接.

三、HTTP请求的格式

一个HTTP请求由三部分组层,分别是:请求行、消息头、消息正文。

d404043e681958f7789363c7e2e05670.png

3.1、请求行

请求行又分为三部分组成,分别是:请求方式、请求资源路径、协议及版本号。

HTTP协议的请求方式有9种:

GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH。

常用的请求方式就两种:GET和POST。

一个请求行格式如下:

GET /index.html HTTP/1.1

含义:请求方式是GET、请求资源路径是/index.html,遵循HTTP/1.1协议。

请求行结束之后,后面跟着一个回车换行符,即:CRLF标识,但是不会显示出来。

CR表示回车符,对应的ASCII码值是13.

LF表示换行符,对应的ASCII码值是10.

请求行解析方法:

根据socket获取到输入流in.

读取输入流数据,当读取到第一个CRLF时,表示请求行读取结束.

通过自定义的readLine()方法返回请求行字符串.

按照空格拆分字符串.

保存对应请求方式、请求路径、协议版本到成员变量中即可.

3.2、消息头

消息头是由类似于key:value格式组成的。

消息头举例如下:

Host: localhost:8080

Connection: keep-alive

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36

Sec-Fetch-Dest: document

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9

Sec-Fetch-Site: none

Sec-Fetch-Mode: navigate

Sec-Fetch-User: ?1

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6

消息头由于是类似key:value形式的,所以可以采用Map集合进行存储。

解析消息头方法:

继续使用输入流读取数据,循环调用readLine()方法.

每调用一次readLine()方法,判断是否为空.

为空是表示消息头读取结束.

不为空,则拆分字符串,使用Map集合保存字符串数组中的数据.

3.3、消息正文

当GET方式进行请求时,消息正文为空。

当POST方式进行请求时,消息正文不为空,服务器获取到的内容和GET方式内容一致,只是传输方式不同。

解析消息正文方法:

针对于GET方式:

使用保存的资源路径,根据?号拆分字符串。然后再根据&号拆分,最后根据=号拆分字符串,保存数据到Map集合中.

07a341eacde58d23a8fa608f986e49c0.png

指针于POST方式:

定义一个字节数组用于保存消息正文.

从消息头中获取Content-Length长度,初始化字节数组。

然后使用输入流读取数据到字节数组中,消息正文读取完毕。

4da0a2f40587ae33fa671faf99f784d7.png

使用到的parseParameters()方法具体实现如下:

50eaa1dc62d03907d520571dd345c530.png

四、HTTP响应的格式

一个HTTP响应也是由三部分组成,分别是:状态行、响应头、响应正文。

a9fd01d435915bc6e6524bfc73fd8533.png

4.1、状态行

状态行由三部分组成:协议及版本号、状态码、状态描述。

协议及版本,常见HTTP/1.1。

状态码标识该响应成功与否。

状态描述表示响应的说明信息。

状态码有五类:

1xx:信息响应类,表示接收到请求并继续处理。例如:100.

2xx:处理成功响应类,表示请求被成功接收兵处理。例如:200。

3xx:重定向类,表示一次请求不能完成响应,需要再次发送请求才能完成响应。例如:302.

4xx:客户端错误类,表示客户端请求包含错误的语法或不能正确执行。例如:403.

5xx:服务端错误类,表示服务端发生代码错误。例如:500.

4.2、响应头

响应头和消息头类似,都是由key:value形式组成的。

常见的响应头有:

Content-Type: text/html

表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。

由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。

Content-Length: 123456

表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。

如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,

完成后查看其大小,然后把该值放入Content-Length头,

最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

4.3、响应正文

响应正文是一串二进制的字节数据。是服务端需要返回给客户端的内容。

例如:

浏览器请求的是服务器的html文件,则服务器将html内容以二进制形式返回浏览器。

五、Servlet处理

5.1、HttpServlet

该类中定义了service丰富,用于处理客户端业务请求。

a9c704280a508830d4576e88d99a23c7.png

所有自定义的servlet需要继承自HttpServlet类.

5.2、ServletContext

ServletContext该类主要作用:从servlet.xml配置文件中读取对应的servlet请求路径,以及对应的Servlet类路径。

servlet.xml配置文件格式

20e25874b01e71e992eda472e034f955.png

path是请求路径,自定义。

class是对应请求需要被那个servlet类处理的包路径。

ServletContext中getServlet()方法

根据请求路径,获取对应得servlet对象。

5373bba6d8dff8efe0c4965457def041.png

5.3、getParameters()方法

HttpRequest对象中提供了getParameters()方法,可以根据key值,获取对应的表单参数值。

举例如下:

对应表单的name

79ad5786c4ac0520881f1b51d1865af2.png

在servlet中通过name和pass获取对应得表单数据

c41d617b47a27e76684aa63d8efecaa1.png

六、EasyTomcat项目结构

68d40becdf82d57e0dd93764a1e83b35.png

6.1、core包

线程类、HttpServlet类以及配置加载类。

21807fb63b5c4455e56e93c0b4a08ea9.png

6.2、ex包

项目中出现的异常类。

6.3、http包

请求和响应处理的类所在包。

e113585b239d4ca2582f5054ca72fe0f.png

6.4、util包

项目工具类所在的包。

58cd842629767f2d07e41b91303749c4.png

6.5、config包

项目的配置文件目录。例如:servlet.xml、web.xml配置文件.

d7e4661fd49c4d0cee3de15fd2d30162.png

6.6、webapps包

静态资源的根路径,即:html、css、js、image等资源需要放在该目录下。

2bc061462dd67f0eee3ef51ec2af9a36.png

总结

EasyTomcat项目适合Java初学者。可以使用该项目提高自己的编程水平,熟悉java编程。

你需要具备以下知识:

Java 集合使用

多线程使用

反射机制

了解HTTP协议

通过dom4j解析xml文件

Java中的网络编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值