1. ServletConfig是什么? 13
jakarta.servlet.ServletConfig
显然ServletConfig是Servlet规范中的一员。
ServletConfig是一个接口。(jakarta.servlet.Servlet是一个接口。)
一个Servlet对象中有一个ServletConfig对象。(Servlet和ServletConfig对象是一对一。)
100个Servlet,就应该有100个ServletConfig对象。
2. 谁去实现了这个接口呢? 13
WEB服务器实现了
public class org.apache.catalina.core.StandardWrapperFacade implements ServletConfig {}
结论:Tomcat服务器实现了ServletConfig接口。
2.1 思考:如果把Tomcat服务器换成jetty服务器,输出 ServletConfig对象的时候,还是这个结果吗?
不一定一样,包名类名可能和Tomcat不一样。但是他们都实现了ServletConfig这个规范。
3. ServletConfig对象是谁创建的?在什么时候创建的?13
Tomcat服务器(WEB服务器)创建了ServletConfig对象。
在创建Servlet对象的时候,同时创建ServletConfig对象。
3.1 ServletConfig接口到底是干啥的?有什么用呢? 13
Config是哪个单词的缩写?
Configuration
ServletConfig对象被翻译为:Servlet对象的配置信息对象。
一个Servlet对象就有一个配置信息对象。
两个Servlet对象就有两个配置信息对象。
3.2 ServletConfig对象中到底包装了什么信息呢? 13
ServletConfig对象中包装的信息是:
标签的配置信息。
<servlet>
<servlet-name>configTest</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>
</servlet>
Tomcat小猫咪解析web.xml文件,将web.xml文件中标签中的配置信息自动包装到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>
<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>
标签中的是初始化参数。这个初始化参数信息会自动被Tomcat小猫咪封装到ServletConfig对象当中。
3.4 ServletConfig接口中有4个方法: 13
第1个方法:
public String getInitParameter(String name);//获取value
第2个方法:
getInitParameterNames();//获取key
第3个方法:
public ServletContext getServletContext();
第4个方法:
public String getServletName();//获取servlet的name
以上的4个方法,在自己编写的Servlet类当中也可以使用this去调用。(这个Servlet继承了GenericServlet)
代码在com.bjpowernode.javaweb.servlet.
ConfigTestServlet
package com.bjpowernode.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
//ServletConfig接口详情 13
//研究ServletConfig是知识点 13-14
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@4b8c081
out.print("ServletConfig对象是:"+config);
out.print("
");//换行
// 获取configTest中间的configTest也就是name
String servletName = config.getServletName();
out.print(""+servletName+"");//configTest
out.print("
");
out.print("
");
// 通过ServletConfig对象的两个方法,可以获取到web.xml文件中的初始化参数配置信息。
// java.util.Enumeration getInitParameterNames()
// getInitParameterNames()取name
// 获取所有的初始化参数的name
//获取结果放在了一个集合中
Enumeration initParameterNames = config.getInitParameterNames();
//遍历集合
while (initParameterNames.hasMoreElements()) {//是否有更多的元素
String parameterName = initParameterNames.nextElement();//取元素即取出name
String ParameterVal = config.getInitParameter(parameterName);//通过那么取value
out.print(parameterName+" = "+ParameterVal);
out.print("
");
}
//java.lang.String getInitParameter(java.lang.String name)
//getInitParameter取value
// 通过初始化参数的name获取value
// String driver = config.getInitParameter("driver");
// out.print(driver);//com.mysql.cj.jdbc.Driver
// 实际上获取一个Servlet对象的初始化参数,可以不用获取ServletConfig对象。直接通过this也可以。
//因为GenericServlet中提供了getInitParameter(name)和getInitParameterNames()方法
Enumeration names = this.getInitParameterNames();
while(names.hasMoreElements()){//判断是否有更多元素
String name = names.nextElement();//取元素
String value = this.getInitParameter(name);//根据name取value
//这里直接输出在控制台了
System.out.println(name+" = "+value);
}
//ServletContext接口详解 14
// 怎么获取ServletContext对象呢?
// 第一种方式:通过ServletConfig对象获取ServletContext对象。
ServletContext application = config.getServletContext();
//输出结果org.apache.catalina.core.ApplicationContextFacade@96784a4
out.print("
"+application);
// 第二种方式:通过this也可以获取ServletContext对象。
ServletContext application2 = this.getServletContext();
//输出结果org.apache.catalina.core.ApplicationContextFacade@96784a4
out.print("
"+application2);
}
}
ConfigTestServlet2
package com.bjpowernode.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
//研究ServletConfig是知识点 13
//一个Servlet对象中有一个ServletConfig对象。(Servlet和ServletConfig对象是一对一。)
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@6c388349
//此输出结果与ConfigTestServlet中的ServletConfig对象不一样由此可知
//Servlet和ServletConfig对象是一对一
out.print("ServletConfig对象是:"+config);
//获取初始化信息的value
String value = config.getInitParameter("key");
out.print("
"+value);//value
}
}
配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 这个是ConfigTestServlet的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>
<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>
<!-- 这个是ConfigTestServlet2的servlet配置-->
<servlet>
<servlet-name>configTest2</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet2</servlet-class>
<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>
</web-app>
4. 总结 15
- 什么是ServletConfig?
- Servlet对象的配置信息对象。
标签中的配置信息。(web.xml文件中servlet的配置信息)
- 一个Servlet对应一个ServletConfig对象。
- Servlet对象是Tomcat服务器创建,并且ServletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建。
- Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。
- ServletConfig接口的实现类是Tomcat服务器给实现的。(Tomcat服务器说的就是WEB服务器。)
- ServletConfig接口有哪些常用的方法?
public String getInitParameter(String name); // 通过初始化参数的name获取value
getInitParameterNames(); // 获取所有的初始化参数的name
public ServletContext getServletContext(); // 获取ServletContext对象
public String getServletName(); // 获取Servlet的name
- 以上方法在Servlet类当中,都可以使用this去调用。因为GenericServlet实现了ServletConfig接口。