Servlet入门2

Servlet入门2

生命周期

生命周期

从程序产生到死亡的过程即为一个生命周期,对应 servlet 中的三个方法:init()、service()、destory()

重写 service() 方法,无论是什么请求,都会使用 service() 方法,然后在 service() 内部再进行细分

默认情况下

第一次接受请求 Servlet 会进行实例化( 调用构造方法,底层使用反射进行实例化 )、初始化( 调用 init() )、然后进行服务( 关闭服务时调用 destory() );构造方法修改为 private 会报错500 Internal Server Error 服务器内部错误,无法完成请求
第二次请求开始,每一次都是进行服务,刷新与地址栏回车输入都是一种发送请求收到服务回复的过程
当容器关闭时其中所有的Servlet会被销毁,调用销毁方法

案例研究发现

Servlet 实例 tomcat 只会创建一个,所有请求都是这个实例去相应
默认情况下,第一次请求 tomcat 才会去实例化、初始化、进行服务
好处:提高系统启动速度
缺点:第一次请求时耗时较长

得出结论

如果需要提高系统的启动速度,当前默认情况就是这样
如果需要提高相应速度,我们应该设置 Servlet 的初始化时机

Servlet 的初始化时机

默认是第一次接受请求时,进行实例化、初始化;
可以通过 load-on-starup 来设置 servlet 启动的先后顺序,值设置为 1 ,随着 tomcat 容器启动,自动进行初始化

<servlet>
        <servlet-name>Demo02Servlet</servlet-name>
        <servlet-class>com.ppqppl.servlets.Demo02Servlet</servlet-class>
        <!-- 设置启动时间,数字越小启动时间越靠前 0~n 最小值0 -->
    	<load-on-startup>1</load-on-startup>
    </servlet>

Servle t在容器中的情况

Servlet 在容器中是:单例的、是线程不安全的
单例:所有请求,在 tomcat 中只会创建一个实例,无论浏览器和客户端,都是同一个实例进行响应
线程不安全:一个线程需要根据这个实例某个成员变量值去做逻辑判断,但是在中间某个时机,另一个线程改变了这个成员变量的值
从而导致第一个线程的执行路径发生了变化,举例如下:

Servlet:

public int num = 1;
public void service(){
    
    if(num == 1){
      ……  
    }
    else {
	  ……
    }
    
}

如果说有两个客户端1、2,同时读取服务器内容,客户端 1 Socket 读取到 num = 1 ,可以直接进行执行 if 条件语句,成为进程1
但是,当客户端 2 作为进程 2 时,也会读取到 num ,在执行事情时,可能会把 num 的值改掉,会导致修改线程 1 的执行路径
即通过线程 2 执行不同路径的代码,将 num 的值修改掉,此时会导致线程1 执行的路径发生变化

我们已经知道了 Servlet 是线程不安全的,启发:尽量不要在 Servlet 中定义成员变量
如果不得不定义成员变量:
不要修改成员变量的值
不要根据成员变量的值进行逻辑判断

Http协议

HTTP概念

HTTP:Hyper Text Transfer Protocol 超文本传输协议

HTTP 是无状态的

服务器无法判断两次请求是同一个客户端发来的,还是不同的客户端发来的

无状态带来的现实问题:
如果第一次请求是添加商品到购物车,第二次请求是结账;如果这两次请求服务器无法区分是不同用户的,那么就会导致混乱

通过会话跟踪技术来解决无状态的问题,即分配并使用会话 ip( 或 id )

HTTP请求

HTTP请求响应包含两个部分:请求和响应。
请求:请求包含三个部分:请求行,请求消息头,请求主体

请求行: 展示当前请求的三个最基本信息:请求的方式,访问的地址(URL),HTTP请求协议的版本(一般都是 HTTP1.1)
请求消息头( 要告诉服务器的一些信息 ):通过具体的参数对本次请求进行详细的说明,包括很多客户端需要告诉服务器的信息
比如我的浏览器型号、版本、我能接受的内容的类型、我给你发的内容的类型、内容的长度等等

名称 功能
Host 服务器的主机地址
Accept 声明当前请求能够接受的⌊媒体类型⌉
Referer 当前请求来源页面的地址
Content-Length 请求体内容的长度
Content-Type 请求体的内容类型,这一项的具体值是媒体类型中的某一种
Cookie 浏览器访问服务器时携带的Cookie数据

请求体:有三种情况
get 方式:没有请求体,但是有一个 querystring
post 方式:有请求体,叫 form data
json 格式:有请求体,叫 request payload

响应:响应也包含三个部分:响应状态行,响应消息头,响应体
响应行包含三个信息:HTTP版本协议,响应状态码,响应状态的说明文字
状态码:类似于 200 正常响应、404、500等
响应状态:ok 即为正常状态
响应头:包含了服务器的信息,服务器发送给浏览器的信息( 内容的媒体类型、编码、内容长度等 )
相应体的说明书
服务器端对浏览器端设置数据,例如:服务器返回 cookie 信息

名称 功能
Content-Type 相应体的内容类型
Content-Length 响应体的内容长度
Set-Cookie 服务器返回新的Cookie信息给浏览器
location 在重定向情况下,高速浏览器下一个资源的地址

响应体:响应的实际内容( 比如请求 .html 页面时,响应的内容就是<form…… )

posted @ 2022-05-15 16:49  ppqppl  阅读(46)  评论(0编辑  收藏  举报