Servlet体系结构、工作原理、生命周期

目录

1.什么是Servlet

2.Servlet API

2.1.抽象类GenericServlet原理

2.2.抽象类HttpServlet原理

3.servlet创建和请求的过程

4.Servlet⼯作原理

5.Servlet生命周期

 

1.什么是Servlet

Servlet:server applet官方解释:运行在服务器端的小程序。

Servlet作用上就是处理用户请求的,实现上就是一个java接口。定义了java类被浏览器访问到的规则或者说是被Tomcat识别的规则。将来我们自己写一个java类只要实现了这个接口,复写方法就可以被 tomcat识别。(该接口有5个方法都要被实现)。这里的java类不是自己去运行的(即无main方法),它是依赖服务器才能运行的,它没有主方法(main),相当于是tomcat来执行它的,并不是随便写的类都能被tomcat执行,这个java类要有一定的规范才能被tomcat识别来执行(创建对象,调用方法等)

Servlet⼯作模式:

客户端发送请求⾄服务器

服务器启动并调⽤ServletServlet根据客户端请求⽣成响应内容并将其传给服务器

服务器将响应返回客户端
 

2.Servlet API

实现了 Servlet 接口的 java 类必须要重写这个 Servlet 接口中的所有方法,但只有重写的 service 方法被有效的使 用,其它的方法都没有被重定义,怎么样才能只定义要用的方法其它方法不写而不报错呢?这就需要了解Servlet继承的体系结构了。
 

2.1.抽象类GenericServlet原理

GenericServlet 实现了 Servlet 接口,它是一个抽象类。
 
GenericServlet Servlet 接口中的 其它的方法做了默认空实现 ,只将 service() 方法作为抽象方法来定义,将来定义Servlet 类时,可以继承 GenericServlet ,实现 service() 方法即可。而对于其它的方法要用时再去实现。 然后这个方法在开发中却不怎么使用。
 
 

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 进行复写。
HttpServlet 的部分源码: (Http 协议一共有 7 种请求方式,主要用 get post 两个 )
 
 
 

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 会将字节码文件加载到内存,并创建其对象。
 
调用其方法
 
 
 

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全局对象,
 
 

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() ⽅法进⾏销毁。
 
注意第一次与第二次的区别。
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值