一、简介
ServletContext对象代表了我们的项目,名字就暗示出该对象的范围,一个web项目中只存在一个ServletContext对象,该对象的启动是随着项目的启动而启动,项目的停止而销毁。
二、创建
Servlet的创建有通常有四种方式:
1.ServletConfig类的getServletContext()方法
2.GenericServlet类的getServletContext()方法
3.HttpSession类的getServletContext()
4.ServletContextEvent类的getServletContext()方法
三、功能
1.获得全局配置参数
比如在web.xml的第一目录下有这么一段代码:
图1 web.xml中的<context-param>标签
那么就可以通过ServletContext对象读取到相应的参数,代码如下:
import java.io.IOException;
import java.util.Enumeration;
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 EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1 获得servletContext对象
ServletContext sc = getServletContext();
//2 获得配置中的信息
String name = sc.getInitParameter("name");
Enumeration<String> en = sc.getInitParameterNames();
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println(key+"==>"+sc.getInitParameter(key));
}
}
}
2.Servlet之间就可以通信
①要通信的内容
import java.util.HashMap;
import java.util.Map;
//要通信的内容实体
public class Constant {
public static String word;
public static Object obj;
public static Map<String,Object> map = new HashMap<String,Object>();
}
②通信类A
import java.io.IOException;
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 FServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 写一句话 ,让GServlet知道
Constant.word = "i love so so much!";
//送给FServlet东西
Constant.obj = "BMW";
//送女神一堆货
Constant.map.put("car", "QQ");
Constant.map.put("bag", "七匹狼");
//使用servletContext
//1 获得servletContext对象
ServletContext sc = getServletContext();
//2操作sc对象中的map,存入键值对
sc.setAttribute("car", "mashaladi");
sc.setAttribute("bag", "coach");
}
}
import java.io.IOException;
import java.io.PrintWriter;
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 GServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//FServlet向我表白了. 我要看看说了什么.
System.out.println("FServlet对我说"+Constant.word);
System.out.println("FServlet送给我:"+Constant.obj);
//从集合取
System.out.println(Constant.map.get("car"));
System.out.println(Constant.map.get("bag"));
//GServlet从servletContext中 取出FServlet送的礼物
//1 获得servletContext
ServletContext sc = getServletContext();
//2根据键取出值
System.out.println("使用sc对象获得的值:"+sc.getAttribute("car"));
}
}
3.使用该对象获得项目中的一些资源
//获得servletcontext
ServletContext sc = getServletContext();
//1>根据一个相对路径,获得 资源的流. 相对路径: 相对于项目根下.
InputStream is = sc.getResourceAsStream("/WEB-INF/stu.xml");
System.out.println(is);
//2>根据一个相对路径获得一个绝对路径. 相对路径: 同上
String path = sc.getRealPath("/WEB-INF/stu.xml");
System.out.println("绝对路径:"+path);<span style="white-space:pre"> </span>
//3>获得当前servlet 所在目录下的stu.xml
this.getClass().getResourceAsStream("stu.xml");
总结:
学习ServletContext的过程中,联想到学习MVC的时候不同Controller之间进行数据通信的TempData,都是对同一类性质的不同对象进行通信的,所以了解起来并不困难。在学习java的开始阶段,几个servlet相关的类很容易混淆,但是重复还是真理,遇见的多了,熟悉了,自然也就了解了。