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