Servlet 使用ServletContext共享数据,读取web.xml配置

ServletContext对象

  session和cookie,对于每一个请求用户来说,都是不同的,因为要保证隐私安全。

  而有一些数据,可以让所有用户共享,此时就可以用ServletContext对象。只要在一个Servlet中设置了ServletContext属性值,那么本项目的中任意一个Servlet中都可以获取到设置的属性值。作用范围是所有Servlet,而有效期是服务器关闭之前。

public class TestServletContext extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 获取Servlet的三种方式,获取的ServletContext对象是相同的。
		//ServletContext context = this.getServletContext();
		//context = req.getSession().getServletContext();
		//ontext = this.getServletConfig().getServletContext();
		
		ServletContext context = this.getServletContext();
		
		// 设置属性值setAttribute(String name, Object object)
		context.setAttribute("name", "张三");
		
		// 获取属性值,如果不存在,则返回null
		String name  = (String)context.getAttribute("name");
	}
}

  

 

使用ServletContext来获取web.xml中的配置项

  之前讲了可以使用Properties工具类来获取配置文件中的配置项,这里,同样可以使用ServletContext来实现。

  不过需要注意的是,ServletContext对象能够读取的配置项需要专门配置:

# 下面创建了两个配置项,分别是name=张三,age=99
<context-param>
	<param-name>name</param-name>
	<param-value>张三</param-value>
</context-param>

<context-param>
	<param-name>age</param-name>
	<param-value>99</param-value>
</context-param>

  使用ServletContext读取配置的实例:

ServletContext context = this.getServletContext();
String name = (String)context.getInitParameter("name");
int age = Integer.parseInt(context.getInitParameter("age"));
System.out.println("从web.xml读取到全局配置如下:\n" + "name :" + name + "\t age :" + age);

  运行结果如下:

从web.xml读取到全局配置如下:
name :张三	 age :99

  

 

从其他文件中读取数据

  读取数据的时候,有一个问题就是路径的问题,如果使用绝对路径,一旦服务器代码改变位置,路径就会错误,一般都会使用相对路径。

  相对路径有时候并不能准确的表示文件的位置,即使能都找到,在定位文件的时候也会有点麻烦,

  可以在指定路径的时候,以项目根路径为准,来定位文件。

// 获取以项目webRoot目录为根目录,给定path的资源文件,返回绝对路径
String path = context.getRealPath("/doc/intro.txt");
System.out.println(path);
// E:\javaee\.metadata\.me_tcat85\webapps\MySite\doc\intro.txt

// 获取webRoot下的资源流对象
InputStream config = context.getResourceAsStream("/doc/intro.txt");
// 实际是读webRoot/doc/intro.txt

byte[] b = new byte[1000];
int length = config.read(b);
System.out.println(new String(b, 0, length));
// 打印配置文件中的数据

  

posted @ 2018-12-06 23:37  寻觅beyond  阅读(582)  评论(0编辑  收藏  举报
返回顶部