目录
Servlet 概念
它是一个在 Web 服务器上的 JVM 内运行的 java 程序。它用于开发动态 Web 应用。
CGI 是进程模型 ,Servlet 线程模型 更轻量
Servlet API
java.lang.Object
|_extended byjavax.servlet.GenericServlet
|_extended byjavax.servlet.http.HttpServlet
有 3 种方法来创建一个 servlet:
1)通过扩展HttpServlet
类
2)通过扩展GenericServlet
类
3)通过实现Servlet
接口
javax.servlet 中的API
原理
生命周期
Servlet 生命周期包含五个步骤:1)加载 Servlet,2)创建 Servlet 实例,3)调用init()
一次,4)为每个客户端请求重复调用service()
,5)调用destroy()
步骤 1:加载 Servlet
当 Web 服务器(例如 Apache Tomcat)启动时,servlet 容器部署并加载所有 servlet。
步骤 2:创建 Servlet 实例
一旦加载了所有 Servlet 类,servlet 容器就会创建每个 servlet 类的实例。 Servlet 容器每个 servlet 类只创建一个实例,并且对 servlet 的所有请求都在同一个 servlet 实例上执行。
步骤 3:调用init()
方法
一旦实例化了所有 servlet 类,就会为每个实例化的 servlet 调用init()
方法。此方法初始化 servlet。您可以在部署描述符(web.xml
)文件中指定某些init
参数。例如,如果 servlet 的值>= 0
,则在 Web 容器启动期间立即调用其init()
方法。
您可以在web.xml
文件中指定元素,如下所示:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.beginnersbook.MyServletDemo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
现在,在 Web 容器启动期间将调用相应 servlet 类com.beginnersbook.MyServletDemo
的 init()
方法。
注意:init()方法在 servlet 的生命周期中只调用一次。
步骤 4:调用service()
方法
每次 Web 服务器收到 servlet 请求时,它都会产生一个调用service()
方法的新线程。如果 servlet 是GenericServlet
,那么请求由service()
方法本身提供,如果 servlet 是HttpServlet
,则service()
方法接收请求并根据请求的类型将其分派给正确的处理程序方法。
例如,如果它是Get
请求,则service()
方法会通过使用请求参数调用doGet()
方法将请求分派给doGet()
方法。类似地,诸如Post
,Head
,Put
等的请求被 servlet 的service()
方法分派给相应的处理程序doPost()
,doHead()
,doPut()
等。
注意:与只调用一次的
init()
和destroy()
不同,在 servlet 生命周期中可以多次调用service()
方法。只要不销毁 servlet,就会为每个客户端请求调用service()
方法。
在生命周期的所有 5 个步骤中,这是多次执行的唯一步骤。
步骤 5:调用destroy()
方法
当 servlet 容器关闭时(这通常在我们停止 Web 服务器时发生),它卸载所有 servlet 并为每个初始化的 servlet 调用destroy()
方法。
工作原理
1)当 Web 服务器(例如 Apache Tomcat)启动时,servlet 容器部署并加载所有 servlet。在此步骤中,Servlet 容器创建ServletContext
对象。ServletContex
是一个接口,它定义了可以用来与 servlet 容器通信的方法集。
注:每个 webapp 只有一个
ServletContext
,这对所有 servlet 都是通用的。ServletContext
有几个有用的方法,如addListener()
,addFilter()
等。现在我不解释它们,因为我将在一个关于ServletContext
的单独文本中介绍它们。
2)一旦加载了 servlet,servlet 容器就会创建 servlet 类的实例。对于每个实例化的 servlet,调用其init()
方法。
3)客户端(用户浏览器)向某个端口上的 Web 服务器发送 Http 请求。每次 Web 服务器收到请求时,servlet 容器都会创建HttpServletRequest
和HttpServletResponse
对象。HttpServletRequest
对象提供对请求信息的访问,HttpServletResponse
对象允许我们在将 http 响应发送到客户端之前对其进行格式化和更改。
servlet 容器生成一个新线程,该线程为每个客户端请求调用service()
方法。service()
方法根据请求类型将请求调度到正确的处理程序方法。
例如,如果服务器收到Get
请求,则service()
方法会通过使用请求参数调用doGet()
方法将请求分派给doGet()
方法。类似地,诸如Post
,Head
,Put
等的请求被 servlet 的service()
方法分派给相应的处理程序doPost()
,doHead()
,doPut()
等。
4)当 servlet 容器关闭时,它会卸载所有 servlet 并为每个初始化的 servlet 调用destroy()
方法
配置
# Java EE: XML Schemas for Java EE Deployment Descriptors
## welcome-file-list
自定义的欢迎页面文件, 默认index.html(htm 、jsp)
## load-on-startup
启动时是否加载 >=0 的会在启动时加载, 默认懒加载(请求过来时再加载)
## ServletRequest 接口
## RequestDispatcher 方法
forword(): 对客户的最终回复在下一页
include(): 对客户的最终回复还在当前页
## ServletConfig 接口
每个Servlet一个 对应<init-param>
## ServletContext 接口
全局容器创建一个 对应<context-param>
## ServletResponse 接口
## HttpSession
## Cookie
## HttpServletMapping
## Servlet 分页
## Servlet Weld
带有Weld 的 依赖注入
## Servlet 上传文件
multipart/form-data
## 服务 XML
## foreach 标签
## jsGrid 组件
json
## Servlet JSON 使用
## Servlet Http 标头
## Servlet 复选框
## Servlet 发送图像
## Servlet JQuery 列表
## Servlet FreeMarker JdbcTemplate
## JQuery 自动补全
## Servlet PDF
itext
## Servlet WAR 内读取CSV文件
opencsv
## EasyUI datagrid
easy-ui
## Servlet Restful 客户端
## Servlet Log4j
## Servlet 图表
jfreechart
## Servlet 读取网页
commons-validator
## 嵌入式Tomcat