整理自菜鸟教程(servlet教程)
介绍了servlet的基本内容和生命周期;
一、Servlet简介
-
定义
运行在 web服务器 或者 应用服务器 上的程序;
作为 web浏览器/其他HTTP客户端 和 HTTP客户端 上的 数据库/应用程序 之间的中间层;
-
与CGI(公共网关接口)对比优势
性能好;
在Web服务器地址空间内执行,不必在创单独进程处理每个客户端请求;
独立于平台;
可信度高,Java安全管理器执行一系列限制,以保护服务器计算机上的资源;
Java类库全部功能Servlet可用,通过socket和RMI机制与applets、数据库或软件交互;
-
框架(Servlets grogram位于框架的位置)
-
Servlet任务
①读取 Web Browser 发送的 显式数据
HTML表单、来自applet的表单、来自HTTP客户端的表单
②读取 Web Browser 发送的 隐式HTTP请求数据
cookies、媒体类型、浏览器能理解的压缩格式
③处理数据 并 生成结果
访问数据库、执行RMI或CORBA调用、调用Web服务器
④发送 显式数据(文档) 到 Web Browser
文档——文本文件(HTML 或 XML)
⑤发送 隐式的HTTP 响应 到 Web Browser
返回的文档类型、设置cookies、设置的缓存参数、其他类型的任务
-
Servlet包
使用 java.servlet 和 java.servlet.http 包创建
-
Servlet创建方法
(1)实现Servlet接口
· Servlet生命周期:从创建到被销毁放入过程
· 一次创建到处服务
实例化 使用构建方法创建对象
初始化 执行ini
服务 执行service
销毁 执行destroy
public class ServletDemo1 implements Servlet{
//生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期只执行一次
public void init(ServletConfig arg0)
throws ServletException{
System.out.println("------init-------");
}
//生命周期法:对客户端响应的方法,该方法被执行很多次,每次请求该servlet被执行都会执行该方法
public void service(SerletRequest arg0,SerletResponse arg1)
throws ServletException,IOException{
System.out.println("hehe");
}
//生命周期法:当servlet被销毁时执行该方法
public void destroy(){
System.out.println("-----destroy------");
}
public ServletConfig getServletConfig(){
return null;
}
public String getServletInfo(){
return null;
}
}
(2)继承GenericServlet类
public class ServletDemo2 extends GenericServlet{
public void service(ServletRequest arg0,ServletRespoone arg1)
throws ServletException,IOException{
System.out.println("hehe");
}
}
(3)继承HttpServlet方法
import java.io.IOException;
public class ServletDemo3 extends HttpServlet{
protected void doGet(HttpServletRequset req,HttpServletResponse resp)
throws ServletException,IOException{
System.out.println("hehe");
}
protected void doPost(HttpServletRequset req,HttpServletResponse resp)
throws ServletException, IOException{
System.out.println("hehe");
doGet(req,resp);
}
}
-
HttpServlet、GenericServlet 和 Servlet 的关系
①GenericServlet类:
· 抽象类;
· 实现了Servlet类(原始Servlet)接口,并对其中的init()、destroy() 和 service()提供默认
实现;
· 可直接调用ServletConfig中的方法;
· 将init()中的ServletConfig赋给一个类级变量,可由getServletConfig获取;
②HttpServlet类:
· 抽象类;
· 继承自GenericServlet类,并扩展了Http内容
· 使用了HttpServletRequest类和HttpServletResponse类
· 对于原始的Servlet中的额方法进行了默认操作
二、Servlet环境设置
之前试过菜鸟上推荐的eclipse配合tomcat,后来配的idea配tomcat(香);
这个教程是 IDEA 新建 Servlet 项目(适用于 IDEA 2020.2 及以上版本) 配合 Tomcat安装教程
这两个是目前找到最好操作的 手把手 图接图
三、Servlet生命周期
-
定义
从创建到销毁的整个过程,包括
init()——初始化
service()——处理客户端请求
destroy()——销毁
Servlet由JVM的垃圾回收器进行垃圾回收
-
init()方法
(1)init()方法介绍
①调用时间:被设计成只调用一次,第一次创建Servlet时被调用,每次用户请求时
不再调用;
②作用:创建或加载一些数据,这些数据将被用于Servlet的整个生命周期;
(2)Servlet创建、加载、调用的时间
①创建:创建于用户第一次调用对应于该Servlet的URL;
②加载:可指定Servlet再服务器第一次启动时被加载;
③调用:创建后就可以调用;当用户调用一个Servlet时,就会创建一个Servlet实
例,每个用户请求都会产生一个新的线程,适当的时候移交给doGet或
doPost方法;
(3)init()方法定义:
public void init()throws ServletException{
//初始化代码……
}
-
servlet()方法
(1)service()方法使用的整个过程:
每次服务器收到一个Servlet请求时,服务器会产生一个新的线程,产生一个servlet
实例调用service()服务,处理客户端请求(检查HTTP请求类型 GET POST PUT
DELETE,适当时调用doGet() doPost() doPut() doDelete()),把格式化的响应写回客户
端;
整个过程见下图
(2)service()方法定义:
public void service(ServletRequest request,ServletResponse response)
throws ServletException,IOException{
}
(3)service方法特征:
不用对service()方法做任何董总,只需要根据客户端的请求类型重写doGet()或
doPost()即可;
-
doGet()方法
(1)GET请求来源:一个URL正常请求,或者一个未指定METHOD的HTML表单;
(2)doGet()方法定义:
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
//servlet代码
}
-
doPost()方法
(1)POST请求来源:一个特别指定了METHOD为POST的HTML表单;
(2)doPost()方法定义:
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
//servlet代码
}
-
destroy()方法
(1)destroy()方法使用的整个过程:
在Servlet生命周期结束时,调用destroy(),实现以下操作——
关闭数据库连接 、 停止后台线程 、
把Cookie列表或者计数器写到磁盘 、 其他清理工作
调用结束后,servlet对象被标记为垃圾回收;
(2)destroy()方法定义:
public void destroy(){
//终止化代码……
}
-
架构图
(1)Servlet的生命周期方案:
①第一个到达web服务器的HTTP请求被委派到Servlet容器(web服务器区别于
Servlet容器,请求时从web服务器被送到servlet容器中的);Servlet容器收到请求后调
用init()方法加载一个Servlet对象;Servlet对象调用service()服务;
②接下来,服务器将多个请求发送到servlet容器,容器为每个请求一个线程,每个
线程执行一个单一的Servlet实例的service()方法;(service()方法中看情况调用doGet()
doPost() doPut() doDelete()方法)
③当生命周期结束前,调用destroy()方法停止生命周期,做数据库关闭、后台服务
关闭、清理等工作;
(2)架构图: