JavaWeb中Servlet的使用

什么是Servlet ?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

参考网站:https://www.runoob.com/servlet/servlet-tutorial.html。

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>的值为负数,默认为-12.服务器启动时创建:<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协议的一种封装,简化操作。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值