天天看点

JavaWeb-Servlet(四)ServletContextServletContext

接上篇:JavaWeb-Servlet(三)Servlet的一些细节

在正文之前,补充一点。

  • Servlet与反射

    当客户端发送请求,服务器接收到请求,根据web.xml中的信息得到要响应的servlet类,这时得到的是一个类名的字符串,所以要利用反射来完成后续的工作。

ServletContext

1. ServletContext概述

服务器会为每个应用创建一个ServletContext 对象::

  • ServletContext 对象的创建是在服务器启动时完成的;
  • ServletContext 对象的销毁是在服务器关闭时完成的。

一个项目只有一个ServletContext对象!

ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet 中向ServletContext对象中保存一个值, 然后在BServlet中就可以获取这个值,这就是共享数据了。

2.获取ServletContext

在Servlet中获取ServletContext 对象:

  • 在void init(ServletConfig config)中:

    ServletContext context =config.getServletContext()

    ,
  • ServletConfig类的

    getServletContext()

    方法可以用来获取ServletContext 对象。

在GenericServlet或HttpServlet中获取ServletContext对象:

  • GenericServlet类有

    getServletContext()

    方法 ,所以可以直接使用

    this.getServletContext()

    来获取。

3.域对象的功能

ServletContext是JavaWeb四大域对象之一。

  • PageContext;
  • ServletRequest;
  • HttpSession;
  • ServletContext;

所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:

  • void setAttribute(String name, Object value)

    :用来存储一个对象,也可以称之为存储一个域属性,例如:

    servletContetxtAttribute("xxx", “XXX")

    ,在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同。
  • Object gettribute(String name)

    :用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:

    String value = (String)servletContextAttribute("xxx");

    ,获取名为xxx的域属性;
  • void removeAttribute(String name)

    :用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
  • Enumeration getAttributeNames()

    :获取所有域属性的名称。

4.获取应用初始化参数

Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备。

还可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数,即配置公共的初始化参数,为所有Servlet而用。

配置格式

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	......
	
	<context-param>
		<param-name>name1</param-name>
		<param-value>value1</param-value>
	</context-param>

	<context-param>
		<param-name>name2</param-name>
		<param-value>value2</param-value>
	</context-param>
	
	......
	
</web-app>

           

示例

public class AServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		/*
		 * 1.得到ServletContext 
		 * 2.调用它的getInitParameter(String name)方法得到初始化参数
		 */

		ServletContext context = this.getServletContext();
		String initParameter = context.getInitParameter("name1");
		System.out.println(initParameter);
	}
}
           

5.获取资源的相关方法

JavaWeb-Servlet(四)ServletContextServletContext

1) 获取真实路径

还可以使用ServletContext对象来获取Web应用下的资源,例如在应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

  • 获取a.txt的真实路径:

    String realPath = servletContext.getRealPath("/a.txt");

    , realPath的值为a.txt文件的绝对路径: F:\tomcat7\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");

3) 获取指定目录下所有资源路径

还可以使用ServletContext 获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径:

ServletContext context = this.getServletContext();
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
           

注意!这个方法必须以“/”开头!

输出:

JavaWeb-Servlet(四)ServletContextServletContext

6.案例:访问量统计

一个项目中所有的资源访问都要对访问量进行了累加!

创建一个int类型的变量,用来保存访问量,然后保存到ServletContext的域中,这样可以让所有的Servlet都可以访问到。

  • 最初,ServletContext中没有访问量相关的属性,
  • 当本站第一次被访问的时候,创建一个变量,设置其值为1,保存到ServletContext中;
  • 当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础之上加1。
public class AServlet extends HttpServlet {

	/**
	 * 统计网站访问量
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 获取ServletContext对象
		ServletContext servletContext = this.getServletContext();

		// 从ServletContext对象中获取名为count的属性
		Integer count = (Integer) servletContext.getAttribute("count");

		// 如果存在,给访问量加1,然后保存回去
		// 如果不存在,说明是第一次访问。向ServletContext中保存名为count的属性,值为1
		if (count == null) {
			servletContext.setAttribute("count", 1);
		} else {
			servletContext.setAttribute("count", count + 1);
		}

		// 向浏览器输出:需要使用响应对象
		PrintWriter pw = response.getWriter();
		pw.print("<h1>" + servletContext.getAttribute("count") + "</h1>");

	}
}
           

不过服务器重启的话,计数就会被重置。