基本概念

  • Web容器在启动时,会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用。
  • ServletContext(javax.servlet.http.ServletContext )存储了整个Web应用运行的上下文信息,即Web应用的全局信息,并且这些信息可以被不同的Servlet共享。
  • ServletConfig对象中维护了对ServletContext对象的引用,Tomcat创建Servlet对象后,在init方法中将ServletContext通过ServletConfig传递给当前的Servlet。
  • 多个Servlet共享同一个ServletContext,ServletContext对象一直存活到整个Web应用停止。
  • Servlet可以通过this.getServletContext() 来获取当前Web应用的ServletContext。通过ServletContext可以实现如下功能:
    • 获取Web应用初始化参数:getInitParamNames(), getInitParamValue(String name)
    • Servlet之间信息共享:getRequestDispatcher("/XX/XX") 实现信息的转发
    • 读取资源文件 :根据ServletContext获取上下文的工作根目录,根据根目录下资源的路径映射此资源在硬盘的绝对路径,再根据getResourceAsStream或者getRealPath获取硬盘绝对路径下的文件流。
    • 除了上述常用功能,Servlet还能实现对Listner/Filter/Session/Cookie的信息获取和配置,获取MimeType,URL下所有资源等等功能....

ServletContext 读取资源文件

  • ServletContext中存的参数信息可以被所有Servlet共享,实际开发中常常把数据库,编码信息等所有Servlet都需要的参数化信息存储在ServletContext的配置中供Servlet调用:
    1. 配置web.xml中的ServletContext参数
    2. 在Servlet中通过获取ServletContext调用参数

示例:配置ServletContext参数

<?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"
version="3.0">
<context-param>
<param-name>firstContextParaName</param-name>
<param-value>firstContextParaValue</param-value>
</context-param> <servlet>
<servlet-name>FirstServletContext</servlet-name>
<servlet-class>servletContext.FirstServletContext</servlet-class>
<init-param>
<param-name>servletConfigName</param-name>
<param-value>servletConfigValue</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FirstServletContext</servlet-name>
<url-pattern>/FirstServletContext</url-pattern>
</servlet-mapping>
</web-app>

示例:Servlet中获取Context参数

    /**
* 获取系统初始化参数web.xml里的context-param
*/
public void getAllInitialParams() {
Enumeration<String> enums = this.getServletContext().getInitParameterNames();
String initParam;
while (enums.hasMoreElements()) {
initParam = enums.nextElement();
System.out.println("initParam names: " + initParam + " initParam value: "
+ this.getServletContext().getInitParameter(initParam));
}
}

ServletContext 传递参数

ServletContext又被称为Context域对象,可以在此对象中存储参数,但通常不建议这么做,因为可能会有线程安全问题。使用ServletContext传递参数,采用以下几步:

  1. 在ServletA中设置参数(是attribute,不是initParam),servletContext().setAttribute("key","value");
  2. 在ServletB中获取参数(注意A必须运行在B前面),servletContext().getAttribute("key");
/**
* ServletContext 对应Context域对象,可以在域对象中存储参数,servletContext.setAttribute("key","value");
* 普通变量的转发非常不赞同用Context,因为Context是全局的,在多线程条件下会导致变量的问题.
*
*/
public class FirstServletContexForParasTransfer extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
this.getServletContext().setAttribute("GenerateContextAttrsByServlet", "testContextServletAttrTransfer");
//设置Context域参数以后转发请求到另一个Servlet,另一个Servlet可以获取刚刚设置的参数;如果直接调用另一个Servlet,由于没有设置参数,取值结果会变为null
this.getServletContext().getRequestDispatcher("/FirstServletContexForParasTransferReceiver").forward(request, response);; }
}

 

public class FirstServletContexForParasTransferReceiver extends HttpServlet{

	public void doGet(HttpServletRequest request,HttpServletResponse response){

		System.out.println("get a attribute from SevletContext: "+this.getServletContext().getAttribute("GenerateContextAttrsByServlet"));
}
}

  

 

ServletContext(Context域对象) 获取资源文件

详见 JavaWeb基础:读写资源文件

JavaWeb基础: ServletContext的更多相关文章

  1. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  2. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  3. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  4. 关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总

    作者 : Stanley 罗昊 本人自行总结,纯手打,有疑问请在评论区留言 [转载请注明出处和署名,谢谢!] 一.java基础 1.多态有哪些体现形式? 重写.重载 2. Overriding的是什么 ...

  5. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  6. JavaWeb基础: 获取资源文件

    Web工程在编译构建完毕以后,需要部署到Tomcat上运行,资源的硬盘路径也会随着改变.要想对资源文件进行读写操作需要获取其硬盘地址,在Web工程中通常通过ServletContext/ClassLo ...

  7. 25天javaweb基础

    第一天(html) 表格标签,超链接标签,图片标签,排版标签,列表标签 第二天(css) 表单标签 第三天(JS) js语法 定时器(系统对象的定时器setinterval,js的定时器seTimeo ...

  8. javaweb基础 02--javaweb基础概念

    1.WEB资源 * 静态web资源:指web页面中供人们浏览的数据始终是不变(如 html 页面). * 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内 ...

  9. JavaWeb 基础面试

    1. 启动项目时如何实现不在链接里输入项目名就能启动?  修改Tomcat配置文件 server.xml.找到自己的项目配置 : <Context docBase="oneProjec ...

随机推荐

  1. SQL Server 索引中include的魅力(具有包含性列的索引)

    2010-01-11 20:44 by 听风吹雨, 22580 阅读, 24 评论, 收藏, 编辑 开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”. [ ...

  2. lnmp环境下载安装包

    一.下载php(官网):http://php.net/downloads.php 点击上图选择的php-7.0.10.tar.gz (sig) 进入如下页面: 需要在linux上面下载需要如下操作: ...

  3. Leetcode: Reconstruct Original Digits from English

    Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...

  4. [技术分享] .NET下 , 上传图片的处理方式 , 贴上代码 .

    如题 , 直接上单代码 , AC代码 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" ...

  5. sql join 优化

    项目查询列表,需要新关联一张表,于是就让组下小伙更改了下sql语句,当再次进入列表查询时查询时间一下子就翻倍.那小伙找了半天没找原因. 于是我就打开代码查看,关联的一张表数据非常多,用的left jo ...

  6. Visual Studio常用插件

    Visual Assist X 番茄不用说了,C# C++编码必备 Image Insertion 可以在代码编辑器中插入图片注释,让代码像Word文档一样图文并茂. 但注意必须是PNG格式的图片,直 ...

  7. 跟着8张思维导图学习javascript

    学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将po出8张javascript相关的思维导图. 思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又 ...

  8. Asp.net MVC进入请求管道的过程

    Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...

  9. case while for

    #!/bin/bash#create by howhy 20161214#mysql server start stop restart. /etc/init.d/functionsmysqldir= ...

  10. javascript编程: JSON, Mapping, 回调

    使用 Javascript  编程, 组合使用 JSON 数据格式,Mapping 和回调技术, 可以产生很强的表达效果. 在实际工作中, 总会有数据汇总的需求. 比如说, 取得了多个 device ...