ServletContext接口
- Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。
- 由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为 application 对象(Web应用程序对象)。
- 功能:
- 获取WEB应用程序的初始化参数
- 记录日志
- application域范围的属性
- 访问资源文件
- 获取虚拟路径所映射的本地路径
- WEB应用程序之间的访问
- ServletContext的其他方法
测试代码
package com.mac;
import java.io.IOException;
* ServletConfig对象:
/*
* ServletContext对象:
*
* 1.获取当前web应用的初始化参数
* 1.1.方法:
* getInitParameter(String name)
* getInitParameterNames(),和ServletConfig里面的两个方法是一样的)
* . 1.2.通过ServletContext获取的初始化参数和通过ServletConfig获取的初始化参数的区别:
* ServletContext所获取的参数是在全局的,是所有Servlet都可以获取的
* ServletConfig获取的参数在某个servlet-name下面的,只有这个Servlet可以获取到
* 2.获取当前的web应用(就是WebContent下面)的某个文件的绝对路径(在服务器上的路径)
* 2.1.方法:getRealPath(String relativePath)
* 3.获取当前Web应用的名称
* 3.1.方法:getContextPath()
* 4.获取当前Web应用的某个文件的输入流
* 4.1.方法:getResourceAsStream(String filePath)
* 5.和Atttribute相关的方法,后面再写
*/
public class HelloServlet implements Servlet{
@Override
public void destroy() {
System.out.println("销毁Servlet对象~~~~");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("获取Servlet配置~~~~");
return null;
}
@Override
public String getServletInfo() {
System.out.println("获取Servlet信息~~~~");
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
/*
* public ServletContext getServletContext()
* 返回对调用者在其中执行操作的 ServletContext 的引用。
* return 一个 ServletContext 对象,调用者用于与其 servlet 容器交互
*/
/*
* ServletContext对象:
* 定义一组方法,servlet 使用这些方法与其 servlet 容器进行通信,例如,获取文件的 MIME 类型、
* 分发请求或写入日志文件。每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文。(“Web 应用程
* 序”是 servlet 和内容的 Collection,这些 servlet 和内容安装在服务器的 URL 名称空间
* (比如 /catalog)的特定子集下,并且可能通过 .war 文件安装。)
* 如果 Web 应用程序在其部署描述符中标记为 "distributed",那么每个虚拟机都将有一个上下文实例。
* 在这种情况下,不能将上下文用作共享全局信息的位置(因为该信息不会是真正全局共享的)。请使用外部资
* 源(如数据库)替代。
* ServletContext 对象包含在 ServletConfig 对象中,ServletConfig 对象在初始化 servlet 时
* 由 Web 服务器提供给 servlet。
*/
//1.获取ServletContext对象
ServletContext servletContext = config.getServletContext();
//2.获取web初始化参数值(web.xml里面的 context-param下面的name和value)
String jdbcURL = servletContext.getInitParameter("jdbcURL");
String driver = servletContext.getInitParameter("driver");
System.out.println("-----------------------------------------");
System.out.println("driver: " + driver);
System.out.println("jdbcURL: " + jdbcURL);
System.out.println("-----------------------------------------");
//3.获取所有的param-name
Enumeration initParameterNames = servletContext.getInitParameterNames();
while( initParameterNames.hasMoreElements() ) {
String name = initParameterNames.nextElement();
System.out.println("names: " + name);
}
System.out.println("-----------------------------------------");
/*
* public String getRealPath(String path)
* 为给定虚拟路径返回包含实际路径的 String。
* 例如,可以通过对 "http://host/contextPath/index.html" 的请求使路径 "/index.html" 返回服务器文件系统上的
* 绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。
* 将采用与正在其上运行 servlet 容器的计算机和操作系统相适应的形式返回实际路径
* (包括采用适当的路径分隔符)。如果 servlet 容器由于某种原因无法将虚拟路径转换为实际路径
* (例如正从 .war 归档文件中获得内容时),则此方法返回 null。
* path 指定虚拟路径的 String
* return 指定实际路径的 String,如果无法执行转换,则返回 null。
*/
//4.获取当前的web应用(就是WebContent下面)的某个文件的绝对路径(在服务器上的路径)
String path = servletContext.getRealPath("test.txt");
System.out.println("test.txt: " + path);
//test.txt: /Users/mac/Documents/StudyWork/code/JavaWeb/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/005_ServletContext/test.txt
System.out.println("-----------------------------------------");
/*
* public String getContextPath()
* 返回 Web 应用程序的上下文路径。
* 上下文路径是用来选择请求上下文的请求 URI 的一部分。请求 URI 中首先出现的总是上下文路径。
* 路径以 "/" 字符开头但不以 "/" 字符结束。对于默认(根)上下文中的 servlet,此方法返回 ""。
* servlet 容器可能通过多个上下文路径匹配一个上下文。在这种情况下,getContextPath() 将返回该请求
* 使用的实际上下文路径,它可能不同于此方法返回的路径。此方法返回的上下文路径应该被认为是应用程序的
* 主要或首选上下文路径。
* return Web 应用程序的上下文路径;对于默认(根)上下文,返回 ""
*/
//5.获取当前Web应用的名称
String webName = servletContext.getContextPath();
System.out.println("contextPath: " + webName);
// /003_FirstServlet
System.out.println("-----------------------------------------");
//6.获取当前web应用中的某个文件的输入流(根目录是当前web应用的目录,这里是/005_ServletContext)
InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/test.properties");
//注意,这里是实际路径上的,文件最后是放在classes下面的
//注意,classes虽然是在build下面,但是映射到WEB-INF下面的,可以这么访问
System.out.println("file: " + is);
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("Servlet服务~~~~");
}
public HelloServlet() {
System.out.println("构造器~~~~");
}
}
运行结果
信息: Starting Servlet Engine: Apache Tomcat/7.0.81
构造器~~~~
-----------------------------------------
driver: com.mysql.jdbc.Driver
jdbcURL: jdbc:mysql:///test
-----------------------------------------
names: driver
names: jdbcURL
-----------------------------------------
test.txt: /Volumes/Study/code/JavaWeb/Course/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Course_005_ServletContext/test.txt
-----------------------------------------
contextPath: /003_FirstServlet
-----------------------------------------
file: java.io.FileInputStream@7443cf39
十月 17, 2017 11:33:21 上午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
构造器~~~~
Servlet初始化~~~~参数: org.apache.catalina.core.StandardWrapperFacade@45887fe0
十月 17, 2017 11:33:21 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
十月 17, 2017 11:33:21 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
十月 17, 2017 11:33:21 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in 627 ms
Servlet服务~~~~
完整源码下载:
关注下方微信公众号,并回复:ServletContext.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top