由于一个 Web 应用中的所有 Servlet 共享同一个 ServletContext 对象,所以多个 Servlet 通过 ServletContext 对象实现数据共享。

ServletContext 对象通常也被称之为 context 域对象。(还有 request session page)

String data = "aaaa123";
this.getServletContext().setAttribute("data", data);
String value = (String) this.getServletContext().getAttribute("data");
response.getOutputStream().write(("data:" + value).getBytes());

这两个放在两个 ServletDemo 类中时,在不同浏览器的不同页面都可以访问到 ServletContext 的值。

// 读取 WebRoot\WEB-INF\web.xml 中的属性值
String value = this.getServletContext().getInitParameter("data1");
response.getOutputStream().write(value.getBytes());
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.itcast.ServletDemo5</servlet-class>
<init-param>
<param-name>data1</param-name>
<param-value>x1x2x3</param-value>
</init-param>
</servlet>

以下代码实现了 Servlet 的转发: ( 1.jsp 位于 WebRoot\1.jsp ),但因为 ServletContext 是所有用户共用的域,因此此处使用并不合适。

String data = "aaa5";
// 把数据带给 1.jsp 不能通过 ServletContext 域,而要通过 request 域。
this.getServletContext().setAttribute("data", data); RequestDispatcher rDispatcher = this.getServletContext()
.getRequestDispatcher("/1.jsp");
rDispatcher.forward(request, response);
<div style="border:1px solid red;">
<%
String data = (String) application.getAttribute("data");
out.write(data);
%>
</div>

以下代码用于读取 src 目录下的 db.properties 配置文件中的键值

// 资源文件在源代码中放在 src 目录下,但发布后会出现在 WEB-INF\classes 目录下。
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(inputStream); String urlString = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password"); response.getOutputStream().write(("url:" + urlString).getBytes());
response.getOutputStream().write(("\r\nusername:" + username).getBytes());
response.getOutputStream().write(("\r\npassword" + password).getBytes());

如果配置文件放在包下,路径会在 /WEB-INF/classes/cn/itcast/ 目录下

如果配置文件在 WebRoot 目录下,路径会成为  /db.properties

如果要使用 FileInputStream 来读取资源文件,可使用以下代码取得文件真实路径:

String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");

如果是 java 类等,不是 Servlet 的类来读资源文件,则使用以下代码

InputStream inputStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(inputStream);

然后因为只需应用启动时读取一次,所以通常写成以下代码来使用:

private static Properties dbconfig = new Properties();

static {
try {
InputStream inputStream = UserDao.class.getClassLoader()
.getResourceAsStream("db.properties");
dbconfig.load(inputStream);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} // 如果读取资源文件的程序不是 Servlet 的话,就只能通过类装载器来读取
public void update() throws IOException {
System.out.println(dbconfig.getProperty("url"));
}

这样的代码发布后,修改配置文件需要重启应用,可以使用以下方法改进:

InputStream inputStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties");
// 按上面代码加载的配置文件 修改后仍读到原来的值
String path = UserDao.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream inputStream = new FileInputStream(path);

不使用第一句代码,而使用后面的代码即可。

[Java][Web]ServletContext 方法的应用的更多相关文章

  1. Android浏览器访问java web的方法

    以前自己也做过Android程序,可以和服务器通信,通过json来存取数据,当时是在APP中直接存取数据的,而这次我打算在手机浏览器中获得服务器传过来的Json参数,后来才发现其实很简单的,首先需要手 ...

  2. java web简易网上书店项目系列,使用MVC模式(servlet+jstl+dbutils),开篇

    一. 针对很多java web初学者入门困难的问题,笔者利用一个小型web项目,一步一步的展示java web开发方法,每一个章节引入一些java web开发的重点知识,让同学们可以将java web ...

  3. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  4. 获取JAVA[WEB]项目相关路径的几种方法

    在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...

  5. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  6. 如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记

    我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和Hibernate整合或声明式事务等)以及Sprin ...

  7. java web 入门级 开发 常用页面调试方法

    这里介绍一下Java web 入门级开发中常用的代码调式方法;  (  仅供入门级童靴 参考) ; 工具: chrome  浏览器 (版本越高越好); Java web 入门级开发 主要就是两个方面: ...

  8. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  9. 在eclpse中 一个web project 引用多个 java project 的方法

    在开发时,我们会遇到一个需求:模块化.它要求我们把 业务组件进行拆分,分组.把一部分业务功能集中处理,以保证 部分功能块的独立,便于 分配任务到个人,确定人员职责,源代码管理,和发布时重组. 我们尝试 ...

随机推荐

  1. canvas 遮罩

    上一篇介绍了CSS3可以实现mask的方式,本篇介绍canvas同样也可以实现遮罩的方法: 原理: canvas是在画布上绘图,可以绘制各种形状,同时可以在一个层上重复画图,默认情况下后面的会覆盖前面 ...

  2. _routing字段介绍

    一个document通过以下公式被路由到该索引下一个特定的分片: shard_num = hash(_routing) % num_primary_shards _routing的默认值是文档的_id ...

  3. mac下iterm2快捷方式

    mac下iterm2,一些技巧,做个记录,大部分参考别人的加上自己的补充: 其中option + 左右键来跳转单词还是有问题,结果变为[D[C,等我摸索好了再来补充. 窗口 新建tab:⌘ + t 切 ...

  4. python常用模块之sys模块

    python常用模块之sys模块 1.sys.argv[]:命令行参数List,第一个元素是程序本身 # 写一个简单的python程序,代码如下: #!/usr/bin/python #coding= ...

  5. Objective-C-----协议protocol,代码块block,分类category

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...

  6. caffe学习3——layers

    1 layer是模型的本质,是计算的基本单元.Layers convolve filters, pool, take inner products, apply nonlinearities like ...

  7. learn go passing variable-length arguments

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.3.md im ...

  8. Xcode 8 修改项目名

    很麻烦,不想修改了 有个教程,贴一下. From: 大发写字的地方 Xcode8 修改包名(含cocopods)

  9. HDU1757

    解题思路:分析需要不少时间,比较懒,直接把别人的分析贴在这里, 然后贴上自己写的代码: K相当之大.所以逐一递推的算法无法胜任.这时我们就不得不运用矩阵加速.首先来讲一下矩阵乘法: 若一矩阵的列数与另 ...

  10. BZOJ1257 CQOI2007 余数之和 【数分块】

    BZOJ1257 CQOI2007 余数之和 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值 其中 ...