ServletConfig和ServletContext 的介绍和代码实现

news/2024/11/24 6:24:33/

目录

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*/@Overridepublic 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. 获取websiteString website = servletContext.getInitParameter("website");String company = servletContext.getInitParameter("company");//3. 获取项目的工程路径String contextPath = servletContext.getContextPath();//4. 获取项目发布会,正在的工作路径//   /表示我们的项目(发布后)的 根路径String realPath = servletContext.getRealPath("/");System.out.println("项目路径= " + contextPath);// /servletSystem.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-vObject visit_count = servletContext.getAttribute("visit_count");//判断visit_count是否为nullif (visit_count == null) {//说明是第1次访问网站servletContext.setAttribute("visit_count", 1);visit_count = 1;} else { //二次或以后//取出visit_count属性的值+1visit_count = Integer.parseInt(visit_count + "") + 1;//放回到servletContextservletContext.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>

http://www.ppmy.cn/news/47403.html

相关文章

netlink

Netlink套接字是用以实现内核进程和用户进程通信的一种特殊的进程间通信&#xff08;IPC&#xff09;&#xff0c;从linux 2.2开始引入内核&#xff0c;当时名为AF_NETLINK,旨在提供一种更灵活的内核和用户空间的通信方法&#xff0c;用以替换笨拙的IOCTL. IOCTL 方式通信&…

dockerFile记录

后端打包dockerFile内容 FROM openjdk:8-alpine RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo Asia/Shanghai > /etc/timezone ENV projectName operation RUN mkdir -p /home/${projectName} WORKDIR /home/${projectName} COPY ./ /home/${pro…

「OceanBase 4.1 体验」|国产分布式数据库不好用?别再打脸了

文章目录 分布式数据库分布式数据库有哪些&#xff1f;OceanBase4.1安装部署Index Skip Scan总结 随着互联网的高速发展和数据量的爆炸式增长&#xff0c;如何能够高效、可靠、安全地存储海量数据成为了每个企业的重要课题。 分布式数据库 分布式数据库通常是由多个独立的数据…

从底层理解类

函数调用约定_thiscall thiscall是对象调用类成员函数时的约定 class Role { public:int hp;int mp;int add(int a, int b){return hp mp a b;} }; int main() {Role r;r.add(100, 200); } 查看汇编代码 15: Role r;16: r.add(100, 200); 00F91B08 push 0C…

[网络安全]第三次作业

目录 1. 什么是IDS&#xff1f; 2. IDS和防火墙有什么不同&#xff1f; 3. IDS工作原理&#xff1f; 4. IDS的主要检测方法有哪些详细说明&#xff1f; 5. IDS的部署方式有哪些&#xff1f; 6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f;例外签名…

记录解决Maven依赖冲突导致的NoSuchMethodError问题的过程

摘要 本文记录了解决 Maven 依赖冲突导致的 NoSuchMethodError 问题的过程。问题出现的原因是多个库包含了 Jackson 库&#xff0c;导致 Jackson 序列化与反序列化时出现 NoSuchMethodError 异常。通过查看依赖树&#xff0c;排除冲突库的方法&#xff0c;最终成功解决了该问题…

查询练习:YEAR 与 NOW 函数

查询 student 表中每个学生的姓名和年龄。 -- 使用函数 YEAR(NOW()) 计算出当前年份&#xff0c;减去出生年份后得出年龄。 SELECT name, YEAR(NOW()) - YEAR(birthday) as age FROM student; ----------------- | name | age | ----------------- | 曾华 | 42 |…

垃圾收集器面试总结(一)

垃圾收集器 Serial 收集器&#xff08;GC日志标识&#xff1a;DefNew&#xff09; Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。 它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾…