JAVAWeb06-动态WEB开发核心Servlet-02-ServletConfig/Context

news2024/11/16 5:34:34

1. ServletConfig

1.1 ServletConfig 基本介绍

  1. ServletConfig 类是为 Servlet 程序的配置信息的类
  2. Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建
  3. Servlet 程序默认是第 1 次访问的时候创建,ServletConfig 在 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象

1.2 ServletConfig 类能干什么

  1. 获取 Servlet 程序的 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象

1.3 ServletConfig 应用实例

● 需求: 编写 DBServlet.java 完成如下功能

  1. 在 web.xml 配置连接 mysql 的用户名和密码
  2. 在 DBServlet 执行 doGet()/doPost() 时,可以获取到 web.xml 配置的用户名和密码

在这里插入图片描述

  1. 示意图(思路分析)
    在这里插入图片描述
    ● 代码实现
    提示:具体看项目对应的代码

DBServlet.java

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 {
        System.out.println("init" + config);
        super.init(config);
    }

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

        //在DBServlet 执行 doGet()/doPost() 时,可以获取到web.xml配置的用户名和密码
        //你是一个OOP程序员->现有的方法或对象来搞定
        //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文件

<servlet>
    <servlet-name>DBServlet</servlet-name>
    <servlet-class>com.hspedu.servlet.DBServlet</servlet-class>
    <!--配置信息,而不是硬编码到程序-->
    <init-param>
        <param-name>username</param-name>
        <param-value>hsp</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>

优化:注解方式实现

@WebServlet(name = "DBServlet2", value = "/DBServlet2",initParams = {@WebInitParam(name = "user",value = "root"),@WebInitParam(name = "pwd",value = "123456")})
public class DBServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        String user = servletConfig.getInitParameter("user");
        String pwd = servletConfig.getInitParameter("pwd");
        System.out.println("user:"+user);
        System.out.println("pwd:"+pwd);
    }

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

2. ServletContext

2.1 为什么需要 ServletContext

  1. 先看一个需求: 如果我们希望统计某个 web 应用的所有 Servlet 被访问的次数,怎么办?
  2. 方案 1-DB
    在这里插入图片描述
  3. 方案 2-ServletContext
    在这里插入图片描述

2.2 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 对象通常也被称之为域对象。【示意图】
    在这里插入图片描述

2.3 ServletContext 可以做什么

  1. 获取 web.xml 中配置的上下文参数 context-param [信息和整个 web 应用相关,而不是
    属于某个 Servlet]
  2. 获取当前的工程路径,格式: /工程路径 =》 比如 /servlet
  3. 获 取 工 程 部 署 后 在 服 务 器 硬 盘 上 的 绝 对 路 径 ( 比 如 D:\hspedu_javaweb\servlet\out\artifacts\servlet_war_exploded)
  4. 像 Map 一样存取数据, 多个 Servlet 共享数据
    在这里插入图片描述

2.4 应用实例

2.4.1 应用实例 1-获取工程相关信息

● 需求如下:

  1. 获取 web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径

● 代码实现 - 具体看 项目中的代码.
ServletContext_.java

public class ServletContext_ extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取web.xml的context-parameter
        
		//1.1 获取到ServletContext对象 方式1
		// ServletContext servletContext = servletConfig.getServletContext();
        //1.2 获取到ServletContext对象
        ServletContext servletContext = getServletContext();
        //2. 获取website
        String website = servletContext.getInitParameter("website");
        String company = servletContext.getInitParameter("company");
        //3. 获取项目的工程路径
        String contextPath = servletContext.getContextPath();
        //4. 获取项目发布后,正在的工作路径
        //   /表示我们的项目(发布后)的 根路径 D:\hspedu_javaweb\servlet\out\artifacts\servlet_war_exploded
        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);
    }
}

web.xml

<!--配置ServletContext_-->
<servlet>
    <servlet-name>ServletContext_</servlet-name>
    <servlet-class>com.hspedu.servlet.servletcontext.ServletContext_</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ServletContext_</servlet-name>
    <url-pattern>/servletContext_</url-pattern>
</servlet-mapping>

<!--配置整个网站的信息-->
<context-param>
    <param-name>website</param-name>
    <param-value>http://www.baidu.com</param-value>
</context-param>
<context-param>
    <param-name>company</param-name>
    <param-value>百度</param-value>
</context-param>

2.4.2 应用实例 2-简单的网站访问次数计数器

