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 {
@Override
public 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@aea0d43
out.print("ServletConfig对象是:" + config.toString());
out.print("<br>");
}
}
public class ConfigTestServlet2 extends GenericServlet {
@Override
public 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@287af686
out.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 {
@Override
public 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>");//configTest
out.print("<br>");
// 获取所有初始化参数的name集合
Enumeration<String> initParameterNames = config.getInitParameterNames();
// 遍历集合
while(initParameterNames.hasMoreElements()) {
// 是否有更多name元素
String parameterName = initParameterNames.nextElement(); // 取name元素
// 通过初始化参数的name获取value
String parameterVal = config.getInitParameter(parameterName);
out.print(parameterName + "=" + parameterVal);
out.print("<br>");
}
// 通过初始化参数的name获取value
String driver = config.getInitParameter("driver");
out.print(driver);
}
}
第二种: 直接使用this调用父类GenericServlet提供的获取初始化参数的方法,底层是让父类帮我们调用ServletConfig对象的获取初始化参数的方法
// GenericServlet源码
public abstract class GenericServlet implements Servlet {
// 成员变量
private ServletConfig config;
@Override
public final void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
// GenericServlet提供的获取初始化参数的方法
@Override
public ServletConfig getInitParameter(String name) {
return getServletConfig().getInitParameter(String name);
}
// GenericServlet提供的获取初始化参数的方法
@Override
public ServletConfig getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
}
// 测试程序
public class ConfigTestServlet extends GenericServlet {
@Override
public 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);
}
}
}