你了解ServletContext吗
ServletContext是Servlet系列中的内容,他的功能是使同一个项目下的Servlet共享数据。
ServletContext是在tomcat启动之时由tomcat创建,tomcat关闭之时由tomcat销毁
ServletContext的四种获取方法
- ServletConfig可通过方法getServletContext可以获取ServletContext对象
- GenericServlet实现了ServletConfig接口,因此在继承GenericServlet和HttpServlet类的类中可以通过方法getServletContext获取ServletContext对象
- 事件ServletContextEvent可通过方法getservletContext获取ServletContext对象
ServletContext的存取操作
ServletContext中有Map集合,在ServletContext中数据和Map一样按二元偶数据存放。
存取方法:
- getAttribute(" ")
- setAttribute(" ",object obj)
代码演示:
在GenericServlet的继承类中存放(”访问量“,1000)
public class BServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
public BServlet() {
super();
}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("正在执行");
ServletContext context = this.getServletContext();
context.setAttribute("访问量", 1000);
}
}
在HttpServlet的继承类中取得键名”访问量“的值1000
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
Integer number = (Integer)this.getServletContext().getAttribute("访问量");
System.out.println(number);
}
}
因为这两个类在同一个项目中,可以实现数据共享。
注意:有相同的键,最后一个键的值将会覆盖前面的值。值的数据类型只能是引用数据类型。
ServletContext用来获取初始化参数
ServletContext和ServletConfig都能获取初始化参数,不同的是ServletConfig获取的是一个Servlet的初始化参数,ServletContext获取的是一个项目的的初始化参数。他们在web.xml上的定义也不相同。
//这个是项目的初始化参数定义格式
<context-param>
<param-name>x</param-name>
<param-value>X</param-value>
</context-param>
但获取初始化参数值的方法是相同的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
String str = this.getServletContext().getInitParameter("x");
System.out.println(str);
}
ServletContext获取资源路径和资源流
当这个项目交付客户使用时不能确定他会将资源存在哪里,所以不能直接设置文件路径,需要动态获取。
需要注意的是这里只能获取该ServletContext所在项目内的文件所在位置。
String str = this.getServletContext().getRealPath("/AServlet.java");
System.out.println(str);
获取资源流
InputStream input = this.getServletContext().getResourceAsStream(str);
网站访问量统计小例
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null) {
application.setAttribute("count", 1);
}else {
application.setAttribute("count", count+1);
}
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("uft-8");
PrintWriter pr = response.getWriter();
pr.print("本网站访问量:"+count);
}
}