1ServletContext概述
关于ServletContext 记住4句话:
服务器会为每个应用创建一个ServletContext对象
一个项目只有一个ServletContext对象
可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet之间传递数据
生命周期 与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!即
通常使用ServletContext对象可以在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
2获取ServletContext
获取servletcontext 常用的4方式
1、ServletConfig-getServletContext();
通过ServletConfig对象调用方法getServletContext()得到ServletContext对象
2、GenericServlet或者HttpServlet-getServletContext();
通过GenericServlet或者HttpServlet对象调用方法getServletContext()得到ServletContext对象
3、HttpSession-getServletContext()
4、ServletContextEvent-getServletContext()
前两种方式,其实 都是通过Tomcat在调用Servlet声明周期方法init(ServletConfig config)的时候 所传递的ServletConfig 对象来调用其实例方法 ServletContext getServletContext() 得到的!
在Servlet中获取ServletContext对象:
在void init(ServletConfig config)中:
ServletContext context = config.getServletContext();,
ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
在GenericeServlet或HttpServlet中获取ServletContext对象:
GenericServlet类 实现了接口ServletConfig ,
就实现了getServletContext()方法,通过源代码可以看到最终还是通过ServletConfig对象(Tomcat在调用Servlet声明周期方法init(ServletConfigconfig)的时候 所传递的ServletConfig 对象)来调用getServletContest()方法;
具体代码:
public class MyServlet implements Servlet {
public void init(ServletConfig config) {
ServletContext context = config.getServletContext();
}
…
}
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletContext context = this.getServletContext();//HttpServlet就是ServletConfig 的实类
或者
ServletContext context = this.getServletConfig().getServletContext();
}
}
得到ServletContext对象之后怎么来使用呢?
3域对象的功能
ServletContext对象是JavaWeb四大域对象之一,
JavaWeb的四大域的类为:
PageContext;
ServletRequest;
HttpSession
ServletContext;
所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据。这种通过封装Map来实现数据存储的api,也是java语言中常见的。
总结:
域对象就是用来在多个Servlet中传递数据!!
域对象必须有要存数据功能
域对象必须要有取数据功能
域对象内部其实有一个Map
下面是ServletContext对象用来操作数据的方法:
存:void setAttribute(Stringkey, Object value):
用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。
请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
取:Object getAttribute(String key):
用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:
**String value = (String)servletContext.getAttribute(“xxx”); (这个方法的返回值类型为Object 所以需要强转),获取名为xxx的域属性。**其中参数那么类似于Map中的key值;
**void removeAttribute(String key):**用来移除ServletContext中参数name对应的域属性,类似于Map中的remove方法,删除一对(key, value)。如果参数name指定的域属性不存在,那么本方法什么都不做;
Enumeration getAttributeNames():获取所有域属性的名称;