1、Servlet继承关系
package com.biaodan.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*1 .继承关系
javax.servlet.Servlet接口
Javax.servlet.GenericServlet抽象类
javax.servlet.HttpServlet抽象子类
2 .相关方法
javax.servlet.Servlet接口
void init(config)-初始化方法
void service(request,response)服务方法
void destory()销毁方法
javax.servlet.GenericServlet抽象 类:
void service(request,response)-仍然是抽象的
javax.servlet.HttpServlet抽象子类
void service(request,response)不是抽象的
1.String method = req.getMethod();获取请求的方式
3.小结
1)继承关系:HttpServlet -> GenericServlet -> Servlet
2)Servlet中的核心方法: init(),Service(),destroy()分别表示初始化、服务、销毁
3)服务方法:当有请求过来时,service方法会自动响应(其实是tomcat容器调用)
在HttpServlet中我们会去分析请求的方式:到底是get、post、head还是delete等等
然后再决定调用的是那个do开头的方法
那么再Httpservlet中这些do方法默认都是405的实现风格,要我们子类去实现对应的方法,否则默认会报405错误
4)因此,我们在新建Servlet时,我们会考虑请求方法,从而决定重写那个do方法
*/
public class Demo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2、Servlet的生命周期
package com.biaodan.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//演示servlet的生命周期
/*1)生命周期:从出生到死亡的过程就是生命周期,对应Servlet中的三个方法:init()、service()、destroy()
2)默认情况下:
第一次请求时,这个servlet会进行实例化(调用构造方法),初始化(调用init()方法)、然后服务(调用service()方法)
从第二次请求开始,每一次都是服务
当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
3)通过案例我们发现:
-Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应
-默认情况下,第一次请求时,tomcat才回去实例化,初始化,然后再服务。
这样的好处是什么?提高系统的启动速度
这样的缺点是什么?第一次请求时,耗时较长。
-因此得出结论:如果需要提高系统的启动速度,当前默认情况就是这样,如果需要提高响应速度,我们需要设置Servlet的初始化时机
4)Servlet的初始化时机:
-默认是第一次接收请求时,实例化,初始化
-我们可以通过<load-on-startup>来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
5)Servlet在容器中是:单例的,线程不安全的
-单例:所有的请求都是同一个实例去响应
-线程不安全:一个线程需要根据这个实例中的某个成员变量值去做逻辑判断,但是在中间某个时机,另一个线程改变了这个成员变量的值,从而导致第一个线程的执行路径发生了变化
-我们已经知道了servlet是线程不安全的,给我们的启发是:尽量的不要在servlet中定义成员变量,如果不得不定义成员变量,那么不要去:1.不要去修改成员变量的值,2.不要去根据成员变量的值做一些逻辑判断
*/
public class Demo02Servlet extends HttpServlet {
public Demo02Servlet(){
System.out.println("正在实例化、、、");
}
@Override
public void init() throws ServletException {
System.out.println("正在初始化、、、");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("正在服务、、、");
}
@Override
public void destroy() {
System.out.println("正在销毁、、、");
}
}
3、Http协议
package com.biaodan.servlet;
/*
Http协议
1)Http称之为 超文本传输协议
2)Http是无状态的
3)Http请求响应包括两个部分:请求和响应
-请求:
请求包括三个部分:1.请求行;2.请求消息头;3。请求体
1)请求行:包含三个信息1、请求的方式;2、请求的URl;3、请求的协议(一般都是HTTP1.1)
2)请求消息头中包含了很多客户端需要告诉服务器的信息,比如:我的浏览器型号,版本,我能接受的内容的类型
3)请求体,三种情况
get方式:没有请求体,但是只有一个queryString
post方式:有请求体,form data
json方式:有请求体,request payload
-响应:
响应也包含三个:1.响应行;2.响应头;3.响应体
1)响应行包含三个信息:1.协议;2.响应状态码(200);3.响应状态(ok)
2)响应头:包含了服务器的信息;服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
3)响应体:响应的实际内容(比如请求add.html页面时,响应的内容就是<html><head><body><form>、、、
200:正常响应
404:找不到资源
405:请求方式不支持
500:服务器内部错误
*/
public class Http {
}
|