Servlet 之超详解【2023年最新版】(一)

简介: Servlet 之超详解【2023年最新版】(一)

编译软件:IntelliJ IDEA 2019.2.4 x64

操作系统:win10 x64 位 家庭版

服务器软件:apache-tomcat-8.5.27


一. 什么是Servlet?

Servlet,英文全称为Server Applet,意为服务器端的一小程序。它运行在支持Java Servlet规范的Web服务器上。在服务器上部署的众多web应用程序中,无论它是B/S架构,还是C/S架构,它们的基本运行模式如下图所示(以Java程序为例):

如果把上述web应用的运行模式比作是一个正在在营业的餐厅,那Servlet在其中扮演着服务员的角色,客人进店吃饭(客户端发出请求),它负责给客人上菜单,等客人点好菜单,servlet就会通知厨子(web应用)做菜(处理业务),厨子做好菜,就让服务员去上菜(响应)给客人。

总的来说,Servlet就是和客户端进行交互(处理请求和响应)

Servlet通常被用于创建像电子商务网站、社交媒体应用、在线银行网站等类似的Web应用程序。通过使用Servlet,开发人员可以以一种可移植、灵活、高效和可重用的方式构建Web应用程序。


二. 如何编写第一个servlet程序?

步骤:

①创建一个html页面,在上面创建一个超链接(计划访问后台的HelloServlet)

<a href="">访问HelloServlet</a>

②创建HelloServlet

  1. 新建一个普通类HelloServelet
  2. HelloServelet实现接口Servlet
  3. 实现接口中的所有抽象方法

