一、ServletContext概述
服务器会为每个应用创建一个ServletContext对象:
ServletContext对象的创建是在服务器启动时完成的;
ServletContext对象的销毁是在服务器关闭时完成的。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
简单说就是:一个项目只有一个ServletContext对象!
我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!
二、在Servlet中获取ServletContext对象:
1、在void init(ServletConfig config)中:ServletContext context = config.getServletContext();,ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
2、在GenericeServlet或HttpServlet中获取ServletContext对象:
GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
但不仅仅是只有这两种,还有其他的
三、域对象的功能:域对象就是用来在多个Servlet中传递数据!!!
1、域对象必须有要存数据功能
2、域对象必须要有取数据功能
3、域对象内部其实有一个Map
JavaWeb四大域对象之一:
1、 PageContext;
2、 ServletRequest;
3、 HttpSession;
4、 ServletContext;
ServletContext对象用来操作数据的方法:
1、 void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
2、 Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
3、void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
4、 Enumeration getAttributeNames():获取所有域属性的名称;
//首先后去ServletContext对象,然后往里面存数据
ServletContext application = this.getServletContext();
application.setAttribute("name", "Sakura");
//获取ServletContext对象,从里面取数据
ServletContext application = this.getServletContext();
//返回值是Object类型,所以要进行强转
String str = (String)application.getAttribute("name");
System.out.println(str);
四、获取应用初始化参数
1、Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!
2、可以配置公共的初始化参数,为所有Servlet而用!这需要使用ServletContext才能使用!
配置公共的初始化参数需要在web.xml中进行配置
<context-param>
<param-name>paramName1</param-name>
<param-value>paramValue1</param-value>
</context-param>
<context-param>
<param-name>paramName2</param-name>
<param-value>paramValue2</param-value>
</context-param>
ServletContext context = this.getServletContext();
String value1 = context.getInitParameter("paramName1");
String value2 = context.getInitParameter("paramName2");
System.out.println(value1 + ", " + value2);
Enumeration names = context.getInitParameterNames();
while(names.hasMoreElements()) {
System.out.println(names.nextElement());
}
五、获取资源的相关方法
1、获取真实路径(*)
还可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。获取带有盘符的路径
获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;
获取b.txt的真实路径:String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”);
2、获取资源流
不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
获取a.txt资源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);
获取b.txt资源流:InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);
六、小练习——网站访问量统计
思路:当项目中的资源被访问时,就把定义的那个统计量加一,而所以这个统计量应该保存到可以让整个项目共享的地方去,最适合的就是保存到ServletContext中。
最初时,ServletContext中没有保存访问量相关的属性;
当本站第一次被访问时,创建一个变量,设置其值为1;保存到ServletContext中;
当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础之上加1。
ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null){
application.setAttribute("count", 1);
}else{
application.setAttribute("count", count+1);
}
//向页面输出,resp是响应对象
PrintWriter pw = resp.getWriter();
pw.print(application.getAttribute("count"));
七、获取类路径资源
获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes(现在只需要学这一个就可以)和/WEB-INF/lib/每个jar包!
Class类的getResourceAsStream(String path):
路径以“/”开头,相对classes路径;
路径不以“/”开头,相对当前class文件所有路径,例如在cn.itcast.servlet.MyServlet中执行,那么相对/classes/cn/itcast/servlet/路径;
ClassLoader类的getResourceAsStream(String path):
相对classes路径;
InputStream in = this.getClass().getResourceAsStream("/xxx.txt");
System.out.println(IOUtils.toString(in));
InputStream in = this.getClass().getClassLoader().getResourceAsStream("xxx.txt");
System.out.println(IOUtils.toString(in));