Servlet

概述

Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一。我们可以像学习Java基础一样,通过API来学习Servlet。这里需要注意的是,在我们之前JDK的API中是没有Servlet规范的相关内容,需要使用JavaEE的API。目前在Oracle官网中的最新版本是JavaEE8,该网址中介绍了JavaEE8的一些新特性。当然,我们可以通过访问官方API,学习和查阅里面的内容。

打开官方API网址,在左上部分找到javax.servlet包,在左下部分找到Servlet,如下图显示:

第一:Servlet是一个运行在web服务端的java小程序

第二:它可以用于接收响应客户端的请求

第三:要想实现Servlet功能,有3种方式!可以实现Servlet接口,继承GenericServlet或者HttpServlet

第四:每次请求都会执行service方法

第五:Servlet还支持配置

Servlet接口官方介绍

其中比较重要的是它的处理流程 

  1. Servlet示例化后,当初始化时,就会调用init方法

  2. 任何客户端请求都由service方法处理

  3. Servlet从服务中移除,当销毁时调用destroy方法,最终由垃圾回收器回收。

Servlet图解

(1)继承GenericServlet的方式

第一步:前期准备-创建JavaWeb工程

第二步:编写一个普通类继承GenericServlet并重写service方法

第三步:在web.xml配置Servlet

我们先创建一个JavaEE项目,选择Java8,把Web Application勾选上。

骨架如下: 

 

然后我们要修改修改一下ServletDemo01web.xml

ServletDemo01.java

package com.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class ServletDemo01 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet执行了!!!");
    }
}

web.xml 

<?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_4_0.xsd"
         version="4.0">
    <!--  -->
    <servlet>
        <servlet-name>ServletDemo01</servlet-name>
        <servlet-class>com.servlet.ServletDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletDemo01</servlet-name>
        <url-pattern>/ServletDemo01</url-pattern>
    </servlet-mapping>
    
</web-app>

然后点击run -> 选择edit configurations,看看war包有没有发布成功,以及是不是该项目的war包!

 

然后启动即可。

按照上面的配置在浏览器输入

 

在idea中Servlet的service方法就以及被调用了!

浏览器每刷新一次,就调用一次! 

实现Servlet接口继承GenericServlet有什么区别?

如下所示,这是GenericServlet类的方法,注意其中只有一个抽象方法,就是service方法,也就是上述案例重写的方法(继承的时候,抽象方法就一定要被重写!)

在Servlet接口中,是有5个抽象方法,显然GenericServlet类中已经“帮”我们重写了其他的抽象方法,简化了我们的开发!

Serlvet的执行流程

注意:下图中的servlet_demo01项目名称,也就是指上述的JavaWeb_Servlet

Servlet关系视图

Servlet实现方式

第一种:实现Servlet接口,接口中的方法必须全部实现。

使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。

第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。

使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的。

第三种:继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。

使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST,而实际HTTP协议支持7种请求方式,GET POST PUT DELETE TRACE OPTIONS HEAD )。

(2)继承HttpServlet的方式

  1.  创建一个类继承HttpServlet
  2. 重写doGet和doPost方法
  3. 在web.xml中配置Servlet
  4. 部署并启动项目
  5. 通过浏览器测试
package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("方法执行了");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
<?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_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>ServletDemo02</servlet-name>
        <servlet-class>com.servlet.ServletDemo02</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ServletDemo02</servlet-name>
        <url-pattern>/ServletDemo02</url-pattern>
    </servlet-mapping>
    
</web-app>

通过浏览器访问 

HttpServlet总结

我们继承了HttpServlet,需要重写里面的doGet和doPost方法来接收get方式和post方式的请求。

为了实现代码的可重用性,我们只需要在doGet或者doPost方法中一个里面提供具体功能即可,而另外的那个方法只需要调用提供了功能的方法。

Servlet的生命周期

对象的生命周期,就是对象从生到死的过程,即:出生——活着——死亡。用更偏向 于开发的官方说法就是对象创建销毁的过程。

出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功。只出生一次,就放到内存中。

活着:服务器提供服务的整个过程中,该对象一直存在,每次请求,就执行service方法。

死亡:当服务停止时,或者服务器宕机时,对象消亡。

通过分析Servlet的生命周期我们发现,它的实例化和初始化只会在请求第一次到达Servlet时执行,而销毁只会在Tomcat服务器停止时执行,由此我们得出一个结论,Servlet对象只会创建一次,销毁一次。所以,Servlet对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就说它是单实例的,即运用了单例模式。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