ServletContext(重要)

ServletContext上下文对象。---->解耦合(经过它实现Servlet之间的传递数据)java

  一个项目只有一个ServletContext对象!web

  咱们能够在N多个Servlet中来获取这个惟一的对象,使用它能够给多个Servlet传递数据!apache

  与天地同寿!!!这个对象在Tomcat启动时就建立,在Tomcat关闭时才会死去!浏览器

1.ServletContext概述

服务器会为每一个应用建立一个ServletContext对象;tomcat

*ServletContext对象的建立是在服务器启动时完成的;服务器

*ServletContext对象的销毁是在服务器关闭时完成的。app

  ServletContext对象的做用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,而后在BServlet中就能够获取这个值,这就是共享数据了。webapp

2.获取ServletContext

ServletConfig#getServletContext();this

GenericServlet#getServletContext();spa

HttpSession#getServletContext();------>先不着急学

ServletContextEvent#getServletContext();------>先不着急学

 

Servlet中获取ServletContext对象:

  *在void init(ServletConfig  config)中:ServletContext  context=config.getServletContext();,

   ServletConfig类的getServletContext()方法能够用来获取ServletContext对象;

GenericServletHttpServlet中获取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:\Tomcat\apache-tomcat-8.0.28\webapps\XJS_Servlet2\a.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:\Tomcat\apache-tomcat-8.0.28\webapps\XJS_Servlet2\a.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]

注意:本方法必须以“ /”开头!!! 

相关文章
相关标签/搜索