ServletConfig和ServletContext 的介绍和代码实现

目录

ServletConfig

ServletConfig 基本介绍

ServletConfig 类能干什么

为什么需要 ServletContext

1. 方案 1-DB

2. 方案 2-ServletCntext

代码实战

ServletContext

ServletContext 基本介绍

ServletContext 可以做什么

代码实战

代码实战2


ServletConfig

ServletConfig 基本介绍

ServletConfig 类是为 Servlet 程序的配置信息的类

Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建

Servlet 程序默认是第 1 次访问的时候创建,ServletConfig 在 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象

ServletConfig 类能干什么

获取 Servlet 程序的 servlet-name 的值

获取初始化参数 init-param

获取 ServletContext 对象

为什么需要 ServletContext

先看一个需求:如果我们希望统计某个 web 应用的所有 Servlet 被访问的次数,怎么办?

1. 方案 1-DB

2. 方案 2-ServletCntext

 

代码实战

● 需求: 编写 DBServlet.java 完成如下功能
1. 在 web.xml 配置连接 mysql 的用户名和密码
2. 在 DBServlet 执行 doGet()/doPost() 时,可以获取到 web.xml 配置的用户名和密

public class DBServlet extends HttpServlet {


    /**
     * 梳理ServletConfig config 使用流程
     * 1. 当DBServlet对象初始化时, tomcat会同时创建一个 ServletConfig对象
     * 2. 这时如果DBServlet init() 方法中你调用 super.init(config);
     * 3. 调用 父类 GenericServlet
     * public void init(ServletConfig config) throws ServletException {
     * this.config = config;
     * this.init();
     * }
     * 这时就会把 Tomcat创建的 ServletConfig对象赋给 GenericServlet的属性 config
     * 4. 因此如果你重写init()方法,记住如果你想在其它方法通过 getServletConfig() 方法获取ServletConfig
     * , 则一定要记住 调用  super.init(config);
     * @param config
     * @throws ServletException
     */

