小言_互联网的博客

JavaWeb核心技术系列教程(08)——ServletContext

194人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

ServletContext接口概述

ServletContext接口是Servlet程序与Servlet容器之间进行通信的接口。Servlet容器在启动 Web应用时,会为其创建与之对应的ServletContext对象。每个Web应用都有一个唯一的ServletContext对象,它代表了当前Web应用。当Servlet容器初始化Servlet对象时,ServletContext对象随着ServletConfig对象提供给了Servlet。我们可通过ServletConfig对象的getServletContext( )方法获取ServletContext对象;除此以外,在HttpServlet中还可通过getServletContext( )方法直接获取ServletContext。

为了便于理解,我们可把ServletContext对象形象地理解为Web应用的管家。同一个Web应用中的所有Servlet对象都共享同一个管家,Servlet对象们也可通过这个管家来访问容器中的各种资源。

接下来,我们通过示例的方式介绍ServletContext接口的常见应用场景及其使用方式。

利用ServletContext接口获取Web应用参数

在web.xml文件中,不仅可以配置Servlet的初始化信息,还可配置整个Web应用的参数信息。

接下来,我们来通过示例获取Web应用参数。

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletContext1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>testServletContext</servlet-name>
    <servlet-class>cn.com.TestServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>testServletContext</servlet-name>
    <url-pattern>/testServletContext</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </context-param>
  <context-param>
    <param-name>size</param-name>
    <param-value>200</param-value>
  </context-param>
</web-app>

在该示例中使用context-param标签配置整个Web应用的参数信息。

TestServletContext如下:

package cn.com;

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 *
 * 利用ServletContext获取Web应用初始化参数
 */
public class TestServletContext extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("deGet()");
		ServletContext servletContext = this.getServletContext();
		// 获取所有的初始化参数名
		Enumeration<String> parameterNames = servletContext.getInitParameterNames();
		while (parameterNames.hasMoreElements()) {
			String parameterName = parameterNames.nextElement();
			// 获取参数对应的值
			String parameterValue = servletContext.getInitParameter(parameterName);
			System.out.println(parameterName + "=" + parameterValue);
		}
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("dePost()");
		this.doGet(request, response);
	}
}

index.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

页面如下:

访问Servlet其url为 http://localhost:8080/ServletContext1/testServletContext ,结果如下:

利用ServletContext接口实现多个Servlet共享数据

在Web应用中所有Servlet共享同一个ServletContext对象。所以,我们可将数据存放在ServletContext域(范围)中,从而实现多个Servlet共享数据。ServletContext接口中与域属性相关常用方法如下:

Enumeration< String > getAttributeNames( )

该方法返回一个Enumeration对象,该对象包含所有存放在 ServletContext中的所有域属性名

public Object getAttribute(String name)

该方法根据参数指定的属性名返回一个与之匹配的域属性值

public void setAttribute(String name, Object object)

该方法用于设置ServletContext的域属性。其中,name是域属性名, obj是域属性值

public void removeAttribute(String name)

该方法根据参数指定的域属性名从ServletContext中删除匹配的域属性

接下来,我们来通过示例实现多个Servlet共享数据。

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletContext2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>testServletContext1</servlet-name>
    <servlet-class>cn.com.TestServletContext1</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>testServletContext1</servlet-name>
    <url-pattern>/testServletContext1</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>testServletContext2</servlet-name>
    <servlet-class>cn.com.TestServletContext2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>testServletContext2</servlet-name>
    <url-pattern>/testServletContext2</url-pattern>
  </servlet-mapping>
</web-app>

在该web.xml文件中共配置了两个Servlet。

TestServletContext1如下:

package cn.com;

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;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 利用ServletContext保存数据
 */
public class TestServletContext1 extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("deGet()");
		//获取ServletContext
		ServletContext servletContext = this.getServletContext();
		//向ServletContext中保存数据
		servletContext.setAttribute("username", "lucy");
		response.getWriter().write("This response come from the fisrt HttpServlet");	
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("dePost()");
		this.doGet(request, response);
	}
}

TestServletContext2如下:

package cn.com;

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;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 利用ServletContext获取数据
 */
public class TestServletContext2 extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("deGet()");
		//获取ServletContext
		ServletContext servletContext = this.getServletContext();
		//从ServletContext中获取数据
		String username = (String)servletContext.getAttribute("username");
		response.getWriter().write("This response come from the second HttpServlet <br/>");
		response.getWriter().write("username="+username);	
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("dePost()");
		this.doGet(request, response);
	}
}

index.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

页面如下:

我们先来访问TestServletContext1,其url为 http://localhost:8080/ServletContext2/testServletContext1

结果如下:

