Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法。

ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始化时,Servlet容器传递信息给正在初始化的servlet对象。

public abstract interface javax.servlet.ServletConfig {
  public abstract java.lang.String getServletName();
  public abstract javax.servlet.ServletContext getServletContext();
  public abstract java.lang.String getInitParameter(java.lang.String arg0);
  public abstract java.util.Enumeration getInitParameterNames();
}
  • getServletName()方法:

用来返回当前servlet在web.xml注册的servlet-name;

  • getServletContext()方法:

获取servlet上下文信息。

  • getInitParameter(String arg0)方法:

根据一个指定的参数名称,获取在servlet初始化时传递的参数值,而这样的参数信息往往配置在web.xml。

  • getInitParameters()方法:

返回servlet初始化时,传递进来的所有参数名称集合。

为了能了解到ServletConfig相关的使用,我们需要在之前新建的MyServlet001工程中,修改web.xml,在<servlet>节点中添加<init-param>节点:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 5     id="WebApp_ID" version="3.0">
 6 
 7     <!-- 配置和映射 servlet -->
 8     <servlet>
 9         <!-- Servlet注册的名字 -->
10         <servlet-name>helloServlet</servlet-name>
11         <!-- Servlet全类名 -->
12         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
13         
14         <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 -->
15         <init-param>
16             <param-name>username</param-name>
17             <param-value>user001</param-value>
18         </init-param>
19         <init-param>
20             <param-name>password</param-name>
21             <param-value>123456</param-value>
22         </init-param>
23 
24         <!-- 指定servlet被初始化的时机 -->
25         <load-on-startup>-1</load-on-startup>
26     </servlet>
27     <servlet-mapping>
28         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
29         <servlet-name>helloServlet</servlet-name>
30         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
31         <url-pattern>/hello</url-pattern>
32     </servlet-mapping>
33 
34 </web-app>

在配置参数时,需要注意事项:

<load-on-startup>节点必须在<init-param>节点的下边,否则会抛出异常信息,配置不通过。

之后再HelloServlet的init方法中,添加代码:

 1 public void init(ServletConfig config) throws ServletException {
 2         System.out.println("init");
 3 
 4         // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。
 5         String username = config.getInitParameter("username");
 6         String password = config.getInitParameter("password");
 7         System.out.println("username:" + username);
 8         System.out.println("password:" + password);
 9 
10         // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。
11         Enumeration<String> names = config.getInitParameterNames();
12         while (names.hasMoreElements()) {
13             String name = names.nextElement();
14             String value = config.getInitParameter(name);
15             System.out.println(name + ":" + value);
16         }
17 
18         // 获取Servlet名称。
19         String servletName = config.getServletName();
20         System.out.println(servletName);
21 
22         ServletContext servletContext = config.getServletContext();
23     }

重新启动tomcat,并在浏览器中输入地址:http://localhost:8080/MyServlet001/hello,回车,之后查看tomcat服务器输出信息:

INFO: Server startup in 1262 ms
HelloServlet constructor
init
username:user001
password:123456
username:user001
password:123456
helloServlet
service

从上边的输出信息,及代码中,就可以理解,getInitParameter(),getInitParameters(),getServletName()的用法。

ServletContext servletContext=config.getServletContext();

这个ServletContext是怎么解释,有什么用处呢?

我们查看官网对ServletContext的介绍:

public interface ServletContext

Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.

There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.)

In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead.

The ServletContext object is contained within the ServletConfig object, which the Web server provides the servlet when the servlet is initialized.

ServletContext接口:

1、Servlet引擎为每个web应用程序都创建了一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext()方法就可以返回ServletContext对象的引用。

2、由于一个web应用程序中的所有Servlet都共享一个ServletContext对象,所以ServletContext对象被称之为application对象(web应用程序对象)。

3、功能:

     获取web应用程序的初始化参数;

     记录日志;

     application域范围的属性;

     访问资源文件;

     获取虚拟路径所映射的本地路径; 

     web应用程序之间的访问;

     ServletContext的其他方法。

  •      获取web应用程序的初始化参数;

首先,需要在web.xml中配置应用程序级别(<context-param>)的参数信息;

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 5     id="WebApp_ID" version="3.0">
 6     
 7     <!-- 配置当前web应用的初始化参数 -->
 8     <context-param>
 9         <param-name>driver</param-name>
