了解ServletContext

你了解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);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44078014/article/details/106203982