文章目录
一、Servlet概念
- 概念:运行在服务器端的小程序
Servlet
就是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则。- 将来我们自定义一个类,实现
Servlet
接口,复写方法
二、快速入门
(在使用Servlet前,先导入其jar包,该jar包在Tomcat的lib目录下)-
创建JavaEE项目
-
定义一个类,实现Servlet接口
-
实现servlet接口中的抽象方法
-
配置
Servlet
的访问路径。在web.xml
根标签中定义1 在web.xml中设置访问 实现servlet接口的类 的路径 <servlet> 给该servlet接口实现类设置一个名字(随便起) <servlet-name>demo01</servlet-name> 添加该类的名称(全路径名称(从src目录下开始写,以点为分隔)) <servlet-class>day9_1.Servlet.ServletDemo01</servlet-class> </servlet> 2.配置该类的映射 <servlet-mapping> 通过/demo01路径可以访问到名称为demo01对于的资源 <servlet-name>demo01</servlet-name> <url-pattern>/demo01</url-pattern> </servlet-mapping>
三、浏览器访问Servlet实现类原理
- 执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找
web.xml
文件,是否有对应的<url-pattern>
路径标签体内容。 - 如果有,则在找到对应的
<servlet-class>
全类名(servlet实现类) - tomcat服务器会将字节码文件加载进内存,并且自动创建其对象
- 调用其方法(不要自己创建Servlet实现类的对象,在Tomcat服务器中他会给你创建一个他的对象,调用里面的实现方法)。
四、Servlet生命周期(Servale接口中的方法5个)
4.1 Servlet实现类对象被Tomcat服务器创建
- 执行
init
方法,只执行1次。Servlet
什么时候被创建?- 默认情况下,该资源第一次被访问时,
Servlet
被创建 - 可以配置执行
Servlet实现类对象
的创建时机(在web.xml
中配置)- 该资源第一次被访问时,创建 其对象
<load-on-startup>
的值为负数
- 在服务器启动时,创建 其对象
<load-on-startup>
的值为0或正整数
- 该资源第一次被访问时,创建 其对象
- 默认情况下,该资源第一次被访问时,
Service
的init
方法,只执行一次,说明在一个Servlet
在内存中只存在一个对象,Servlet
是单例的- 多个线程同时访问时,可能存在线程安全问题。
- 解决:尽量不要在
Servlet
中定义成员变量。即使定义了成员变量,也不要修改值。
4.2 提供服务
- 执行
service
方法,执行多次- 每次访问
Servlet
时,Service
方法都会被调用一次。
- 每次访问
4.3 被销毁
- 执行
destroy
方法,只执行一次Servlet
被销毁时执行。服务器关闭时,Servlet
被销毁。- 只有服务器正常关闭时,才会执行
destroy
方法 destroy
在Servlet
被销毁之前执行,一般用于释放资源。
五、Servlet3.0 注解配置Servlet实现类的访问路径
-
Servlet3.0
-
好处
- 支持注解配置。可以不需要web.xml了。
-
步骤:
-
创建JavaEE项目,选择
Servlet
的版本3.0以上,可以不创建web.xml -
定义一个类,实现
Servlet
接口 -
实现接口中的方法
-
在类上使用
@WebServlet
注解,进行配置。@WebServlet("/访问路径")
//两种方法都可以,不用创建web.xml文件了 @WebServlet(urlPatterns = "/demo") @WebServlet("/demo2") //@WebServlet注解的源码 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { String name() default ""; String[] value() default {}; String[] urlPatterns() default {}; int loadOnStartup() default -1; WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; }
-
-
六、IDEA与tomcat的相关配置
- IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 启动Tomcat的时候控制台的提示log:
Using CATALINA_BASE:C:\Users[user].IntelliJIdea2019.1\system\tomcat\_IDEAworkspace
该地址为Tomcat为该项目创建的配置文件
- 启动Tomcat的时候控制台的提示log:
- 工作空间项目 和 tomcat部署的web项目
- tomcat真正访问的是"tomcat部署的web项目","tomcat部署的web项目"对应着"工作空间项目"的web目录下的所有资源
WEB-INF
目录下的资源,不能被浏览器直接访问。- 断点调试:使用“小虫子”启动,debug启动
七、Servlet 体系结构和相关配置
7.1 Servlet体系结构
Servlet
– 接口
继承关系 |
GenericServlet
– 抽象类
继承关系 |
HttpServlet
– 抽象类
7.1.1 GenericServlet抽象类
- 继承了Servlet接口,将
Servlet
接口中其他的方法做了默认空实现,只将Service方法
作为抽象- 将来只定义
Servlet方法
类时,可以继承GenericServlet
抽象类,实现Service()
方法即可。
- 将来只定义
7.1.2 HttpServlet抽象类
HttpServlet抽象类继承GenericServlet抽象类在重写service()方法的时候,都要添加http判断请求方式,如下图,而HttpServlet抽象类的service方法提前添加好了判断请求方式、当请求方式为GET和post分别实现两个抽象方法
- 对http协议的一种封装,简化操作
- 定义类继承
HttpServlet
- 重写
doGet
/doPost
方法
- 定义类继承
7.2 Servlet相关配置
url-pattern
:Servlet访问路径:- 一个
Servlet
可以定义多个访问路径:@WebServlet({"/d4","/dd4","/ddd4"})
- 路径定义规则:
/xxx
/xxx/xxx
:多层路径,目录结构*.do
(*代表所有,.do代表后缀名,不能加/,不然会报错)
- 一个
八、HTTP
- 概念:Hyper Text Transfer Protocol 超文本传输协议
- 传输协议:定义了客户端和服务器通信时,发送数据的格式
- 特点:
- 基于TCP/IP的高级协议
- 默认端口号是80
http://www.baidu.com
http://www.baidu.com:80
- 基于请求/响应模型,
一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能相互交互数据
- 历史版本:
- 1.0:每一次请求响应都会建立一个连接
- 1.1:复用连接
8.1 客户端请求服务器的消息数据格式
在Servlet对象中的serice方法中有两个参数SerletRequest方法
和
ServletResponse方法
其中
SerletRequest方法
是客户端的请求消息,
ServletResponse方法
是服务器的响应消息
为了更好地掌握这两个对象,要掌握其数据格式
8.1.1 请求行
- 请求格式:
请求方式 / 请求url 请求协议 / 版本
-
GET / login.html HTTP / 1.1
-
- 请求方式 :
- HTTP协议中有7种请求方式,常用的有两种
GET
- 请求参数在请求行中,url后
- 请求的url长度有限制
- 不太安全
POST
- 请求参数在请求体中
- 请求的url长度没有限制
- 相对安全
- HTTP协议中有7种请求方式,常用的有两种
8.1.2 请求头
-
客户端浏览器告诉服务器一些浏览器自身的信息
-
请求头格式
请求头名称:请求头值(逗号隔开 )
列如:Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
- 常见的请求头:
- User-agent:浏览器告诉服务器,用户访问服务器使用的浏览器版本信息
- 可以在服务器端获取该头的信息,解决不同浏览器兼容性问题。
- Referer:告诉服务器,我(当前请求)从哪里来
- 作用
- 防盗链
- 统计工作
- 作用
Referer:http://localhost:8080/day13_servlet_war_exploded/login.html
- Accept:浏览器告诉服务器,浏览器可以解析什么样文件格式(html、xml、xhtml等等)
- Accept-Language:浏览器告诉服务器,浏览器可以支持的语言环境(zh-CN、zh-tw,en-us等等)
- Accept-Encoding:浏览器告诉服务器,浏览器可以支持的压缩格格式(gzip、zip等等)
- Connection:浏览器告诉服务器,连接是否存活(keep-alive告诉服务器连接一直存在,Servlet1.1版本连接存活)
- User-agent:浏览器告诉服务器,用户访问服务器使用的浏览器版本信息
- 常见的请求头:
8.1.3 请求空行
- 就是用于分割
post方式请求
的请求头和请求体
8.1.4 请求体(正文)
请求的内容的格式:参数1=值1 & 参数2=值2 & 参数3=值3 .....
- 得到
post方式请求
的参数数据 - 请求体封装
post
请求消息的请求参数 GET请求方式
没有请求体和请求行
-
例:POST的请求数据消息:
请求头:
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: JSESSIONID=E3173D974F16FD2E577A837C378A02A3
Upgrade-Insecure-Requests: 1
请求空行:
(一个空行,分隔请求头和请求体)
请求体:
name=“zhangsan”
8.2 服务器响应客户端消息数据格式(下一个博客进行学习)
- 响应行
- 响应头
- 响应空行
- 响应体