目录
1.什么是Servlet
Servlet:server applet官方解释:运行在服务器端的小程序。
Servlet作用上就是处理用户请求的,实现上就是一个java接口。定义了java类被浏览器访问到的规则或者说是被Tomcat识别的规则。将来我们自己写一个java类只要实现了这个接口,复写方法就可以被 tomcat识别。(该接口有5个方法都要被实现)。这里的java类不是自己去运行的(即无main方法),它是依赖服务器才能运行的,它没有主方法(main),相当于是tomcat来执行它的,并不是随便写的类都能被tomcat执行,这个java类要有一定的规范才能被tomcat识别来执行(创建对象,调用方法等)。
Servlet⼯作模式:
① 客户端发送请求⾄服务器
② 服务器启动并调⽤Servlet,Servlet根据客户端请求⽣成响应内容并将其传给服务器
③
服务器将响应返回客户端
2.Servlet API
实现了
Servlet
接口的
java
类必须要重写这个
Servlet
接口中的所有方法,但只有重写的
service
方法被有效的使 用,其它的方法都没有被重定义,怎么样才能只定义要用的方法其它方法不写而不报错呢?这就需要了解Servlet继承的体系结构了。
2.1.抽象类GenericServlet原理
GenericServlet
实现了
Servlet
接口,它是一个抽象类。
GenericServlet
将
Servlet
接口中的
其它的方法做了默认空实现
,只将
service()
方法作为抽象方法来定义,将来定义Servlet
类时,可以继承
GenericServlet
,实现
service()
方法即可。而对于其它的方法要用时再去实现。 然后这个方法在开发中却不怎么使用。
![](https://i-blog.csdnimg.cn/blog_migrate/2b62a91dc48a9e558c0fd623edf151a4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e265c3d63622866ba7e5a662fbeb0ad5.png)
2.2.抽象类HttpServlet原理
HttpServlet
抽象类继承了
GenericServlet
这个抽象类。
HttpServlet
是对
http
协议的一种封装,简化操作。
为什么会有HttpServlet这个抽象类?这个抽象类的基本原理?
在自己定义的
Servlet
实现类时,肯定有一个复写
service
方法,这个方法用来接收数据并做相应的逻辑,比如从表单发送的 username,password数据将来可以传输到
service
方法中,通过
service
方法中的操作可以获取从表单传来的数据。在表单中提交数据有get
和
post
两种方式,
get
和
post
封装数据的位置和格式是不一样的,所以在
service
获取数据之前要判断请求方式是get
还是
post,
通过
req
对象调用
getMethod
方法获取字符串形式的请求方式。即
String method=req.getMethod();然后通过
equals
方法进行判断是哪种请求方式
if("GET".equals(method)){
}else if("POST".equals(method)){
}
上述的判断请求方式和获取数据操作是每一个
service
方法都要做的, 所以sun
公司专门提供了这个
HttpServlet
抽象类,
HttpServlet将上述判断请求方式和获取数据的操作封装起来,并提供了两个获取数据的接口(法):doGet()和doPost(),
这样我们在重写
service
方法时只要继承了
HttpServlet
就可以不写上述的操作,直接引用两个接口获取数据即可。这就是HttpServlet
定义的基本原理。这样连
service
方法都不用复写了,直接引用它提供的两个接口doGet
和
doPost
进行复写。
![](https://i-blog.csdnimg.cn/blog_migrate/78db7263dedbfc0f879d13012db26601.png)
HttpServlet
的部分源码:
(Http
协议一共有
7
种请求方式,主要用
get
和
post
两个
)
![](https://i-blog.csdnimg.cn/blog_migrate/796893f2449a616946e3a228867a0584.png)
![](https://i-blog.csdnimg.cn/blog_migrate/18f6f97328a76ff6bb7650c727881d45.png)
3.servlet创建和请求的过程
1.创建一个javaweb项目,在web目录下创建lib目录,导入javaee-api-7.0.jar
2.在src下创建包和继承servlet类TestServlet,复写doGet和doPost方法
3.在web下创建index.html
4.在WEB-INF中的
web.xml
⽂档中配置映射关系,将index.html与TestServlet.java进行关联。
请求过程:
当用户点击超链接时,发送一个test请求,然后跳转到web.xml中,
在<servlet-mapping>通过<url-pattern>/test</url-pattern>进行地址匹配,
通过<servlet-name>获取到对应的servlet名称,
然后匹配到这个servlet全类名<servlet-class>web.TestServlet</servlet-class>
tomcat
会将字节码文件加载到内存,并创建其对象。
调用其方法
![](https://i-blog.csdnimg.cn/blog_migrate/84bc6a019b9c7cc538d3ba9a0889e157.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d0f76d21fddcbd8bd3032730b80fbcd1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1213a7435b034a9ea64dc571cf41634e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cfb81b92193c407e64b721147e73f036.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f8b2cc71383107127edb28d807cf6129.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b66a0d0ed5e30157b377e82b40e1940c.png)
4.Servlet⼯作原理
(1) Servlet接⼝定义了
Servlet
与
servlet
容器
之间的契约。这个契约是:
Servlet
容器将
Servlet
类载⼊内存,并产⽣Servlet
实例和调⽤它具体的⽅法。但是要注意的是,
在⼀个应⽤程序中,每种
Servlet类型只 能有⼀个实例。
(2)⽤户请求致使
Servlet
容器调⽤
Servlet
的
Service
()⽅法,
并传⼊⼀个
ServletRequest
对象和⼀个
ServletResponse
对象
ServletRequest
对象和
ServletResponse
对象都是由
Servlet
容器(例如
TomCat)封装好的,并不需要程序员去实现,程序员可以直接使⽤这两个对象。
(3)ServletRequest中封装了当前的
Http
请求,因此,开发⼈员不必解析和操作原始的
Http
数据。ServletResponse表示当前⽤户的
Http
响应,程序员只需直接操作
ServletResponse对象就能把响应轻松 的发回给⽤户。
(4)对于每⼀个应⽤程序,
Servlet
容器还会创建⼀个
ServletContext
对象。这个对象中封装了上下⽂ (应⽤程序)的环境详情。每个应⽤程序只有⼀个ServletContext
。每个
Servlet
对象也都有⼀个封装
Servlet
配置的
ServletConfig对象。
总之,就是用户发送请求后,服务器通过路径映射到servlet,tomcat调用servlet的service方法去处理请求,其中HttpServletRequest用来获取请求信息,HttpServletResponse用来响应信息给用户。
另外请求是短连接,那么如何保证数据持久的交互?也就是不管是单次请求还是多次请求,都可以进行数据的交互?可以通过HttpServletRequest获取ServletContext全局对象,
![](https://i-blog.csdnimg.cn/blog_migrate/d6b77e1d2155c1ce35069aa0f83a451a.png)
5.Servlet生命周期
四个过程:
(1)
实例化
--
先创建
servlet
实例
(2)
初始化
--init()
(3)
处理请求
---service()
(4)
服务终⽌
--destory()
具体说明:
当客户端发送第⼀次请求后,由容器
(web
服务器
(tomcat))
去解析请求
,
根据请求找到对应的
servlet,
判断该类的对象是否存在,不存在则创建
servlet
实例,调取
init()
⽅法进⾏初始化操作
,
初始化完成后调取 service()⽅法
,
由
service()
判断客户端的请求⽅式,如果是
get
,则执⾏
doGet(),
如果是
post
则执⾏ doPost().处理⽅法完成后
,
作出相应结果给客户端
.
单次请求处理完毕。
当⽤户发送第⼆次以后的请求时
,不会创建servlet对象,也不会
执⾏
init()
,⽽直接执⾏
service
⽅法
,
调取 doGet()/doPost()⽅法。
当服务器关闭时调取
destroy()
⽅法进⾏销毁。
注意第一次与第二次的区别。
![](https://i-blog.csdnimg.cn/blog_migrate/3a9f33bd14cd40ad876d05a345a8574e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3d93d580bf38460dbbc5573dee7d71ec.png)