JavaWeb-Servlet(四)ServletContext

接上篇: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而用。

配置格式


<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>name1param-name>
		<param-value>value1param-value>
	context-param>

	<context-param>
		<param-name>name2param-name>
		<param-value>value2param-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(四)ServletContext_第1张图片

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);

注意!这个方法必须以“/”开头!
输出:
在这里插入图片描述

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("

" + servletContext.getAttribute("count") + "

"
); } }

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

你可能感兴趣的:(JavaWeb,javaweb,servlet,ServletContext)