什么是Servlet ?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
1.Servlet快速入门
(1)在JavaEE项目中,定义一个ServletDemo类且实现Servlet接口。
(2)在web.xml中配置Servlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置Servlet -->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>com.atlantis.web.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
(3)启动Tomcat。
2.Servlet执行原理
(1)当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
(2)查找web.xml文件,是否有对应的标签体内容。
(3)如果有,则在找到对应的全类名。
(4)tomcat会将字节码文件加载进内存,并且创建其对象。
(5)调用其方法。
3.Servlet生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
(1)Servlet 通过调用 init () 方法进行初始化。
(2)Servlet 调用 service() 方法来处理客户端的请求。
(3)Servlet 通过调用 destroy() 方法终止(结束)。
(4)最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
(1)init()方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init()方法的定义如下:
public void init() throws ServletException {
// 初始化代码,只执行一次
}
可以通过修改web.xml来配置Servlet的init()创建时机:
<!-- 配置Servlet -->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>com.atlantis.web.ServletDemo</servlet-class>
<!-- 指定Servlet的创建时机:
1.第一次被访问时创建:<load-on-startup>的值为负数,默认为-1。
2.服务器启动时创建:<load-on-startup>的值为0或正整数。 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet的init()方法只能执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
那么,多个用户同时访问时,可能存在线程安全问题。
解决方法:尽量不在Servlet中定义成员变量。即使定义成员变量,也不要对其进行赋值操作。
(2)service()方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
下面是该方法的特征:
public void service(ServletRequest servletRequest,
ServletResponse servletResponse)
throws ServletException, IOException {
// 提供服务的方法,可执行多次
}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
(3)destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。即该方法是在服务器正常关闭时,才会执行。服务器强制关闭时不会执行。
destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动,一般用于释放资源。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。
destroy 方法定义如下所示:
public void destroy() {
// 终止化代码...
}
4.Servlet3.0注解配置
为了解决在web.xml中多次配置Servlet繁琐操作,出现了Servlet3.0注解配置方法。
通过注解配置来简化web.xml中需多次配置Servlet繁琐操作。
使用步骤:
(1)在创建JavaEE项目时,选择Servlet版本3.0以上。
(2)定义一个ServletDemo类且实现Servlet接口。
(3)在类上使用@WebServlet注解进行Servlet配置。
@WebServlet(urlPatterns="/web")
//@WebServlet(value="/web")
//@WebServlet("/web")
//以上3种均可。
//@WebServlet({"/web","/WEB"}) //可配置多个路径,均指向此Servlet
public class ServletDemo implements Servlet {
...
}
5.实现Servlet接口的两个抽象类
通过上面的案例可以知道,使用ServletDemo类时必须实现Servlet接口。但实现Servlet接口后,我们发现很多复写方法我们不需要。又因为是实现接口的原因,这些“不需要”的方法又不能删除。
所以出现了GenericServlet和HTTPServlet这两个抽象方法,而我们只需要根据需要去选择继承这两个抽象方法即可。
注意: GenericServlet实现了Servlet接口,而HTTPServlet继承了GenericServlet。
(1)GenericServlet
GenericServlet将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。
(2)HTTPServlet【推荐使用】
HTTPServlet是对http协议的一种封装,简化操作。
转载:https://blog.csdn.net/q961250375/article/details/102547955