需求分析/图解

  1. 需求: 完成一个简单的网站访问次数计数器:
    在这里插入图片描述
  2. 使用 Chrome 访问 Servlet01, 每访问一次,就增加 1 访问次数,在后台输出,并将结果返回给浏览器显示
  3. 使用火狐访问 Servlet02,每访问一次,就增加 1 访问次数,在后台输出,并将结果返回给浏览器显示

在这里插入图片描述
OrderServlet.java

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());

		// 法1
        // //从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);
        // }

		// 法2
        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);
    }
}

PayServlet.java

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());
        
        //法1
        // //从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);
        // }

		//法2
        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.java

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 中配置两个 servlet

<servlet>
	<servlet-name>OrderServlet</servlet-name>
	<servlet-class>com.hspedu.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.hspedu.servlet.servletcontext.PayServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>PayServlet</servlet-name>
	<url-pattern>/payServlet</url-pattern>
</servlet-mapping>

完成测试
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkphp5 线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法汇总

本篇文章主要讲解:thinkphp5 项目线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法教程 作者:任聪聪 日期:2023年4月17日 thinkphp版本5.1 现象说明: 线下测试环境,显示可以看到界面 部署到线上配置完毕后发现页面空白 在php中写入echo 1232…

pytorch进阶学习(七):神经网络模型验证过程中混淆矩阵、召回率、精准率、ROC曲线等指标的绘制与代码

参考笔记 【机器学习】五分钟搞懂如何评价二分类模型&#xff01;混淆矩阵、召回率、精确率、准确率超简单解释&#xff0c;入门必看&#xff01;_哔哩哔哩_bilibili 混淆矩阵的概念_GIS_JH的博客-CSDN博客 机器学习中的混淆矩阵&#xff0c;准确率&#xff0c;精确率&#…

[java]String类

String表示字符串类型。 注意c中没有表示字符串的类型。 String内部包含如下两个变量。 java中String结尾没有/0&#xff0c;java不需要/0标注结束位置。 str2代表指向的对象内容为空&#xff0c;str3代表不指向任何对象。 str1和str2指向对象不一样&#xff0c;所以不相等 可…

在Linux中进行Jenkins-2.190的安装及使用

Jenkins-2.190安装在公网IP为x.x.x.x的服务器上 环境准备 第一步&#xff0c;下载server-jre-8u202-linux-x64.tar.gz安装包。 登录地址&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html下载server-jre-8u202-linux-x64.tar.gz…

黑马程序员---微服务笔记【实用篇】

微服务技术栈导学 微服务实现流程&#xff1a; 所有要学的技术&#xff1a; 分层次教学&#xff1a; 具体分层&#xff1a; 实用篇---第一天 一、认识微服务 单体架构 将业务所有功能集中在一个项目中开发&#xff0c;打成一个包部署 优点&#xff1a;架构简单、部署成本低 …

Linux系统编程(三)—— 文件编程(2)系统数据文件和信息

一、文件&#xff1a;/etc/passwd 这是 /etc/passswd 文件下的内容&#xff1a; &#xff08;1&#xff09;标准库函数&#xff1a;getpwuid( ) 和 getpwname( ) getpwuid( )函数是根据 uid 来找到系统用户的信息&#xff1b;getpwname( )函数是根据 name 来找到用户的信息&…

机器学习 day04(梯度下降算法,学习率,偏导数,执行过程示意图)

1. 梯度下降 我们可以用一种更系统的方法&#xff0c;来找到一组w&#xff0c;b&#xff0c;使成本函数的值最小。这个方法叫梯度下降算法&#xff0c;它可用于最小化任何函数&#xff0c;不仅仅包括线性回归的成本函数&#xff0c;也包括两个以上参数的其他成本函数在线性回…

C#:在datagridview中每行添加图片,点击图片删除整行

今天要讲的是关于datagridview中的操作。 首先现在winform界面中拉取一个datagridview控件&#xff0c;如下图所示&#xff1a; 然后需要在控件中添加如下图所示的三列数据&#xff1a; 其中第一列的数据类型选择如下图所示的DataGridViewImageColumn&#xff0c;另外两列的数…

基于matlab使用 CSI-RS 的 NR 下行链路发射端波束细化

