ServletConfig对象的概述及其获取Servlet对象初始化参数方式的常用方法

news/2024/11/8 0:28:49/

ServletConfig配置Servlet信息

ServletConfig接口是Tomcat服务器提供的org.apache.catalina.core.StandardWrapperFacade给实现的

  • 不同的服务器输出ServletConfig对象的时候包名类名可能不一样, 但是他们都实现了ServletConfig规范

ServletConfig被翻译为Servlet对象的配置信息对象是Servlet规范中的一员,全类名jakarta.servlet.ServletConfig

  • Tomcat服务器解析web.xml文件时会将init-param标签中的初始化参数信息封装到一个ServletConfig对象中
  • 如果你的配置信息只是想给某一个servlet作为参考,那么配置到init-param标签当中即可,使用ServletConfig对象来获取这些配置信息
  • 一个Servlet对象对应一个ServletConfig对象 , Servlet和ServletConfig对象是一一对应
<servlet><servlet-name>configTest</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class><!--配置Servlet对象的初始化信息--><init-param><param-name>driver</param-name><param-value>com.mysql.cj.jdbc.Driver</param-value></init-param>
</servlet>

ServletConfig对象的创建时机和使用时机

  • 默认情况下Tomcat服务器在用户发送第一次请求的时候会创建Servlet对象并且同时创建的ServletConfig对象
  • Tomcat服务器调用Servlet对象的有参init方法的时候将ServletConfig对象传递过去

Servlet和ServletConfig一一对应

在web.xml文件中配置两个Servlet对象

<servlet><servlet-name>configTest</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class><!--配置Servlet对象的初始化信息--><init-param><param-name>driver</param-name><param-value>com.mysql.cj.jdbc.Driver</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>configTest</servlet-name><url-pattern>/test</url-pattern>
</servlet-mapping><servlet><servlet-name>configTest2</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet2</servlet-class><!--配置Servlet对象的初始化信息--><init-param><param-name>key</param-name><param-value>value</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>configTest2</servlet-name><url-pattern>/test2</url-pattern>
</servlet-mapping>

Servlet对象和ServletConfig对象是一一对应的关系

  • ConfigTestServlet对应的ServletConfig对象是org.apache.catalina.core.StandardWrapperFacade@287af686
  • ConfigTestServlet2对应的ServletConfig对象是org.apache.catalina.core.StandardWrapperFacade@287af686
public class ConfigTestServlet extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 获取ServletConfig对象ServletConfig config = this.getServletConfig();// 输出ServletConfig对象: org.apache.catalina.core.StandardWrapperFacade@aea0d43out.print("ServletConfig对象是:" + config.toString());out.print("<br>");}
}public class ConfigTestServlet2 extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 获取ServletConfig对象ServletConfig config = this.getServletConfig();// 输出ServletConfig对象: org.apache.catalina.core.StandardWrapperFacade@287af686out.print("ServletConfig对象是:" + config);}
}

ServletConfig接口中常用的方法

Tomcat服务器会将init-param标签中的初始化参数信息封装到一个ServletConfig对象中,要想获取参数信息需要通过ServletConfig接口中的方法

  • GenericServlet实现了ServletConfig接口中的方法, 我们的编写的Servlet可以使用this调用GenericServlet中的方法,它帮我们调用ServletConfig对象的方法
方法名方法作用
public String getInitParameter(String name)通过init-param标签的name获取value
public Enumeration< String > getInitParameterNames()获取所有init-param标签的name
public ServletContext getServletContext()获取ServletContext对象(封装了上下文初始化参数信息的对象)
public String getServletName()获取Servlet对象的name

获取Servlet对象初始化参数方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><servlet><servlet-name>configTest</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class><!--配置Servlet对象的初始化信息--><init-param><param-name>driver</param-name><param-value>com.mysql.cj.jdbc.Driver</param-value></init-param><init-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/bjpowernode</param-value></init-param><init-param><param-name>user</param-name><param-value>root</param-value></init-param><init-param><param-name>password</param-name><param-value>root1234</param-value></init-param></servlet><servlet-mapping><servlet-name>configTest</servlet-name><url-pattern>/test</url-pattern></servlet-mapping>  
</web-app>

第一种: 通过父类的getServletConfig方法先获取ServletConfig对象,然后调用Config对象的方法获取Servlet对象的初始化参数

public class ConfigTestServlet extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 通过父类的方法获取ServletConfig对象ServletConfig config = this.getServletConfig();// 获取<servlet-name></servlet-name>标签中的name String servletName = config.getServletName();out.print("<servlet-name>"+servletName+"</servlet-name>");//configTestout.print("<br>");// 获取所有初始化参数的name集合Enumeration<String> initParameterNames = config.getInitParameterNames();// 遍历集合while(initParameterNames.hasMoreElements()) { // 是否有更多name元素String parameterName = initParameterNames.nextElement(); // 取name元素// 通过初始化参数的name获取valueString parameterVal = config.getInitParameter(parameterName); out.print(parameterName + "=" + parameterVal);out.print("<br>");}// 通过初始化参数的name获取valueString driver = config.getInitParameter("driver");out.print(driver);}
}

