ServletContext上下文对象。---->解耦合(通过它实现Servlet之间的传递数据)
一个项目只有一个ServletContext对象!
我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!
1.ServletContext概述
服务器会为每个应用创建一个ServletContext对象;
*ServletContext对象的创建是在服务器启动时完成的;
*ServletContext对象的销毁是在服务器关闭时完成的。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
2.获取ServletContext
ServletConfig#getServletContext();
GenericServlet#getServletContext();
HttpSession#getServletContext();------>先不着急学
ServletContextEvent#getServletContext();------>先不着急学
在Servlet中获取ServletContext对象:
*在void init(ServletConfig config)中:ServletContext context=config.getServletContext();,
ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
在GenericServlet或HttpServlet中获取ServletContext对象:
*GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
3.域对象的功能
ServletContext是JavaWeb四大域对象之一:
**PageContext;
**ServletRequest;
**HttpSession;
**ServletContext;
所有域对象都有存取数据的功能,因为域对象内部有一个Map(键不能相同),用来存取数据,下面是ServletContext对象用来操作数据的方法:
**void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute("xxx","XXX"),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
**Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value=(String)servletContext.getAttribute("xxx");,获取名为xxx的域属性;
**void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
**Enumeration getAttributeNames():获取所有域属性的名称;
代码演示:
AServlet.java向ServletContext里存入数据
1 package one.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class AServlet extends HttpServlet { 13 14 15 public void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws ServletException, IOException { 17 /* 18 * 1.获取ServletContext对象 19 * 2.调用其setAttribute()方法完成保存数据 20 * */ 21 //直接获取,是从父类继承过来的方法 22 ServletContext application=this.getServletContext(); 23 application.setAttribute("name", "张三"); 24 System.out.println("存入成功"); 25 } 26 }
BServlet.java从ServletContext中读数据
1 package one.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class BServlet extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 /* 17 * 1.获取ServletContext对象 18 * 2.然后在getAttribute();得到数据 19 * */ 20 ServletContext application=this.getServletContext(); 21 String value = (String)application.getAttribute("name"); 22 System.out.println("我是BServlet:"+value); 23 } 24 }
先在浏览器中请求AServlet,它会存入数据;然后再请求BServlet,可以从中读数据。
4.获取应用初始化参数
*servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个servlet只能获取自己的初始化参数,不能获取其他servlet的参数,即初始化参数只为一个Servlet准备!
*可以配置公共的初始化参数,为所有的Servlet而用!这需要使用ServletContext才能使用!
web.xml
1 <web-app...> 2 <context-param> 3 <param-name>AAA</param-name> 4 <param-value>aaa</param-value> 5 </context-param> 6 <context-param> 7 <param-name>BBB</param-name> 8 <param-value>bbb</param-value> 9 </context-param> 10 <web-app>
CServlet.java
1 package one.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Enumeration; 6 7 import javax.servlet.ServletContext; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 public class CServlet extends HttpServlet { 14 15 16 public void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 //演示得到公共的参数 19 ServletContext app=this.getServletContext(); 20 String path = app.getContextPath();//返回web应用程序的上下文路径。 21 System.out.println(path); 22 String initParameter1 = app.getInitParameter("AAA"); 23 String initParameter2 = app.getInitParameter("BBB"); 24 Enumeration<String> initParameterNames = app.getInitParameterNames(); 25 26 System.out.println(initParameter1); 27 System.out.println(initParameter2); 28 29 while(initParameterNames.hasMoreElements()){ 30 System.out.println(initParameterNames.nextElement()); 31 } 32 } 33 }
请求CServlet之后控制台的结果:
/XJS_Servlet2 aaa bbb BBB AAA
还可以使用ServletContext来获取web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同:
5.获取资源相关方法
5.1获取(任意资源的)真实路径
还可以使用ServletContext对象来获取web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
*获取a.txt的真实路径:String realPath=ServletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt
5.2获取资源流
不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
*获取a.txt资源流:InputStream in=servletContext.getResourceAsStream("/a.txt");
*获取b.txt资源流:InputStream in=servletContext.getResourceAsStream("/WEB-INF/b.txt");
代码示例:
1 package one.servlet; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class DServlet extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 //得到这个文件的资源路径(带盘符的) 16 String path=this.getServletContext().getRealPath("/a.txt"); 17 System.out.println(path); 18 19 //InputStream in=new FileInputStream(path); 20 //获取资源的路径后,再创建出输入流对象! 21 InputStream in=this.getServletContext().getResourceAsStream("/a.txt"); 22 byte[] b=new byte[1024]; 23 int n=0; 24 while((n=in.read(b))!=-1){ 25 //把字节转换成String 26 String s=new String(b,0,n);//String类的一个构造方法 27 System.out.println(s); 28 } 29 in.close();//关闭文件流 30 } 31 }
请求该DServlet后控制台的结果:
G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt I Love IU! dddddddddd
5.3获取指定目录下所有资源路径
还可以使用ServletContext获取指定目录下所有资源路径,例如获取 / WEB-INF 下所有资源的路径:
Set set = context.getResourcePaths("/WEB-INF"); System.out.println(set); =============结果====================== [/WEB-INF/lib/ , /WEB-INF/classes/ , /WEB-INF/web.xml]
注意:本方法必须以“ /”开头!!!