ServletContext (Servlet上下文)
1.可以理解为servlet运行的背景((环境)
2.ServletContext指的就是Tomcat
3.每当Tomcat加载完一个项目之后,会马上创建一个ServletContext对象,在内存中唯一代表该项目
package web;
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 ServletContextDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext
//1、可直接调用get方法,且本身没有此方法,可知get方法是继承自父类的
ServletContext sc = getServletContext();
//ServletContext sc2 = request.getServletContext();
//System.out.println("sc==sc2?"+(sc==sc2)); //true
//利用session统计登录人数
Integer count1 = (Integer)request.getSession().getAttribute("count");
if(count1 == null) {
count1 = 1;
}else{
count1++;
}
request.getSession().setAttribute("count", count1);
response.getWriter().write("session="+count1+" ");
//利用ServletContext统计登录人数
Integer count2 = (Integer)sc.getAttribute("count");
if(count2 == null) {
count2 = 1;
}else {
count2++;
}
sc.setAttribute("count", count2);
response.getWriter().write("ServletContext="+count2);
}
}
1)常用功能
可以在整个项目内部实现数据的共享,当前项目中所有组件都可以直接访问到同一个ServletContext对象
- 1.ServletContext不能替代Session,因为所有用户访问的都是同一个ServletContext对象,不同用户保存的数据会彼此覆盖
- 2.ServletContext中适合保存整个项目通用的一些数据,例如项目总的登录人数
- 3.如何选择:
- 1.数据是不同用户都相同,还是每个用户不同:相同->ServletContext
- 2.数据共享是否跨请求?跨请求->Session,不跨请求->Request
- 4.获取一个资源在服务器硬盘上的绝对路径
package web;
import java.io.File;
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 ServletContextDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
File file = new File("config.xml");
System.out.println("path1="+file.getAbsolutePath());
File file2 = new File("/config.xml");
System.out.println("path2="+file2.getAbsolutePath());
//ClassLoader
ServletContext sc = getServletContext();
//getRealPath()方法获取的是 webapp 下的文件的绝对路径
//()里的路径为相对于webapp的相对路径
String path3 = sc.getRealPath("1.jsp");
System.out.println("path3="+path3);
String path4 = sc.getRealPath("WEB-INF/web.xml");
System.out.println("path4="+path4);
}
}
以上结果为:
2)常用API
- 1.在Servlet中获取ServletContext对象:
ServletContext sc=getServletContext();
ServletContext sc=request.getServletContext();
ServletContext sc=getServletConfig().getServletContext();
- 2.数据操作:
sc.setAttribute(String name,object value);
object value=sc.getAttribute(String name);
sc.removeAttribute(String name);