    @Override
    public void init(ServletConfig config) throws ServletException {
        //ConcurrentHashMap, 是一个线程安全的容器.
        System.out.println("init" + config);
        super.init(config);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //在DBServlet 执行 doGet()/doPost() 时,可以获取到web.xml配置的用户名和密码
 
        //DBServlet的父类GenericServlet有getServletConfig()
        /**
         * 解读
         * 1. getServletConfig() 方法是 GenericServlet
         * 2. 返回的 servletConfig对象是 GenericServlet private transient ServletConfig config;
         * 3. 当一个属性被 transient 修饰,表示该属性不会被串行化(有些重要信息,不希望保存到文件)
         */
        ServletConfig servletConfig = getServletConfig();
        System.out.println("doPost=" + servletConfig);
        String username = servletConfig.getInitParameter("username");
        String pwd = servletConfig.getInitParameter("pwd");
        System.out.println("初始化参数username= " + username);
        System.out.println("初始化参数pwd= " + pwd);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

 xml配置

 <!--配置DBServlet-->
    <servlet>
        <servlet-name>DBServlet</servlet-name>
        <servlet-class>com.servlet.DBServlet</servlet-class>
        <!--配置信息,而不是硬编码到程序-->
        <init-param>
            <param-name>username</param-name>
            <param-value>xxx</param-value>
        </init-param>
        <init-param>
            <param-name>pwd</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>DBServlet</servlet-name>
        <url-pattern>/db</url-pattern>
    </servlet-mapping>

ServletContext

ServletContext 基本介绍

1. ServletContext 是一个接口,它表示 Servlet 上下文对象

2. 一个 web 工程,只有一个 ServletContext 对象实例

3. ServletContext 对象 是在 web 工程启动的时候创建,在 web 工程停止的时销毁

4. ServletContext 对象可以通过 ServletConfig.getServletContext 方法获得对 ServletContext对象的引用,也可以通过 this.getServletContext()来获得其对象的引用。

5. 由于一个 WEB 应用中的所有 Servlet 共享同一个 ServletContext 对象,因此 Servlet 对象之间可以通过 ServletContext 对象来实现多个 Servlet 间通讯。ServletContext 对象通常也被称之为域对象。【示意图】

ServletContext 可以做什么

1. 获取 web.xml 中配置的上下文参数 context-param [信息和整个 web 应用相关,而不是属于某个 Servlet]

2. 获取当前的工程路径,格式: /工程路径 =》 比如 /servlet

3. 获取工程部署后在服务器硬盘上的绝对路径如D:\xx\xx\xx\xx

4. 像 Map 一样存取数据多个 Servlet 共享数据

代码实战

● 需求如下:

1. 获取 web.xml 中配置的上下文参数 context-param

2. 获取当前的工程路径,格式: /工程路径

3. 获取工程部署后在服务器硬盘上的绝对路径

public class ServletContext_ extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取web.xml的context-parameter

        //1.获取到ServletContext对象
        ServletContext servletContext = getServletContext();
        //2. 获取website
        String website = servletContext.getInitParameter("website");
        String company = servletContext.getInitParameter("company");
        //3. 获取项目的工程路径
        String contextPath = servletContext.getContextPath();
        //4. 获取项目发布会,正在的工作路径
        //   /表示我们的项目(发布后)的 根路径
        String realPath = servletContext.getRealPath("/");
        System.out.println("项目路径= " + contextPath);// /servlet
        System.out.println("website= " + website);
        System.out.println("company= " + company);
        System.out.println("项目发布后的绝对路径= " + realPath);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

代码实战2

网站访问次数计数器

创建PayServlet

public class PayServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取到ServletContext对象
        ServletContext servletContext = getServletContext();
        // System.out.println("PayServlet servletContext= " +
        //         servletContext + " 运行类型=" + servletContext.getClass());
        //
        // //从servletContext获取 visit_count 属性 k-v
        // Object visit_count = servletContext.getAttribute("visit_count");
        // //判断visit_count是否为null
        // if (visit_count == null) {//说明是第1次访问网站
        //     servletContext.setAttribute("visit_count", 1);
        //     visit_count = 1;
        // } else { //是第二次或以后
        //     //取出visit_count属性的值+1
        //     visit_count = Integer.parseInt(visit_count + "") + 1;
        //     //放回到servletContext
        //     servletContext.setAttribute("visit_count", visit_count);
        // }
        Integer visit_count = WebUtils.visitCount(servletContext);
        //输出显示
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>新网站被访问的次数是" + visit_count + "</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

创建OrderServlet

public class OrderServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取到ServletContext对象
        ServletContext servletContext = getServletContext();
        // System.out.println("OrderServlet servletContext= " +
        //         servletContext + " 运行类型=" + servletContext.getClass());

        // //从servletContext获取 visit_count 属性 k-v
        // Object visit_count = servletContext.getAttribute("visit_count");
        // //判断visit_count是否为null
        // if (visit_count == null) {//说明是第1次访问网站
        //     servletContext.setAttribute("visit_count", 1);
        //     visit_count = 1;
        // } else { //二次或以后
        //     //取出visit_count属性的值+1
        //     visit_count = Integer.parseInt(visit_count + "") + 1;
        //     //放回到servletContext
        //     servletContext.setAttribute("visit_count", visit_count);
        // }

        Integer visit_count = WebUtils.visitCount(servletContext);

        //输出显示
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>新网站被访问的次数是" + visit_count + "</h1>");
        writer.flush();
        writer.close();


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

创建WebUtils

public class WebUtils {

    //这个方法就是对访问的次数累积,同时返回次数
    public static Integer visitCount(ServletContext servletContext) {
        //从servletContext获取 visit_count 属性 k-v
        Object visit_count = servletContext.getAttribute("visit_count");
        //判断visit_count是否为null
        if (visit_count == null) {//说明是第1次访问网站
            servletContext.setAttribute("visit_count", 1);
            visit_count = 1;
        } else { //二次或以后
            //取出visit_count属性的值+1
            visit_count = Integer.parseInt(visit_count + "") + 1;
            //放回到servletContext
            servletContext.setAttribute("visit_count", visit_count);
        }

        return Integer.parseInt(visit_count + "");
    }
}

在web.xml 中配置两个 servle

 <servlet>
        <servlet-name>OrderServlet</servlet-name>
        <servlet-class>com.servlet.servletcontext.OrderServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>OrderServlet</servlet-name>
        <url-pattern>/orderServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>PayServlet</servlet-name>
        <servlet-class>com.servlet.servletcontext.PayServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>PayServlet</servlet-name>
        <url-pattern>/payServlet</url-pattern>
    </servlet-mapping>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/13107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot单元测试断言 assertions

断言 断言&#xff08;assertions&#xff09;是测试方法中的核心部分&#xff0c;用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别&#xff1a; 1、简单断言 2、数组断言 通过 …

原来情感可以这样影响用户体验设计

&#x1f525;情绪的基本情况 Emotion&#xff1a;即刻的生理反应&#xff0c; Feeling&#xff1a;物理的或者心理上的&#xff0c;是emotion经过思考后的 Mood&#xff1a;持续时间更长&#xff0c;是一种状态&#xff0c;受到很多因素影响&#xff08;天气、睡眠&#x…

OpenCV算法加速的一些学习总结

一、概述 算法加速在实际软件层面应用来说 大数据和复杂计算的过程中 算法优化&#xff0c;指降低算法计算复杂度&#xff0c;设计新算法快速求解&#xff0c;比如Hungarian匹配算法。或牺牲一些内存&#xff0c;预计算一些重复计算的过程&#xff0c;减少程序层面的复杂度。 …

微软文字转语音不能试用了,分享三个方法给大家!

最近很多小伙伴告诉我&#xff0c;微软文字转语音不能在线试用了&#xff0c;这是因为微软关闭了官方的使用页面&#xff0c;所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢&#xff1f; 答案是肯定的&#xf…

MTU 网卡bond 简介

MTU 最大传输单元MTU&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;&#xff0c;是指网络能够传输的最大数据包大小&#xff0c;以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值&#xff0c;或者…

被裁后找不到工作,本质上是因为原来的能力就配不上高薪,如果技术好,根本不怕被裁,相当于白送n+1!...

被裁员后&#xff0c;能要求公司补缴公积金吗&#xff1f; 一位网友问&#xff1a; 被裁员了&#xff0c;要求公司把历史公积金全部足额缴纳&#xff0c;现在月薪2.3万&#xff0c;但公司每个月只给自己缴纳300元公积金&#xff0c;结果一次补了二十多万&#xff0c;一次性取出…

Linux工具——yum和vim

目录 &#x1f34f;Linux软件包管理器-yum&#x1f34e;yum简介&#x1f34e;rzsz工具&#x1f34e;注意事项&#x1f34e;软件包查看&#x1f34e;如何安装和卸载软件 &#x1f34f;Linux编辑器-vim&#x1f34e;vim的基本概念&#x1f34e;vim的基本操作&#x1f34e;vim正常…

Linux基础——FTP原理与配置

Linux基础——FTP原理与配置 一、文件传输协议——FTP服务二、ftp配置文件解析三、FTP服务器搭建 一、文件传输协议——FTP服务 FTP是典型的C/S结构的应用层协议&#xff0c;需要由服务器软件、客户端软件两个部分共同实现文件传输功能 FTP 连接模式 FTP服务器默认使用TCP协议…

盖子的c++小课堂——第十七讲:递归

前言 通知一下&#xff0c;以后每周不定期更新&#xff0c;有可能是周六更新&#xff0c;也可能是周日吧&#xff0c;反正会更新的~~还有我新出的专栏《跟着盖子读论语》&#xff0c;记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…

中国版ChatGPT来了!快跟我一起申请文心一言吧

随着ChatGPT的快速进化吸引了全球网友的眼球 国内厂商也纷纷推出了相似的产品 其中百度推出的“文心一言”已经正式开始的相关的测试 很多人都在问 文心一言入口在哪&#xff1f; 文心一言邀请码在哪可以领&#xff1f; 文心一言怎么申请内测&#xff1f; 自从文心一言发…

计算机视觉——yolov5回归与跨网格预测、训练技巧(下篇)

yolov5 1. yolov5网络架构与组件1.1 网络可视化工具 netron1.2 不同模型的配置1.3 Focus 模块1.4 CSPNet 跨阶段局部网络1.5 SPP 空间金字塔池化1.6 PANet 路径聚合网络 2. 损失函数2.1 类别预测2.2 边界框回归2.3 回顾IoU2.4 IoU推广——GIoU loss2.5 IoU推广——DIoU loss2.6…

大四的告诫

&#x1f442; LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 &#x1f442; 喝了一口星光酒&#xff08;我只想爱爱爱爱你一万年&#xff09; - 木小雅 - 单曲 - 网易云音乐 其实不是很希望这篇文章火&#xff0c;不然就更卷了。。 从大一开始&#xff0c;每天10小时…

腾讯云轻量4核8G12M应用服务器带宽、月流量详细性能评测

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

Praat脚本-037 | 批量把标注TextGrid生成韵律文本

目录 引题方案一方案二方案三获取脚本关注版权说明 引题 Praat是一种非常出色、轻便、开源免费的标注工具&#xff0c;它的最主要用途是标注&#xff0c;即对语音信号中的一些特征、信息进行标注&#xff0c;保存为TextGrid文件&#xff0c;这个TextGrid文件实质 上就是一种文…

Harmony OS 开发指南——源码下载和编译

本文介绍了如何下载鸿蒙系统源码&#xff0c;如何一次性配置可以编译三个目标平台&#xff08;Hi3516&#xff0c;Hi3518和Hi3861&#xff09;的编译环境&#xff0c;以及如何将源码编译为三个目标平台的二进制文件。 坑点总结&#xff1a; 下载源码基本上没有太多坑&#xf…

Web前端-Vue2.0框架学习

Web前端-Vue框架学习 1. 前端工程化与Webpack1.1 隔行变色的demo实现1.2 webpack的基本使用1.3 webpac插件1.3.1 webpack-dev-server插件1.3.2 html-webpack-plugin 1.4 webpack中的loader&#xff08;加载器&#xff09;1.4.1 css-loader1.4.2 less-loader1.4.3 url-loader &a…

Node【Global全局对象】之【URL】

文章目录 &#x1f31f;前言&#x1f31f;URL&#x1f31f;URL组成部分&#x1f31f;URL 类&#x1f31f;url.href&#x1f31f;url.pathname&#x1f31f;url.port&#x1f31f;url.protocol&#x1f31f;url.search&#x1f31f;url.searchParams&#x1f31f;url.hash&#…

C语言模拟银行排队叫号(链队)

一.队列 队列是一种具有先进先出&#xff08;FIFO&#xff09;特性的线性数据结构&#xff0c;它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾&#xff08;rear&#xff09;&#xff0c;另一端称为队头&#xff08;front&#xff09;。新元素总是插入在队列的队…

C++进阶——二叉搜索树BST

C进阶——二叉搜索树BST 其实应该是二叉树内容的进阶版本&#xff1a; 二叉树在前面C数据结构阶段已经讲过&#xff0c;本节取名二叉树进阶是因为&#xff1a; map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构二叉搜索树的特性了解&#xff0c;有…

【路径规划】基于前向动态规划算法在地形上找到最佳路径(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…