HTTP协议

超文本传输协议 , 是一个应用层的网络传输协议. 属于TCP/IP协议集中的一个子协议

特点:简单快速;无连接协议,每次连接服务器只处理一次请求,处理完毕,立即断开;无状态协议,处理客户端的请求时,服务器没有记忆能力;支持多种不同的数据提交方式,GET/POST等等;支持任意类型数据传输,较为灵活.

HTTP协议的组成部分

  • 请求

    请求头(request header)

    请求的头部信息 , 由一个个的键值对组成, 这些键值对描述的是客户端的信息.

    请求体

    GET请求不存在请求体 ,将请求的参数存储在网址中;POST请求请求体的作用:用于存储客户端请求的数据

    请求空行

    请求头部与请求体之间的一行空白行

    请求行

    由一个个的键值对组成, 这些键值对描述的是 请求的方式 ,访问的网址, 以及http协议的版本.

  • 响应

    响应头

    响应头部的信息, 由一个个的键值对组成, 这些键值对描述的是服务器的信息.

    响应体

    一个单独的数据报, 是服务器给客户端回复的主要内容.

    响应行

    由一个个的键值对组成, 这些键值对描述的是 : 响应的状态码, 以及响应成功与失败的提示

Servlet

Servlet是运行在服务器上的Java类,用来完成B/S架构下,客户端请求的响应处理

平台独立,性能优良,能以线程方式运行

Servlet API为Servlet提供了统一的编程接口

Servlet的使用

在idea里新建项目,选择java里的web Application。把tomcat的jar库建项目依赖,然后新建tomcat服务器。

然后在src下新建demo目录,在此目录下建servlet1.class,并输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet1 extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 设置响应内容的编码格式, 以及内容类型
response.setContentType("text/html;charset=utf-8");
//2. 通过响应对象, 得到用于准备响应体的打印流
PrintWriter out = response.getWriter();
//3. 打印内容
out.println("<h1>Hello JavaWeb</h1>");
}
}

在web/web-inf/web.xml的web-app标签下,输入代码,把Servlet映射到网址上

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>haha</servlet-name>
<servlet-class>demo.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>haha</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>

通过注解来完成映射网址的配置,不需要使用web.xml,直接在servlet代码类主体上加@WebServlet(“/s2”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/s2")
public class Servlet2 extends HttpServlet {

/**
* service方法, 表示服务方法
* 当用户每次请求对应的网址时 , 此方法自动执行.
* 方法中的参数:
* 参数1. HttpServletRequest http协议中请求部分由tomcat进行了封装, 封装为了此对象, 对象中包含的是请求的相关信息.
* 参数2. HttpServletResponse
* http协议存在响应部分, 而响应的内容, 是由我们的代码所生成的 ,
* 而HttpServletResponse , 它就是tomcat为了方便我们进行响应, 将响应的操作 ,封装为了这个对象.
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 设置内容的类型 以及 编码
response.setContentType("text/html;charset=utf-8");
//2. 通过响应对象 得到向响应体输出的流
PrintWriter out = response.getWriter();
//3. 通过打印流, 向响应体中打印内容
out
.append("<html>")
.append("<head><title>Servlet准备的网页内容</title></head>")
.append("<body>")
.append("<h1>示例标题</h1>");

for (int i = 0; i < 100; i++) {
out.append("<div>嘿嘿嘿"+i+"</div>");
}
out
.append("</body>")
.append("</html>")
;
//4. 当此方法执行完毕后, 则tomcat认为 响应体准备完毕, 会将内容响应给客户端.
}
}

servlet的生命周期

指的是Servlet从创建到消亡的周期

Servlet的创建时机:默认情况下, 当用户第一次访问Servlet的映射地址时, Servlet的对象被创建。

Serlvet的销毁时机:当tomcat关闭,或应用被卸载时,Servlet被销毁;(当tomcat关闭后或应用被卸载后,用户无法再访问Servlet,我们Servlet也就不需要在内存中存在了,所以此时被销毁)

tocmat为了方便我们 进行资源的缓存 ,为了让我们能在Servlet创建时, 初始化一些重复利用的资源,为了让我们能在Servlet销毁时,释放这些重复利用的资源, 提供了生命周期对应的方法 :

1.init方法: 当Servlet被创建时,此方法执行,用于告知程序员,第一次访问产生了.我们可以在此方法中初始化后续重复利用的资源.

2.service方法: 服务方法,当用户每一次访问时,都会执行,用于处理用户的请求,以及对用户进行响应.

3.destroy方法: 当servlet即将被销毁时,tomcat会调用此方法,告知程序员.我们可以在此方法中释放初始化的那些重复利用的资源.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Servlet implementation class Servlet3
*/
@WebServlet("/s3")
public class Servlet3 extends HttpServlet {

@Override
public void init() throws ServletException {
System.out.println("servlet初始化中...");//点击访问映射的地址
}

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().append("<h1>生命周期</h1>");
System.out.println("servlet正在处理请求");//访问映射的地址中
}

@Override
public void destroy() {
System.out.println("servlet即将被释放...");//tomcat关闭
}
}

调整Servlet对象的创建时机 (可以理解为: 懒汉变饿汉)

使用web.xml的配置方式,在里加数字,改变init()执行时间.

取值为数字 , 默认值为-1;当值为负数时:第一次请求时加载.当值≥0时,含义是:服务器启动时,就加载servlet.多个servlet之间值越小越早加载.值相同按照web.xml中自上而下的配置顺序加载!