一、前言 此示例演示了使用 5G 工具箱中的信道状态信息参考信号 &#xff08;CSI-RS&#xff09; 的下行链路发射端波束细化过程。该示例展示了如何在散射环境中向不同方向传输多个CSI-RS资源&#xff0c;以及如何根据参考信号接收功率&#xff08;RSRP&#xff09;测量结果选择…

PHP调用api接口,电商平台商品详情API接口(封装可高并发)

PHP传递参数 1、通过GET方式接收调用api接口传递的参数。 2、使用switch语句&#xff0c;当GET接收到不同的值时&#xff0c;调用不同的函数。 3、分别创建one(&#xff09;&#xff0c;two()&#xff0c;three()三个函数用于返回api接口调用后返回的数据。 4、在浏览器打开…

反弹shell原理与实现

一、什么是反弹shell&#xff1f; 反弹shell&#xff08;Reverse Shell&#xff09;是一种常用于网络攻击中的技术&#xff0c;其目的是让攻击者通过远程控制程序获取被攻击计算机的权限。反弹shell技术通常是通过在受害者计算机上运行一个程序&#xff08;称为“后门”&#…

CF55D-Beautiful numbers (数位dp)

l c m ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ) 2520 lcm(1,2,3,4,5,6,7,8,9)2520 lcm(1,2,3,4,5,6,7,8,9)2520 若 x x x 能被它自己的所有非零位的数字整除&#xff0c;即能被它们的最小公倍数整除&#xff0c; x ≡ 0 ( m o d l c m ( { d i g i t [ i ] } ) ) x \equiv 0…

十大常见行业 BI 可视化应用

智能商业指的是利用互联网、物联网、自动化、人工智能等新一代信息技术&#xff0c;在一定程度上对市场判断、发展决策、业务复盘、业务预测等商业行为实现智能化、自动化&#xff0c;整个过程基本不需要人类参与。 很多企业部署了商业智能BI系统&#xff0c;这是一种包含了数…

Node 02-fs模块

fs 模块 fs 全称为 file system &#xff0c;称之为 文件系统 &#xff0c;是 Node.js 中的 内置模块 &#xff0c;可以对计算机中的磁盘进行操作。 本章节会介绍如下几个操作&#xff1a; 文件写入文件读取文件移动与重命名文件删除文件夹操作查看资源状态 文件写入 文件写入…

ubuntu常用命令

查询进程&#xff1a; ps -ef 杀死进程 kill -9 killall -9 chrome killall chromedriver 杀死所有chrome ps ef 查看运行的任务 ps -ef | grep python top 查看运行任务详情 后台启动Python脚本 可以使用下面的命令来启动上面的脚本&#xff0c;让Python在后台运行。 nohup…

Matlab论文插图绘制模板第87期—模值赋色的三维箭头图

在之前的文章中&#xff0c;分享了Matlab三维箭头图的绘制模板&#xff1a; 进一步&#xff0c;如果我们想对每一个箭头赋上颜色&#xff0c;以更加直观地表示其模值的大小&#xff0c;该怎么操作呢&#xff1f; 那么&#xff0c;来看一下模值赋色的三维箭头图的绘制模板。 先…

设计模式 -- 多例模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

docker镜像制作: 构建UI镜像

前端构建docker镜像 事前准备 安装nodejs cd/usr/local/ wgethttps://npm.taobao.org/mirrors/node/v12.16.2/node-v12.16.2-linux-x64.tar.gz tar-zxvfnode-v12.16.2-linux-x64.tar.gz rm-rfnode-v12.16.2-linux-x64.tar.gz mvnode-v12.16.2-linux-x64node echoexportNODE_HO…

Matlab绘图案例,MATLAB画图大法,附详细代码

目录 1. 使用subplot创建多个子图 2. 绘制误差棒图 3. 绘制条形堆积图 4. 绘制堆积面积图 5. 绘制直方图并拟合曲线 6. 绘制等高线图 7. 绘制光滑的曲线 8. 绘制彩虹图 9. 绘制带有错误标记的散点图 10. 绘制水平堆积条形 11. 绘制饼图 12. 绘制极坐标图 13. 绘制…

怎样写好一本书

如果把“怎样写好一本书&#xff1f;”这个问题抛给ChatGPT&#xff0c;他的回答仍然像模像样。 虽然他回答的几点都没有错&#xff0c;但是&#xff0c;我个人认为&#xff0c;如果你想要写一本书并出版&#xff0c;那么首先应该考虑的是找一家出版社合作。毕竟&#xff0c;出…