我们再来访问TestServletContext2,其url为 http://localhost:8080/ServletContext2/testServletContext2

结果如下:

利用ServletContext接口读取Web应用的资源文件

我们可利用ServletContext读取Web应用的资源,例如:图片,配置文件等等。ServletContext接口与资源文件读取相关常用方法如下:

public Set< String > getResourcePaths(String path)

该方法返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。请注意:参数path必须以正斜线/开始,指定资源的部分路径

public String getRealPath(String path)

该方法返回资源文件在服务器文件系统上的真实路径(绝对路径)。参数path代表资源文件的虚拟路径,该参数应该以正斜线/开始,/表示当前Web应用的根目录。

public URL getResource(String path) throws MalformedURLException

该方法返回资源文件对应的URL对象。参数path必须以正斜线/开始,/表示当前Web应用的根目录。

public InputStream getResourceAsStream(String path)

该方法返回某个资源文件对应的InputStream输入流对象。参数path必须以正斜线/开始,/表示当前Web应用的根目录。

我们来看一个例子,项目结构如下:

  • 在WEB-INF目录下创建city.txt
  • 在WebContent目录下创建name.txt
  • 在WebContent目录下创建test.properties

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletContext4</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>testServletContext</servlet-name>
    <servlet-class>cn.com.TestServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>testServletContext</servlet-name>
    <url-pattern>/testServletContext</url-pattern>
  </servlet-mapping>
</web-app>

TestServletContext如下:

package cn.com;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 利用ServletContext操作资源
 * 1、获取资源真实路径
 * 2、获取资源流
 * 3、获取指定目录下所有资源路径
 * 4、读取属性文件中的内容
 */
public class TestServletContext extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("deGet()");
		ServletContext servletContext = this.getServletContext();
		PrintWriter writer = response.getWriter();
		writer.write("<!DOCTYPE html>");
		writer.write("<html>");
		writer.write("<head>");
		writer.write("<meta charset=\"UTF-8\">");
		writer.write("<title>Servlet</title>");
		writer.write("</head>");
		writer.write("<body>");
		getResourceRealPath(servletContext, response);
		getResourceStream(servletContext, response);
		getAllResourcePath(servletContext, response);
		getPropertyFileContent(servletContext,response);
		writer.write("</body>");
		writer.write("</html>");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("dePost()");
		this.doGet(request, response);
	}
	
	//获取资源真实路径
	public void getResourceRealPath(ServletContext servletContext,HttpServletResponse response) {
		try {
			PrintWriter writer = response.getWriter();
			String namePath = servletContext.getRealPath("/name.txt");
			String cityPath = servletContext.getRealPath("/WEB-INF/city.txt");
			writer.write("namePath="+namePath+"<br/><br/>");
			writer.write("cityPath="+cityPath+"<br/><br/>");
			writer.write("---------------------<br/><br/>");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	//获取资源输入流
	public void getResourceStream(ServletContext servletContext,HttpServletResponse response) {
		try {
			PrintWriter writer = response.getWriter();
			InputStream nameInputStream = servletContext.getResourceAsStream("/name.txt");
			InputStream cityInputStream = servletContext.getResourceAsStream("/WEB-INF/city.txt");	
			
			byte[] nameByteArray=new byte[1024*1];
			int nameLen = nameInputStream.read(nameByteArray);
			String nameContent=new String(nameByteArray,0,nameLen);
			
			byte[] cityByteArray=new byte[1024*1];
			int cityLen = cityInputStream.read(cityByteArray);
			String cityContent=new String(cityByteArray,0,cityLen);
			
			writer.write("nameContent="+nameContent+" , cityContent="+cityContent+"<br/><br/>");	
			writer.write("---------------------<br/><br/>");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	//获取指定目录下所有资源路径
	public void getAllResourcePath(ServletContext servletContext,HttpServletResponse response) {
		try {
			PrintWriter writer = response.getWriter();
			Set<String> pathSet = servletContext.getResourcePaths("/WEB-INF");
			Iterator<String> iterator = pathSet.iterator();
			while(iterator.hasNext()) {
				String path = iterator.next();
				writer.write(path+"<br/>");
			}
			writer.write("---------------------<br/><br/>");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	//读取属性文件中的内容
	public void getPropertyFileContent(ServletContext servletContext,HttpServletResponse response) {
		try {
			PrintWriter writer = response.getWriter();
			String path=servletContext.getRealPath("/test.properties");
			Properties properties=new Properties();
			properties.load(new FileInputStream(path));
			String username=(String) properties.getProperty("username");
			writer.write("username="+username+"<br/><br/>");
			writer.write("---------------------<br/><br/>");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
}

结果如下:


转载:https://blog.csdn.net/lfdfhl/article/details/101398899
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场