ServletContext对象(每个工程只有一个此对象)
一】重点方法:
1》存取对象
void setAttribute(String name, Object object);//将object存入ServletContext对象中,并取名为name(方便取出,与Map类似)
Object getAttribute(String name);//获取name对应的对象
2》解析web.xml中<context-param>标签
String getInitParameter(String name);//获取name标签对应的标签值
Enumeration getInitParameterNames();//获取所有的标签名,可以用于遍历标签值
3》请求转发器(用于转发网页)
RequestDispatcher getRequestDispatcher(String path);//获取指向特定资源的一个转发器
void forward(ServletRequest request, ServletResponse response);//调用转发器指向的资源,并进行转发
二】总结:
1)在web应用中,由服务器创建的唯一的一个对象是ServletContext
2)ServletContext对象在每个Servlet对象中取得的都是相同的
3)ServletContext对象有存取方法:
void setAttribute(String name, Object object);//将object存入ServletContext对象中,并取名为name(方便取出,与Map类似)
Object getAttribute(String name);//获取name对应的对象
二、ServletContext对象有如下应用:
一】多个Servlet对象可以通过ServletContext对象共享数据
1》第一个Servlet对象:设置值
//取得客户端的请求参数
String username = request.getParameter("username");
//取得这个工程的唯一一个ServletContext对象
ServletContext sc = this.getServletContext();
//将信息存入ServletContext对象
sc.setAttribute("USERNAME", username);
2》第二个Servlet对象:取出值
//取得唯一一个ServletContext对象
ServletContext context = this.getServletContext();
//获取ServletContext对象内容
String username = (String) context.getAttribute("USERNAME");
response.getOutputStream().write(("用户名="+username).getBytes());
二】在web引用中,可以取得web应用的初始化参数
1》web.xml部分
<context-param>
<param-name>邮箱</param-name>
<param-value>434507250</param-value>
</context-param>
<context-param>
<param-name>电话号码</param-name>
<param-value>18381330428</param-value>
</context-param>
2》Servlet对象部分
ServletContext context = this.getServletContext();
String email = context.getInitParameter("邮箱");
String tel = context.getInitParameter("电话号码");
if(email!=null && tel!=null ){
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("邮箱:" +email + "<br />");
response.getWriter().write("电话号码" + tel + "<br />");
}
三】ServletContext能够实现转发功能,即307+location。
步骤:
1》获取一个ServletContext对象
2》获取一个定位到指定资源的转发器
3》利用转发器进行调度,并进行转发
code:
// 1,获取指向fail.html的定位器
RequestDispatcher rd = context.getRequestDispatcher("/success.html");
// 2,利用此定位器进行转发
rd.forward(request, response);
四】利用ServletContext对象读取资源文件--默认目录为:工程(应用)路径
重点方法:
InputStream getResourceAsStream("文件路径");
code:
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/doc/config.properties");// /代表的当前应用(工程)
Properties props = new Properties();
props.load(is);
System.out.println(props.getProperty("email"));
注意:
1》用传统方式读取文件的时候,是以相对于tomcat\bin的目录下访问的
2》如果以ServletContext方式读取资源文件(text/xml/properties),是相对于web服务器的当前web应用(工程)目录而言的
此时/:表示当前web应用(工程),即:day06
五】通过类加载器加载文件:默认目录为WEB-INF/classes/
注意:
1》类加载器只能加载IDE工具下src目录下的资源文件,其它目录无法加载。
2》默认的路径为WEB-INF/classes/目录,即:此时/表示:/WEB-INF/classess/目录
重点方法:
1》获得类加载器( Class对象的方法)
ClassLoader getClassLoader();
2》获取资源输入流
ClassLoader getResourceAsStream(String name);
步骤:
1》取得当前对象的字节码对象
Class clazz = this.getClass();
2》取得当前对象的类加载器
ClassLoader cl = clazz.getClassLoader();
3》通过类加载器加载资源
InputStream is = cl.getResourceAsStream("资源路径");
code:
//1,获取当前对象的字节码对象
Class clazz = this.getClass();
//2,返回当前对象的类加载器
ClassLoader cl = clazz.getClassLoader();
//3,根据类加载器获取输入流
InputStream is = cl.getResourceAsStream("/cn/itcast/web/Servlet/config.properties");
六】将资源文件在工程中的路径转换成真实路径
使用ServletContext()对象的String getRealPath("工程路径");方法;
code:
String path = this.getServletContext().getRealPath("/doc/abc.txt");
File file = new File(path);
ServletContext对象(每个工程只有一个此对象)的更多相关文章
- DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)
一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...
- Object.create() 的含义:从一个实例对象,生成另一个实例对象
出处:https://wangdoc.com/javascript/oop/object.html#objectcreate 生成实例对象的常用方法是,使用new命令让构造函数返回一个实例.但是很多时 ...
- 返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)
如果遇到需要返回一个集合对象,其中该集合中的属性又是一个集合.第一种:可在考虑用外键关联,比如在控制器中可以采用预先加载的方式加载关联的数据,比如 RoleManager.Roles.Include& ...
- Object.create 以原对象为原型创建一个新对象
Object.create = function(o){ var Fun = function(){}; Fun.prototype = o; return new Fun(); } var peo ...
- java.lang.instrument: 一个Java对象占用多少字节?
一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针) 1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年 ...
- 如何复制一个java对象(浅克隆与深度克隆)
在项目中,有时候有一些比较重要的对象经常被当作参数传来传去,和C语言的值传递不同,java语言的传递都是引用传递,在任何一个地方修改了这个对象的值,就会导致这个对象在内存中的值被彻底改变.但是很多时候 ...
- 条款21: 必须返回对象时,不要强行返回对象的reference
总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中 ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- WPF Image控件的Source属性是一个ImageSource对象
1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...
随机推荐
- Android视图框架
Android视图框架 Android的UI系统是android应用系统框架最核心,最基础的内容! 1. Android视图系统.层次关系 Android应用设计和Web应用设计类似,也分前端和后端设 ...
- redis 异常排查
异常排查 redis-server redis.windows.conf D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 ...
- Raid1源代码分析--Barrier机制
本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...
- Hadoop生态圈技术图谱
当下Hadoop已经成长为一个庞大的体系,貌似只要和海量数据相关的,没有哪个领域缺少Hadoop的身影,下面是一个Hadoop生态系统的图谱,详细的列举了在Hadoop这个生态系统中出现的各种数据工具 ...
- 高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
- if(!!attr)是什么鬼???
看到很多代码if(!!attr),为什么不直接写if(attr):其实这是一种更严谨的写法:请测试 typeof 5和typeof !!5的区别.!!的作用是把一个其他类型的变量转成的bool类型.
- AxisFault另外一个问题
出现以下情况,能够是proxy.setEndpoint(endpoint);中endpoint不正确导致 因该是:endpoint = http://127.0.0.1/8080/项目名/servic ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- linux增大交换分区
进来在批量搭建环境,遇到搭建完环境之后发现swap忘记的情况,后来百度了下,发现了下面的方法,网上可能存在好多相应的帖子说这个事情也比较简单,以下是自己实践的结果,分享给大家. 1.查看现有memor ...
- CSharp命名风格
1.大小写约定 为了区分一个标识符中的多个单词,把标识符中的每个单词的首字母大写.不要用下划线来区分单词,或者在标识符中任何地方使用下划线,有两种方式适合大写标识符的字母: PascalCasing( ...