第二种: 直接使用this调用父类GenericServlet提供的获取初始化参数的方法,底层是让父类帮我们调用ServletConfig对象的获取初始化参数的方法

// GenericServlet源码
public abstract class GenericServlet implements Servlet {// 成员变量private ServletConfig config;@Overridepublic final void init(ServletConfig config) throws ServletException {this.config = config;this.init();}@Overridepublic ServletConfig getServletConfig() {return config;}// GenericServlet提供的获取初始化参数的方法@Overridepublic ServletConfig getInitParameter(String name) {return getServletConfig().getInitParameter(String name);}// GenericServlet提供的获取初始化参数的方法@Overridepublic ServletConfig getInitParameterNames() {return getServletConfig().getInitParameterNames();}
}
// 测试程序
public class ConfigTestServlet extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();// 这里调用的是的GenericServlet提供的getInitParameterNames方法,底层还是调用ServletConfig对象的获取初始化参数的方法Enumeration<String> names = this.getInitParameterNames();while(names.hasMoreElements()){String name = names.nextElement();String value = this.getInitParameter(name);System.out.println(name + "=" + value);}  }
}

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

相关文章

电脑系统升级后按F5按键不能直接刷新了,需要按Fn+F5组合按键才能实现刷新

电脑系统升级后按F5按键不能直接刷新了&#xff0c;需要按FnF5组合按键才能实现刷新&#xff0c;使用起来很不方便&#xff0c;查了一下&#xff0c;发现可能是升级后系统把F5的功能键重置为了FnF5. 改回去的办法&#xff1a; 我的是笔记本电脑&#xff0c;一般台式机开机按D…

如果Fn键一直亮着怎么办?

看到网上很多方法解决&#xff0c;但是却没有作用&#xff0c;后面自己随便按居然真的关掉了 同时按 FnShift即可

延期通知 RocketMQ Summit 议题

各位 RocketMQ 爱好者&RocketMQ Summit 的关注者&#xff1a; 鉴于近期新冠肺炎疫情出现反复&#xff0c;防控形势复杂严峻&#xff0c;为积极响应和配合疫情防控工作&#xff0c;防范疫情扩散风险。出于对众多热爱开源的参会嘉宾、演讲嘉宾的健康考虑&#xff0c; Summit…

【转】奕专栏:键盘序论并谈谈有趣的无刻印键盘

Posted Feb 16th 2007 10:00AM by Bin Chen分类: 精彩杂录, 外围设备 Engadget专栏专区又请到新的高手了&#xff0c;这次是键盘鼠标奕之华为带我们进入键鼠的神秘世界里&#xff0c;对 LCD 了解深入的他将来也会为我们探究面板上细微的颗粒。奕之华目前主持艺之都网站&#xf…

CV Master开营预告| 识别之路,大咖带路!

CV Master系列训练营又开张啦&#xff01; 第一期结束后&#xff0c; 我们收获了超乎预期的效果与反响&#xff0c; 那当然得趁热打铁&#xff0c;赶紧把第二期提上日程啦&#xff5e; 听到“识别”两个字&#xff0c; 有些同学可能还没有具象的概念&#xff0c; 但说到美颜相机…

几个让我欲罢不能的Python项目!

点击上方蓝色小字&#xff0c;关注“涛哥聊Python” 重磅干货&#xff0c;第一时间送达 作为一个语法简洁、有着丰富的第三方库的编程语言&#xff0c;Python 上手极为简单&#xff0c;短时间内就可以让你编写出能够解决实际问题的小程序&#xff0c;甚至去面试初级 Python 工程…

Qcon 演讲纪实:详解如何在实时视频通话中实现AR功能

2018年4月20日-22日&#xff0c;由 infoQ 主办的 Qcon 2018全球软件开发大会在北京如期举行。声网首席 iOS 研发工程师&#xff0c;iOS 端移动应用产品设计和技术架构负责人龚宇华&#xff0c;受邀分享了《基于 ARkit 和 ARcore&#xff0c;在实时视频通话中实现 AR 功能》&…

Git学习之旅

目录 一、Git与Svn的区别 1.Svn概述 2.Git概述 3.Git与Svn的区别 二、Git工作流程 三、Git与其他相关工具的安装与配置 四、Git本地仓库的基本操作 1. 创建版本库 2. 添加文件 3. 查看仓库当前状态 4. 修改文件 4.1 提交修改文件 4.2 查看修改日志 4.3 比较文件修改前后差异…