ServletConfig
-
什么是ServletConfig?
- Servlet对象的配置信息对象。
- ServletConfig对象中封装了标签中的配置信息。(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 public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name public ServletContext getServletContext(); // 获取ServletContext对象 public String getServletName(); // 获取Servlet的name
-
以上方法在Servlet类当中,都可以使用this去调用。因为GenericServlet实现了ServletConfig接口。
-
package com.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* ServletConfig
* 1、ServletConfig是什么?
* jakarta.servlet.ServletConfig
* 显然ServletConfig是Servlet规范中的一员
* ServletConfig是一个接口(jakarta.servlet.Servlet也是一个接口)
* 2、谁实现了ServletConfig接口? WEB服务器实现
* public class org.apache.catalina.core.StandardWrapperFacade implements ServletConfig {}
* 结论:Tomcat服务器实现了ServletConfig接口
* 思考:将Tomcat服务器换成jetty服务器,输出ServletConfig对象的时候,还是这个结果吗?
* 不一定一样,包名类名可能和Tomcat不一样,但是都实现了ServletConfig规范
* 3、一个Servlet对象对应一个ServletConfig对象。
* 4、ServletConfig对象是谁创建的?在什么时候创建的?
* Tomcat服务器(WEB服务器)创建了ServletConfig对象
* 在创建Servlet对象的时候,同时创建了ServletConfig对象
* 5、ServletConfig接口是干什么的?有什么用?
* Config(Configuration)
* ServletConfig对象被翻译为:Servlet对象的配置信息对象
* 一个Servlet对象就有一个配置信息对象
* 6、ServletConfig对象中包装了什么信息?
* <servlet>
* <servlet-name>configTest</servlet-name>
* <servlet-class>com.javaweb.servlet.ConfigTestServlet</servlet-class>
* </servlet>
* ServletConfig对象中包装的信息
* web.xml文件中<servlet></servlet>标签的配置信息
* Tomcat解析web.xml文件,将web.xml文件中<servlet></servlet>标签的配置信息自动包装到ServletConfig对象中
* 7、ServletConfig有哪些方法
* <servlet>
* <servlet-name>configTest</servlet-name>
* <servlet-class>com.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/student</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>root</param-value>
* </init-param>
* </servlet>
* 以上<servlet></servlet>标签中的<init-param></init-param>是初始化参数
* 这个初始化参数信息会自动被Tomcat封装到ServletConfig对象中
*/
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@66f930bb
out.print("ServletConfig对象是" + config);
out.print("<br>");
// 获取<servlet-name></servlet-name>
// 输出:configTest
String servletName = config.getServletName();
out.print("<servlet-name>"+servletName+"</servlet-name>");
out.print("<br>");
// 通过ServletConfig对象中的两个方法,可以获取到web.xml文件中的初始化配置信息
//java.util.Enumeration<java.lang.String> getInitParameterNames() 获取所有的初始化参数的name
//java.lang.String getInitParameter(java.lang.String name) 通过初始化参数的name获取value
Enumeration<String> initParameterNames = this.getInitParameterNames();
// 遍历集合
/* 输出:password=root
driver=com.mysql.cj.jdbc.Driver
user=root
url=jdbc:mysql://localhost:3306/student
*/
while (initParameterNames.hasMoreElements()){ // 是否有更多元素
String parameterName = initParameterNames.nextElement(); // 取元素
String parameterValue = this.getInitParameter(parameterName); // 通过name获取参数
out.print(parameterName + "=" + parameterValue);
out.print("<br>");
}
/**
* 怎么获取ServletContext对象
*/
// 第一种方式:通过ServletConfig对象获取ServletContext对象
ServletContext application = config.getServletContext();
out.print("<br>" + application); // 输出:org.apache.catalina.core.ApplicationContextFacade@64b0375f
// 第二种方式:通过this也可以获取ServletContext对象
ServletContext application2 = this.getServletContext();
out.print("<br>" + application2); // 输出:org.apache.catalina.core.ApplicationContextFacade@64b0375f
}
}