代码演示如下:

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class HelloServelet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /**
     * 主要功能:处理客户端的请求和响应
     * @param servletRequest  处理请求
     * @param servletResponse  处理响应
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("访问了HelloServlet类的service方法.......");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}
  1. 在web.xml中为HelloServlet设置访问路径

代码演示如下:

<!--  HelloServlet的访问路径:/hello  -->
<servlet>
    <!--   为Servlet起个名字     -->
    <servlet-name>abc</servlet-name>
    <!--   Servlet的全类名     -->
    <servlet-class>t1.HelloServelet</servlet-class>
</servlet>
<servlet-mapping>
    <!--  要和Servlet中的servlet-name的名字一致      -->
    <servlet-name>abc</servlet-name>
    <!--   设置访问路径,注意,必须是/开头     -->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

③将设置到的访问路径设置给超链接

<a href="hello">访问HelloServlet</a>

④测试HelloServelt

注意:

  1. 网页必须直接在web下(不能放在WEB-INF下)
  2. web.xml中url-pattern的值必须以/开头
  3. 网页的请求路径,不能以/开头
  4. 网页不能采用静态的打开方式

请求原理如下所示:

Servlet的对象管理:

  • Servlet的实例对象由Servlet容器(tomcat)负责创建
  • Servlet的方法由容器在特定情况下调用
  • Servlet容器会在web应用卸载时(tomcat停止)销毁Servlet对象的实例

三. Servlet的生命周期

Servlet接口中一共有五个方法,其中有三个和生命周期有(init/service/destroy)的方法。

请求过程:

  1. 默认情况下在第一次发出请求时,Servlet容器(tomcat服务器)会创建相应的servlet对象、进行初始化(执行init方法)、执行service方法
  2. 第二次以及以后的每一次请求发出,都直接执行service方法
  3. 在web应用被卸载(服务器被停止时)的时候,servlet对象会被销毁,销毁之前执行destroy方法

Servlet可以在启动服务器时就创建其对象吗?

可以

方法如下:

在web-xml中当前Servlet的servlet标签内添加标签

//设置自启动
<load-on-startup>l</1oad-on-startup>

代码演示如下:

<!--   设置自启动,若有多个servlet都设了自启动,根据标签体中的值来判定启动优先级,值越小,优先级越高     -->
<!--     <load-on-startup></load-on-startup>中的标签体为非0的整数     -->
        <load-on-startup>1</load-on-startup>

四. Servlet的技术体系

创建Servlet的三种方式:

①实现Servlet接口

重写其五个方法(重点关注的只有一个service),其他四个还必须重写

案例:创建HelloServelet 类实现Servlet 接口

代码演示如下:

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class HelloServelet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /**
     * 主要功能:处理客户端的请求和响应
     * @param servletRequest  处理请求
     * @param servletResponse  处理响应
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("访问了HelloServlet类的service方法.......");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

web-xml创建其访问路径:

<!--  HelloServlet的访问路径:/hello  -->
<servlet>
    <!--   为Servlet起个名字     -->
    <servlet-name>abc</servlet-name>
    <!--   Servlet的全类名     -->
    <servlet-class>t1.HelloServelet</servlet-class>
</servlet>
<servlet-mapping>
    <!--  要和Servlet中的servlet-name的名字一致      -->
    <servlet-name>abc</servlet-name>
    <!--   设置访问路径,注意,必须是/开头     -->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

②继承GenericServlet

步骤:

  1. 创建一个类
  2. 继承一个抽象类(GenericServlet)
  3. 实现抽象类中的抽象方法
  4. 在web-xml中配置Servlet的访问路径

注意:

GenericServlet主要的功能是将service以外的四个方法做了实现。我们自己的Servlet只需要实现service方法即可,如果想用其他的四个方法,可以采用重写。

案例:创建MyFirstServlet类继承GenericServlet类

代码演示如下:

public class MyFirstServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("触发了继承GenericServlet类的子类MyFirstServlet类的service方法......");
    }
}

web-xm配置其访问路径:

<!-- 设置访问MyFirstServlet的路径:/myfirst   -->
    <servlet>
        <servlet-name>def</servlet-name>
        <servlet-class>t1.MyFirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>def</servlet-name>
        <url-pattern>/myfirst</url-pattern>
    </servlet-mapping>

③继承HttpServlet

步骤:

  1. 创建一个类
  2. 继承一个抽象类(HttpServlet)
  3. 重写两个方法doGet和doPost
  4. 配置Servlet的访问路径

注意:

HttpServlet主要功能是实现service方法,然后对请求进行分发的操作(不同的请求方式调用不同的方法)。get请求调用doGet方法post请求调用doPost方法

案例:创建MyFirstServlet类继承GenericServlet类

代码演示如下:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SecondServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("访问了SecondServlet里的doPost方法");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("访问了SecondServlet里的doGet方法");
    }
}

web-xm配置其访问路径:

<!-- 设置访问SecondServlet的路径:/second   -->
    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>t1.SecondServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/second</url-pattern>
    </servlet-mapping>


五. web项目中的两个接口

5.1 Servletconfig接口

一个Servlet对象对应唯一的一个ServletConfigi配置对象

Servletconfig对象如何获得?

在init方法的形参位置,Servletconfig是在当前Servlet进行初始化的时候,传递给init方法的

主要功能:

  1. 获取Servlet名称(web.xml中servlet-name的值)
//获取Servlet名称
   String servletName = servletConfig.getServletName();
   System.out.println("servletName:"+servletName);
  1. 获取全局上下文(ServletContext)对象
//获取全局上下文对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println("servletContext:"+servletContext);
  1. 获取Servlet初始化参数

获取Servlet初始化参数的前提是要有servlet的初始化参数

  1. 如何设置servlet的初始化参数?
    位置:web.xml的servlet标签内,在子标签1–>之上设置,不然报错
    代码演示如下:
<!--设置当前Servlet的初始化参数-->
     <init-param>
     <param-name>path</param-name>
     <param-value>classpath:springmvc.xml</param-value>
     </init-param>
  1. 获取Servlet初始化参数:
//获取web-xml中的servlet标签内的初始化参数<param-name>为path的value值
     String path = servletConfig.getInitParameter("path");
     System.out.println("path:"+path);
     //获取HelloServelet内所有初始化参数的<param-name>【key】值
     Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
     while (initParameterNames.hasMoreElements()){
           System.out.println("initParameterNames.nextElement():"+initParameterNames.nextElement());
     }

案例:在HelloServelet类实现上述功能

代码演示如下:

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class HelloServelet implements Servlet {
    public HelloServelet() {
        System.out.println("HelloServelet类的构造方法被执行了");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("HelloServelet类的init方法被执行了");
        //1.获取的是当前Servlet名称(web.xml中配置servlet-name的值)
        String servletName = servletConfig.getServletName();
        System.out.println("servletName:"+servletName);
        //2.获取全局上下文ServletContext对象
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("servletContext:"+servletContext);
        //3.获取Servlet初始化参数
        //获取web-xml中的servlet标签内的初始化参数<param-name>为path的value值
        String path = servletConfig.getInitParameter("path");
        System.out.println("path:"+path);
        //获取web-xml中的初始化参数<param-name>为aaa的value值
        String aaa = servletConfig.getInitParameter("aaa");
        System.out.println("aaa:"+aaa);
        //获取HelloServelet内所有初始化参数的<param-name>【key】值
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            System.out.println("initParameterNames.nextElement():"+initParameterNames.nextElement());
        }
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /**
     * 主要功能:处理客户端的请求和响应
     * @param servletRequest  处理请求
     * @param servletResponse  处理响应
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("访问了HelloServlet类的service方法.......");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
        System.out.println("HelloServelet类的destroy方法被执行了");
    }
}

目录
打赏
0
0
0
0
4
分享
相关文章
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
如何绕过Captcha并使用OCR技术抓取数据
在现代网页数据抓取中,Captcha作为一种防止爬虫和恶意访问的措施,广泛应用于各种网站。本文介绍如何使用OCR技术绕过文字Captcha,并通过代理IP技术提高爬虫的隐蔽性。具体实现包括下载Captcha图片、使用Tesseract OCR识别文字、通过代理IP抓取目标数据。示例代码展示了如何抓取大众点评的商家信息。
304 0
如何绕过Captcha并使用OCR技术抓取数据
一文详解Servlet 看这篇就够了
首先,对我们编程者来说,Servlet就是我们写出来的Java类,只是我们需要按照Servlet规定的规范写。
1791 1
zookeeper的环境搭建和配置
本文介绍了如何在多台节点上搭建和配置Zookeeper环境。内容包括Zookeeper的下载、解压、环境变量配置、配置文件修改、zkdata目录创建、myid文件设置,以及将Zookeeper及其配置文件复制到其他节点。还提供了运行测试的命令,包括启动、状态检查和停止Zookeeper服务。
zookeeper的环境搭建和配置
深入解析高斯过程:数学理论、重要概念和直观可视化全解
这篇文章探讨了高斯过程作为解决小数据问题的工具,介绍了多元高斯分布的基础和其边缘及条件分布的性质。文章通过线性回归与维度诅咒的问题引出高斯过程,展示如何使用高斯过程克服参数爆炸的问题。作者通过数学公式和可视化解释了高斯过程的理论,并使用Python的GPy库展示了在一维和多维数据上的高斯过程回归应用。高斯过程在数据稀疏时提供了一种有效的方法,但计算成本限制了其在大数据集上的应用。
696 1
使用Python生成图片验证码
本文介绍了如何使用Python的PIL库生成简单的验证码图片和文本。通过实现CaptchaGenerator类,我们可以轻松生成包含随机字符和干扰元素的验证码。这种技术可以应用于Web应用程序中,用于增强用户验证的安全性和可靠性。
ClickHouse(22)ClickHouse集成HDFS表引擎详细解析
ClickHouse的HDFS引擎允许直接在Hadoop生态系统内管理数据。使用`ENGINE=HDFS(URI, format)`,其中URI指定HDFS路径,format定义文件格式(如TSV、CSV或ORC)。表可读写,但不支持`ALTER`、`SELECT...SAMPLE`、索引和复制操作。通配符可用于文件路径,如`*`、`?`和范围`{N..M}`。Kerberos认证可配置。虚拟列包括文件路径 `_path` 和文件名 `_file`。有关更多信息,参见相关文章系列。
321 0
【PolarDB 开源】PolarDB 数据备份与恢复策略:确保数据安全的最后一道防线
【5月更文挑战第28天】PolarDB 开源数据安全的关键:备份与恢复策略。定期备份(全量+增量)降低数据丢失风险,制定策略考虑多种因素。确保备份存储安全,测试恢复流程有效性,结合监控系统及时处理问题。保留多版本备份,应对灾难情况有预案。培训人员,提高数据安全意识,打造稳固防线。
333 0
Java的接口、类、属性、方法的修饰符使用总结
Java的接口、类、属性、方法的修饰符使用总结
608 0
【Servlet】超详细开发步骤|在idea上配置Tomcat|网页显示当前系统时间(上)
【Servlet】超详细开发步骤|在idea上配置Tomcat|网页显示当前系统时间
541 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问