JavaWeb-02

HTTP协议:

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
46
47
48
49
HTTP是一个规范,是用来约束WEB服务器和浏览器之间的通讯协议
HTTP是HyperText Tranfer Protocol 超文本传输协议
基于TCP/IP的一个协议,用于连接WEB服务器和WEB浏览器

HTTP的协议版本:
HTTP/1.0 HTTP/1.1 多数

HTTP协议对于浏览器来说可以分为
HTTP请求:从浏览器发送给服务器的请求内容
HTTP响应:浏览器接受服务器发送的数据内容

HTTP请求:
HTTP请求头:
GET / HTTP/1.1 --请求行
Host: www.baidu.com --请求的服务器地址
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/67.0.3396.87
Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BAIDUID=9EB21B2EF7DA91C0F31857314A0FE50D:FG=1; BIDUPSID=9EB21B2EF7DA91C0F31857314A0FE50D;
PSTM=1529307712; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;
H_PS_645EC=9546Ddy%2BJwlbF0qwIgkz3vAgT%2FSATDZLAT%2FRJInpF%2FGoKAFeefS2O7%2F1JMQ; BD_HOME=0; H_PS_PSSID=1428_21089;
FP_UID=fa1cecbdc1cde0448616d7090e32a513;
BDUSS=UpWSktPMEJsOUlxWllNSEcxTktCfnBIWjRQdzFKYXdJMmNXUTNaNkZhZm04RTViQVFBQUFBJCQAAAAAAAAAAAEAAAC~o3Usyq7Su8TqtcTB9Mr
YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOZjJ1vmYydbT*/

使用GET请求方式:
GET /Day40WEB/TestHttp?name=123&password=123 HTTP/1.1
?之后就是GET请求的数据参数

使用POST请求方式
在URL中没有看到任何的参数
而且请求的方式也略有不同
POST /Day40WEB/TestHttp HTTP/1.1
请求的数据在POST请求特有的 请求体内保存 也就是谷歌浏览器 Form Data

响应头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1 --使用的服务器是什么
Content-Length: 0 --响应得到的数据长度,字节数
Date: Mon, 18 Jun 2018 09:49:20 GMT 格林尼治时间 标准时间

格式:
HTTP/版本号(目前常用都是1.1) 状态码 原因的简单描述
状态码 含义
100 ~ 199 表示成功接收请求,要求客户端继续提交下一次请求
200 ~ 299 表示成功接收并且处理完成了整个操作流程,常用200
300 ~ 399 为了完成请求,要求客户做出进一步的操作,例如:跳转,资源不存在,跳转新界面 常用302 304 307
400 ~ 499 客户请求错误,常用404
500 ~ 599 服务器坏了!常用500

Servlet映射路径

1
2
Tomcat服务器启动之后
http://localhost:8080/Day40WEB/TestHttp
1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<!-- 自定义的名字-->
<servlet-name>TestHttp</servlet-name>
<!-- servlet程序完整的包名.类名-->
<servlet-class>zhaolong.TestHttp</servlet-class>
</servlet>
<servlet-mapping>
<!-- 要求和上面Servlet-name完全一致-->
<servlet-name>TestHttp</servlet-name>
<!-- 映射路径-->
<url-pattern>/TestHttp</url-pattern>
</servlet-mapping>
浏览器访问服务器的URL分析
1.浏览器根据输入的URL来访问Tomcat服务器 http://localhost:8080
2./Day40WEB 访问Tomcat服务器下webapps里面的Day40WEB项目文件夹
3./TestHttp 用来匹配在【WEB-INF】下的【web.xml】文件里面的url-pattern

/TestHttp 称之为 映射路径

映射流程:
    1.在【WEB-INF】下的web.xml文件中匹配url-pattern
    2.匹配到,就可以获取到<servlet-mapping>,可以找到<servlet-name>标签内容,获取servlet-name属性
    3.通过匹配<servlet-name>,找到<servlet>,也就可以获取到<servlet-class>标签内容
    在这个标签中包含了servlet程序运行需要执行的.class文件
    4.通过这个包名.类名就可以加载这个.class(字节码文件),运行servlet程序,这里用到【反射】思想

url-pattern 匹配形式:
    精确匹配:
        url-pattern规定的是什么样的匹配,就在URL中写什么
        例如:
            /TestHttp 在浏览器中只能输入:
                http://localhost:8080/Day40WEB/TestHttp
    模糊匹配:
        /*      http://localhost:8080/Day40WEB/任意内容    都可以访问当前的Servlet程序
        
        *.do    http://localhost:8080/Day40WEB/任意内容.do  以.do结尾
        *.html (伪静态) http://localhost:8080/Day40WEB/任意内容.html
        *.action
        *.jsp
        
    注意事项:
        1.模糊匹配不能同时使用/和*
        2.如果同时存在模糊匹配和精确匹配,精确匹配的优先级高
        3.使用后缀名的模糊匹配优先级最低
        4.要求所有的Servlet程序的url-pattern都不能为/ ,不允许和Tomcat默认Servlet冲突

Tomcat默认的Servlet程序 【缺省路径】

在URL中输入
http://localhost:8080/Day40WEB/

流程:
    1.在Day40的项目目录下【WEB-INF】里面的web.xml中匹配url-pattern为/ 的标签 【精确匹配】
    2.如果没有匹配到这个 / 映射路径,这个时候Tomact会把这个映射路径交给 在Tomcat中默认
    的Servlet程序中,DefaultServlet
    3.DefaultServlet会首先在Day40WEB的项目目录下找有没有对应的index.***文件
        这里可以支持index.html index.htm index.jsp
    4.如果有,将对应的index.***文件发送给浏览器
    5.如果没有,报状态码 404 跳转到默认的404页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

Servlet生命周期【重点】

之前提到的生命周期:
    成员变量,局部变量,类对象,线程的生命周期
    
Servlet程序的生命周期
    是由Tomcat服务器控制的,因为Servlet程序,目前只能在Tomcat服务器上运行
    
Servlet生命周期的四个主要方法:
    1)构造方法
        用于创建Servlet对象
        有且只执行一次
    2)init方法
        初始化构造方法创建好的Servlet对象
        有且执行一次
    3)Service方法
        提供Servlet程序的服务
        随便用几次
        当指定的Servlet程序被创建,初始化之后,并没有销毁,而且从任何浏览器任何ip地址访问当前Servlet程序,
        都不会重新创建,而是始终执行这一个Servlet程序
        
        Servlet就是一个单例对象
    4)Destroy方法
        销毁Servlet对象,在Tomcat服务器关闭时执行
        有且只执行一次

Servlet的自动加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在Tomcat服务器,假如在Servlet程序代码量巨大,操作的数据很大,并没有自动启动,而是当用户访问的时候才启动servlet,
这样会导致用户访问的友好度不够,时间效率低

如果一个Servlet程序运行启动过程比较长,操作复杂度较大,为了提供用户的访问体验,会设置自动加载

需要修改web.xml文件

<servlet>
<servlet-name>LifeDome</servlet-name>
<servlet-class>d_life.LifeDome</servlet-class>
<!-- 这里就是负责自动加载的xml语句,中间的数字从1开始,数字越小,优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>

用来在Tomcat服务器上提前加载一些重要的Servlet