10         <param-value>com.mysql.jdbc.Driver</param-value>
11     </context-param>
12     <context-param>
13         <param-name>jdbcUrl</param-name>
14         <param-value>jdbc:mysql://test</param-value>
15     </context-param>
16 
17     <!-- 配置和映射 servlet -->
18     <servlet>
19         <!-- Servlet注册的名字 -->
20         <servlet-name>helloServlet</servlet-name>
21         <!-- Servlet全类名 -->
22         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
23 
24         <!-- 配置Servlet的初始化参数。且节点必须在 load-on-startup节点的前边 -->
25         <init-param>
26             <param-name>username</param-name>
27             <param-value>user001</param-value>
28         </init-param>
29         <init-param>
30             <param-name>password</param-name>
31             <param-value>123456</param-value>
32         </init-param>
33 
34         <!-- 指定servlet被初始化的时机 -->
35         <load-on-startup>-1</load-on-startup>
36     </servlet>
37     <servlet-mapping>
38         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
39         <servlet-name>helloServlet</servlet-name>
40         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
41         <url-pattern>/hello</url-pattern>
42     </servlet-mapping>
43 
44 </web-app>

注意:

  这里的context-param是应用程级别的初始化参数,<servlet>节点下的<init-param>属于servlet局部的初始化参数,他们具有作用域范围不同。

然后,使用:

 1     public void init(ServletConfig config) throws ServletException {
 2         System.out.println("init");
 3 
 4         // 根据ServletConfig的getInitParameter()方法,根据特定初始化参数名称,获取对应的初始化参数值。
 5         String username = config.getInitParameter("username");
 6         String password = config.getInitParameter("password");
 7         System.out.println("username:" + username);
 8         System.out.println("password:" + password);
 9 
10         // 根据ServletConfig的getInitParameterNames()方法,获取初始化参数信息。
11         Enumeration<String> names = config.getInitParameterNames();
12         while (names.hasMoreElements()) {
13             String name = names.nextElement();
14             String value = config.getInitParameter(name);
15             System.out.println(name + ":" + value);
16         }
17 
18         // 获取Servlet名称。
19         String servletName = config.getServletName();
20         System.out.println(servletName);
21 
22         // 使用getServletContext(),获取ServletContext对象。
23         ServletContext servletContext = config.getServletContext();
24                 
25         // ServletContext获取初始化参数函数getInitParameter(String arg0)
26         String driver=servletContext.getInitParameter("driver");
27         String jdbc=servletContext.getInitParameter("jdbc");
28         System.out.println("driver:"+driver);
29         System.out.println("jdbc:"+jdbc);
30         
31         // ServletContext获取初始化参数集合函数getInitParameterNames()
32         Enumeration<String> names2= servletContext.getInitParameterNames();
33         while (names2.hasMoreElements()) {
34             String name = names2.nextElement();
35             String value = servletContext.getInitParameter(name);
36             System.out.println(name + ":" + value);
37         }
38     }

查看输出信息:

HelloServlet constructor
init
username:user001
password:123456
username:user001
password:123456
helloServlet
driver:com.mysql.jdbc.Driver
jdbcUrl:jdbc:mysql://test
driver:com.mysql.jdbc.Driver
jdbcUrl:jdbc:mysql://test
service
  •      访问资源文件(获取当前web应用的某一个文件对应的输入流。);
 1     // 获取当前web应用的某一个文件对应的输入流。
 2         try {
 3             ClassLoader classLoader = this.getClass().getClassLoader();
 4             InputStream stream = classLoader.getResourceAsStream("jdbc.properties");
 5             //stream with method0:java.io.BufferedInputStream@1cd3bd82
 6             System.out.println("stream with method0:"+stream);
 7         } catch (Exception e) {
 8             e.printStackTrace();
 9         }
10 
11         try {
12             InputStream stream = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
13             // stream with method1:java.io.FileInputStream@113eb097 
14             System.out.println("stream with method1:"+stream);            
15         } catch (Exception e) {
16             e.printStackTrace();
17         }
  •      获取当前web应用的某一个文件,在服务器上的一个绝对路径
1         // 获取当前web应用的某一个文件,在服务器上的一个绝对路径:
2         // D:javaworkset.metadata.pluginsorg.eclipse.wst.server.core	mp0wtpwebappsMyServlet001WEB-INFweb.xml
3         String realPath=servletContext.getRealPath("/WEB-INF/web.xml");
4         System.out.println(realPath);
  •      获取web当前应用的名称;
        // 获取web当前应用的名称
        String webName=servletContext.getContextPath();
        // "/MyServlet001"
        System.out.println(webName);
原文地址:https://www.cnblogs.com/yy3b2007com/p/5224753.html