JaveWeb学习之Servlet(二):ServletConfig和ServletContext

这几天因为工作的关系,忙了好几天,博客几天没有更新,进度慢了,要加油了;接着简单分析一下ServletConfig和ServletContext两大对象;ServletConfig和ServletContext最常见的使用之一就是传递初始化参数,比如我们最常用的在Spring中配置contextConfigLocation;

ServletConfig

继续查看ServletConfig源码:

1
2
3
4
5
6
7
package javax.servlet;
public interface ServletConfig {
public String getServletName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();
}

getServletName();

getServletName方法用于获取当前Servlet名称,这个是在xml中配置的:springmvcdemo

getServletContext();

getServletContext方法用于获取代表当前web应用的ServletContext对象;

getInitParameter(String name);

getInitParameter方法用于获取当前Servlet指定名称的初始化参数的值;

getInitParameterNames();

getInitParameterNames获取当前Servlet所有初始化参数的名字枚举集合;

Servlet容器初始化时每一个Servlet对象时,会为其创建一个ServletConfig对象,通过Servlet的init方法,会把ServletContext对象传递给当前Servlet:

1
public void init(ServletConfig config) throws ServletException;

之后使用this.getServletConfig()对象获取当前Servlet的ServletConfig对象;

1
ServletConfig servletConfig = getServletConfig();

我们在xml中配置Servlet时,还可以配置Servlet初始化参数信息:

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>Servlet_1</servlet-name>
<servlet-class>com.guitu.servlet.Servlet_1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangkuan</param-value>
</init-param>
</servlet>

之后可以通过servletConfig获取InitParameter参数;

1
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();java

获得的是一个参数名字的枚举集合,在调用getInitParameter(String name)即可获得参数的值:

1
String initParameter = servletConfig.getInitParameter(parameterName);

ServletContext

Servlet容器启动后,会为每一个独立的Web应用创建一个ServletContext实例,代表当前Web应用;
ServletContext由所有Servlet共享,所以ServletContext中的参数所有Servlet都能够获取,多个web组件之间使用它实现数据共享;

ServletContext常用方法:

getAttribute(String name);

获取ServletContext中存储的数据;

setAttribute(String name, Object obj);

向ServletContext中存储数据;

getInitParameter(String name);

获取标签中为整个Web应用配置的初始化参数;

getInitParameterNames();

一次性获取里所有的初始化参数名的枚举;

getRealPath(String path);

获取应用程序内指定资源的绝对路径;

getResource(String parh);

path必须是/开头,代表当前web应用程序的根目录。返回一个代表某个资源的URL对象;

getResoutceAsStream(String parh);

可以使用相对于根目录的路径访问到web目录下的所有文件,而不必知道绝对路径,返回文件流;

ServletConfig、ServletContext测试Demo

1、Servlet_1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.guitu.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet_1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

ServletConfig servletConfig = getServletConfig();
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
System.out.println("=====Servlet_1.ServletConfig.InitParameter=====");
while (initParameterNames.hasMoreElements()) {
String parameterName = initParameterNames.nextElement();
String initParameter = servletConfig.getInitParameter(parameterName);
System.out.println(parameterName + ":" + initParameter);
}

System.out.println("=====Servlet_1.ServletContext.InitParameter=====");
ServletContext servletContext = getServletContext();
Enumeration<String> contextInitParameters = servletContext.getInitParameterNames();
while (contextInitParameters.hasMoreElements()) {
String parameterName = contextInitParameters.nextElement();
String initParameter = servletContext.getInitParameter(parameterName);
System.out.println(parameterName + ":" + initParameter);
}

servletContext.setAttribute("message", "Hello World !");

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

2、Servlet_2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.guitu.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet_2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

ServletConfig servletConfig = getServletConfig();
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
System.out.println("=====Servlet_2.ServletConfig.InitParameter======");
while (initParameterNames.hasMoreElements()) {
String parameterName = initParameterNames.nextElement();
String initParameter = servletConfig.getInitParameter(parameterName);
System.out.println(parameterName + ":" + initParameter);
}

System.out.println("=====Servlet_2.ServletContext.InitParameter=====");
ServletContext servletContext = getServletContext();
Enumeration<String> contextInitParameters = servletContext.getInitParameterNames();
while (contextInitParameters.hasMoreElements()) {
String parameterName = contextInitParameters.nextElement();
String initParameter = servletContext.getInitParameter(parameterName);
System.out.println(parameterName + ":" + initParameter);
}

System.out.println("=====servletContext.getAttribute=====");
Object object = servletContext.getAttribute("message");
System.out.println("message:" + object);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

3、web.xml配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<context-param>
<param-name>domain</param-name>
<param-value>guitu18.com</param-value>
</context-param>
<context-param>
<param-name>name</param-name>
<param-value>夜月归途</param-value>
</context-param>
<servlet>
<servlet-name>Servlet_1</servlet-name>
<servlet-class>com.guitu.servlet.Servlet_1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangkuan</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_1</servlet-name>
<url-pattern>/Servlet_1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Servlet_2</servlet-name>
<servlet-class>com.guitu.servlet.Servlet_2</servlet-class>
<init-param>
<param-name>password</param-name>
<param-value>Guitu18</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_2</servlet-name>
<url-pattern>/Servlet_2</url-pattern>
</servlet-mapping>

在Servlet_1和Servlet_2中,分别获得了ServletConfig对象和ServletContext对象;
在web.xml中,也分别为他们配置了不同的初始化参数,同时配置了一个context级的初始化参数;
之后分别在两个Servlet中获取ServletConfig和ServletContext的InitParamer参数;
在Servlet_1中还通过setAttribute向ServletContext域中保存了一条消息message,在Servlet_2中,便可以通过getAttribute获取这条消息;

4、访问两个Servlet,先访问Servlet_1:

1
2
3
4
5
=====Servlet_1.ServletConfig.InitParameter=====
username:zhangkuan
=====Servlet_1.ServletContext.InitParameter=====
domain:guitu18.com
name:夜月归途

再访问Servlet_2:

1
2
3
4
5
6
7
=====Servlet_2.ServletConfig.InitParameter=====
password:Guitu18
=====Servlet_2.ServletContext.InitParameter=====
domain:guitu18.com
name:夜月归途
=====servletContext.getAttribute=====
message:Hello World !

可以看到,每个Servlet拥有自己ServletConfig对象,数据不互通,而ServletContext中的初始化参数和context域中的参数,是所有Servlet共享的,可以使用context域实现数据共享;

明人不说暗话,如果你觉得可以的话,你懂的!