• Servlet


    1 Servket 介绍

    • Servlet 是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的请求
    • 如果想实现 Servlet 的功能,可以通过实现 javax.servlet.Servlet 接口或者继承它的实现类

    2 Servlet 快速入门

    1. 创建一个WEB 项目
    2. 创建一个类继承 GenericServlet
    3. 重写 service 方法
    package com.txt.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("service 方法执行了...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 在 web.xml 中配置 Servlet
    2. 部署并启动项目
    • 部署
        <servlet>
            <servlet-name>servletDemo01servlet-name>
            <servlet-class>com.txt.servlet.ServletDemo01servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletDemo01servlet-name>
            <url-pattern>/servletDemo01url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3 Servlet 执行过程

    在这里插入图片描述

    4 Servlet 关系视图

    在这里插入图片描述

    5 HttpServlet 快速入门

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

    6 Servlet 生命周期

    • 对象的生命周期,就是对象从出生到死亡的过程。官方说法就是对象创建到死亡的过程

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

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

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

    • 结论:Servlet 对象只会创建一次,销毁一次。索引 Servlet 对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式

    7 Servlet 线程安全问题

    • 由于 Servlet 采用的是单例模式,也就是整个应用中只有一个实例对象。所以我们需要分析这个唯一的实例对象中的类成员是否线程安全

    • 结论:Servlet 是线程不安全的

    • 解决:定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题,可以将其定义到 doGet 或 doPost 方法内或者使用同步功能即可

    8 Servlet 映射方式

    1. 第一种
      • 具体名称的方式。访问的资源路径必须和映射配置完全相同
    	<servlet>
            <servlet-name>servletDemo04servlet-name>
            <servlet-class>com.txt.servlet.ServletDemo04servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletDemo04servlet-name>
            <url-pattern>/servletDemo04url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 第二种
    • / 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么
    	<servlet>
            <servlet-name>servletDemo04servlet-name>
            <servlet-class>com.txt.servlet.ServletDemo04servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletDemo04servlet-name>
            <url-pattern>/servlet/*url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 第三种
    • 通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径
    	<servlet>
            <servlet-name>servletDemo04servlet-name>
            <servlet-class>com.txt.servlet.ServletDemo04servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletDemo04servlet-name>
            <url-pattern>*.dourl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第一种 > 第二种 > 第三种

    9 Servlet 多路径映射

    • 我们可以给一个 Servlet 配置多个访问映射,从而根据不同的请求路径来实现不同的功能
    • 场景分析:
      如果访问的路径是 /vip,商品价格打9折
      如果访问的路径是 /vvip,商品价格打5折
      如果访问的资源路径是其他,商品价格不打折
    • 代码演示
    1. 方法类
    package com.txt.servlet;
    
    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 ServletDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 定义一个商品金额
            int money = 1000;
    
            //2. 获取访问资源路径
            String path = req.getRequestURI();
            path = path.substring(path.lastIndexOf("/"));
    
            //3. 条件判断
            if ("/vip".equals(path)){
                System.out.println("商品原价为" + money + ",优惠后是:" + (money*0.9));
            }else if ("/vvip".equals(path)){
                System.out.println("商品原价为" + money + ",优惠后是:" + (money*0.5));
            }else {
                System.out.println("商品的价格为:" + money);
            }
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    1. 配置
        <servlet>
            <servlet-name>servletDemo05servlet-name>
            <servlet-class>com.txt.servlet.ServletDemo05servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletDemo05servlet-name>
            <url-pattern>/servlet/*url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 结果演示
      在这里插入图片描述

    10 Servlet 创建时机

    1. 第一次访问时创建
      • 优势:减少对服务器内存的浪费。提高了服务器启动的效率
      • 弊端:如果有一些要在应用加载时就做的初始化操作,无法完成
    2. 服务器加载时创建
      • 优势:提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作
      • 弊端:对服务器内存占用较多,影响服务器启动的效率
    • 修改 Servlet 创建时机。在 标签中,添加 标签
    • 正整数代表服务器加载时创建,值越小,优先级越高。负整数或者不写代表第一次访问时创建

    11 默认 Servlet

    • 默认 Servlet 是由服务器提供的一个Servlet。它配置在 Tomcat 的 conf 目录中的 web.xml 中
      在这里插入图片描述
    • 它的映射路径是 /,我们在发送请求时,首先会在我们项目中的 web.xml 中查找映射配置,找到则执行。但是当找不到对应的 Servlet 路径时,就去找默认的 Servlet 处理。所以,一切都是 Servlet。
  • 相关阅读:
    Haskell高阶函数(归并排序mergesort,map,filter)
    2022年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
    【原创】springboot+mysql企业智慧办公OA管理系统
    pytorch教程
    小学生python游戏编程arcade----单词对错检测及记录写入excel中
    GreaalVM编译springboot编译springboot
    XML Web 服务 Eclipse实现中的sun-jaxws.xml文件
    Ajax Fetch Axios三者区别
    批量Batch and 动量Momentum
    Celery笔记八之数据库操作定时任务
  • 原文地址:https://blog.csdn.net/m0_59620032/article/details/128020183