servlet--context域
ServletContext(重要)
一个项目只有一个ServletContext对象!
我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!
1 ServletContext概述
服务器会为每个应用创建一个ServletContext对象:
l ServletContext对象的创建是在服务器启动时完成的;
l ServletContext对象的销毁是在服务器关闭时完成的。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
2 获取ServletContext
l ServletConfig#getServletContext();
l GenericServlet#getServletContext();
l HttpSession#getServletContext()
l ServletContextEvent#getServletContext()
在Servlet中获取ServletContext对象:
l 在void init(ServletConfig config)中:ServletContext context = config.getServletContext();,ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
在GenericeServlet或HttpServlet中获取ServletContext对象:
l GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
|
public class MyServlet implements Servlet { public void init(ServletConfig config) { ServletContext context = config.getServletContext(); } … } |
|
public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { ServletContext context = this.getServletContext(); } } |
3 域[c2] 对象的功能
ServletContext是JavaWeb四大域对象之一:
l PageContext;
l ServletRequest;
l HttpSession;
l ServletContext;
所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:
l void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
l Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
l void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
l Enumeration getAttributeNames():获取所有域属性的名称;
4 获取应用初始化参数
l Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!
l 可以配置公共的初始化参数,为所有Servlet而用!这需要使用ServletContext才能使用!
还可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同:
web.xml
|
<web-app ...> ... <context-param> <param-name>paramName1</param-name> <param-value>paramValue1</param-value> </context-param> <context-param> <param-name>paramName2</param-name> <param-value>paramValue2</param-value> </context-param> [崔3] </web-app> |
|
ServletContext context = this.getServletContext();[崔4] String value1 = context.getInitParameter("paramName1"); String value2 = context.getInitParameter("paramName2"); [崔5] System.out.println(value1 + ", " + value2); Enumeration names = context.getInitParameterNames();[崔6] while(names.hasMoreElements()) { System.out.println(names.nextElement()); } |
[c1]不及!
[崔3]配置了两个应用初始化参数
[崔4]获取ServletContext对象
[崔5]通过参数名,获取参数值
[崔6]获取所有应用初始化参数名称
5 获取资源相关方法

5.1 获取真实路径(*****)
还可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
l 获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;
l 获取b.txt的真实路径:String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”);
5.2 获取资源流
不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
l 获取a.txt资源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);
l 获取b.txt资源流:InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);
5.3 获取指定目录下所有资源路径
还可以使用ServletContext获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径:
|
Set set = context.getResourcePaths("/WEB-INF"); System.out.println(set); |
|
[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml] |
注意,本方法必须以“/”开头!!!
实例
练习:访问量统计
一个项目中所有的资源被访问都要对访问量进行累加!
创建一个int类型的变量,用来保存访问量,然后把它保存到ServletContext的域中,这样可以保存所有的Servlet都可以访问到!
最初时,ServletContext中没有保存访问量相关的属性;
当本站第一次被访问时,创建一个变量,设置其值为1;保存到ServletContext中;
当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础之上加1。 获取ServletContext对象,查看是否存在名为count的属性,如果存在,说明不是第一次访问,如果不存在,说明是第一次访问;
第一次访问:调用Servletcontext的setAttribute()传递一个属性,名为count,值为1;
第2~N次访问:调用ServletContext的getAttribute()方法获取原来的访问量,给访问量加1,再调用Servletcontext的setAttribute()方法完成设置。 相信各位一定见过很多访问量统计的网站,即“本页面被访问过XXX次”。因为无论是哪个用户访问指定页面,都会累计访问量,所以这个访问量统计应该是整个项目共享的!很明显,这需要使用ServletContext来保存访问量。
ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null) {
count = 1;
} else {
count++;
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("<h1>本页面一共被访问" + count + "次!</h1>");
application.setAttribute("count", count);
servlet--context域的更多相关文章
- servlet context 和 servlet config
servletConfig Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象,该对象中包含了servlet的<init-para ...
- 11 Servlet_03 关键字总结 资源跳转:重定项 键值对 继承类 do-get do-post Request域 Context域 =空针解决方法
知识点总结: 1.java里的关键字: byte short int long 数据类型 (正整数)char 数据类型(单字符型)boolesn ture false 布尔类型float dou ...
- Spring的servlet context和application context
Spring lets you define multiple contexts in a parent-child hierarchy. The applicationContext.xml def ...
- INFO Dispatcher:42 - Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
INFO Dispatcher:42 - Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax ...
- Servlet Context
Servlet Context Container Provider 负责提供ServletContext的实现. A ServletContext is rooted at a known path ...
- Servlet三大域对象
Servlet三大域对象的应用 request.session.application(ServletContext) ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器 ...
- JavaWeb核心编程之(三.4)Servlet Context 配置
ServletContextServlet引擎为每个Web应用程序都创建一个对应的ServletContext对象, ServletContext对象被包含在ServletConfig对象中, 调用S ...
- servlet跨域
后台代码 package edu.nf.ch01.server; import javax.servlet.ServletException; import javax.servlet.annotat ...
- java servlet的域对象
在进行网络编程中的项目时 经常用到的域对象主要包括以下三种: 1. ServletContext 作用范围比较大 代码如下: //一个请求代码: ServletContext sc = reques ...
- 妙解Servlet四大域对象
pageContext pageContext作用域为page(页面执行期). request request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域仅在当前请求中有效. ...
随机推荐
- 异常处理 VEH
不算新的东西,也都不小了, VEH的结构处理,平行于SEH,但是略有区别, 相关函数有四个 PVOID WINAPI AddVectoredExceptionHandler( _In_ ULONG F ...
- java操作mongodb工具类
新建maven项目 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- HTTPS证书转换成PEM格式
PEM 格式的证书文件(*.pem)一般为以下格式: 注意:PEM 格式证书文件可用 notepad++ 等文本编辑器打开. CER / CRT 格式证书转换为 PEM 格式 对于 CER / CRT ...
- php函数漏洞
1.ereg — 正则表达式匹配 此函数遇 %00 截断. <?php $a = $_GET['pwd']; var_dump(ereg ("^[0-9]+$", $a)); ...
- 在PHPstorm上安装thinkPHP
>环境:ubuntu php7.2 phpstorm https://blog.csdn.net/roukmanx/article/details/85646174 https://www.ka ...
- python:图片拼接
一:尺寸相同的图片拼接 import os from PIL import Image width_i = 200 height_i = 200 row_max = 3 line_max = 3 al ...
- 对webpack的初步研究5
Loaders 加载器是应用于模块源代码的转换.它们允许您在处理import或“加载” 文件时预处理文件.因此,加载器有点像其他构建工具中的“任务”,并提供了处理前端构建步骤的强大方法.加载器可以将文 ...
- Influxdb根据配置文件启动(Influxdb的数据存储)
1.在Influxdb文件夹下建立一个bat文件 2.文件内容如下: @echo offSETLOCAL :: 获取当前批处理所在路径SET InfluxdP==%~dp0 :: 开启influxdb ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- SSD_mobilenet
mobilenet_ssd caffe模型可视化地址:MobileNet_ssd conv13是mobilenet的最后一个卷积层,作者仿照VGG-SSD的结构,在MobileNet的conv13后面 ...