ServletContext

2023-11-11

ServletContext上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文 API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同 一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet

ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。

request一个用户可有多个 session一个用户一个 servletContext所有用户共用一个 为了节省空间,提高效率,ServletContext中可以存放必须的、重要的、所有用户需要共享的数据。注 意需要考虑线程安全问题

ServletContext接口

容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象可以记录事件 日志、获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性 在jsp中是9大默认对象的application对

初始化参数

上下文参数一般都是配置在web.xml中

<context-param> 上下文参数的个数没有限制
<param-name>counter</param-name> 参数名称,不允许重复
<param-value>99999</param-value> 对应配置参数值
</context-param>
......

ServletContext接口的初始化参数允许servlet访问与web应用相关的上下文初始化参数,这些由应用开 发人员在部署描述符中指定:

getInitParameter

String str=this.getServletContext().getInitParameter("counter");//如
果上下文中没有这个初始化参数配置,则获取值null

允许servlet的init-param和上下文参数同名,这里只是通过不同的方式进行获取, 上下文参 数使用application对象获取,servlet参数配置使用ServletConfig获取

getInitParameterNames
 

final ServletContext application = this.getServletContext();
final Enumeration<String> names =
application.getInitParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
String value=application.getInitParameter(name);
System.out.println(name+"---"+value);
}

应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键 数据的系统名称

上下文属性

可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个web应用的其他servlet 使用。ServletContext接口的方法允许访问

setAttribute

getAttribute

getAttributeNames

removeAttribute

针对基本不发生改变而且需要频繁读取的数据,可以考虑将数据共享在application中

正确的做法是参数ServletContextListener实现application被创建时自动加载,在application销毁 时存储数据

变通做法是由Servlet在init方法中负责加载准备

<servlet>
<servlet-name>loadCatalog</servlet-name>
<servlet-class>com.yan.action.LoadCatalogServlet</servlet-class>
<!--默认情况下,当第一次客户端访问Servlet时,才由服务器负责加载并初始化Servlet
对象 -->
<!--配置参数load-on-startup表示应用启动时自动加载Servlet,值为大于等于零的整
数,值越大优先级越低.默认值-1表示按需加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>loadCatalog</servlet-name>
<url-pattern>/load.do</url-pattern>
</servlet-mapping>

在LoadCatalogServlet的init方法中加载类目信息,并存放在application对象的属性中,其它地方直接获 取即可

public class LoadCatalogServlet extends HttpServlet {
@Override
public void init() throws ServletException {
ServletContext application=this.getServletContext();
//模拟从数据库中获取所有的类目信息
List<Catalog> catalogList=new ArrayList<>();
for(int i=0;i<10;i++){
Catalog catalog=new Catalog();
catalog.setId(1L+i);
catalog.setName("name_"+i);
catalogList.add(catalog);
}
System.out.println(catalogList);
application.setAttribute("catalogList",catalogList);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
request.getRequestDispatcher("/product/add.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
}
}

页面中从application中获取数据

<select name="catalogId">
<option value="">请选择类别</option>
<%
Object obj=application.getAttribute("catalogList");
if(obj!=null && obj instanceof List){
List<Catalog> clist=(List<Catalog>) obj;
for(Catalog c:clist){
%>
<option value="<%=c.getId()%>"><%=c.getName()%></option>
<%}}%>
</select>

资源访问

ServletContext接口提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文 件:

getResource

getResourceAsStream

final ServletContext application = this.getServletContext();
try{
String realPath=application.getRealPath(""); //获取应用根路径--绝
对路径,例如windows下c:\dddd\bbb
File file=new File(realPath,"counter.data"); //采用相对路径的方式指代
根路径下的文件counter.data
DataInputStream dos=new DataInputStream(new
FileInputStream(file));
dos.readLong(counter);
dos.close();
} catch (Exception e){
application.log("indexServlet",e);
}
try{
final InputStream inputStream =
application.getResourceAsStream("counter"); //一般不建议在web应用中获取
运行环境相关的配置数据--探针程序
DataInputStream dis=new DataInputStream(inputStream);
counter1=dis.readLong();
dis.close();
} catch (Exception e){
application.log("indexServlet",e);
}

操作日志

两个重载的log方法都是记录日志到servlet日志文件,需要注意的是servlet日志文件的路径由具体的 servlet容器自己去决定。如果是在IDE中跑应用的话,那么日志信息将在控制台Console输出。如果是发 布到Tomcat下的话,日志文件是Tomcat目录下的/logs/localhost.yyyy-MM-dd.log 其它方法 getMajorVersion和getMinorVersion分别返回当前servlet容器支持的Servlet规范最高版本和最低版 本。getEffectiveMajorVersion和getEffectiveMinorVersion分别返回当前应用基于的Servlet规范最高版 本和最低版本,是servlet3.0规范增加的新特性。所以一般情况下: getMajorVersion >= getEffectiveMajorVersion > getEffectiveMinorVersion >= getMinorVersion

Servlet运行特征

HttpServlet 定义了用于支持有条件GET 操作的getLastModified方法。所谓的有条件GET操作是指 客户端通过GET请求获取资源时,当资源自第一次获取那个时间点发生更改后才再次发生数据,否 则将使用客户端缓存的数据。在一些适当的场合,实现此方法可以更有效的利用网络资源,减少不 必要的数据发送

Servlet默认是线程不安全的,需要开发人员处理多线程问题。通常Web容器对于并发请求将使用同 一个servlet处理,并且在不同的线程中并发执行service方法 对于未托管在分布式环境中(默认)的servlet而言,servlet容器对于每一个Servlet声明必须 且只能产生一个实例。如果Servlet实现了SingleThreadModel接口,servlet容器可以选择实 例化多个实例以便处理高负荷请求或者串行化请求到一个特定的实例

public class TestServlet extends HttpServlet implements
SingleThreadModel {
public TestServlet(){
System.out.println("构造器....");
}
@Override
public void init() throws ServletException {
System.out.println("初始化操作....");
}
@Override
public void destroy() {
System.out.println("销毁对象....");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse
resp) throws ServletException, IOException {
System.out.println("get请求...."+Thread.currentThread());
}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ServletContext 的相关文章

  • Java 使用服务器证书对 jar 进行签名

    是否可以使用服务器证书来签署 java web start 应用程序 我想知道的是它是否有效 我的服务器有一个受信任的证书 并且我想重复使用同一证书来签署应用程序 现在 我有这样的警告 此 jar 包含其签名者证书的 ExtendedKey
  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • 使用 TreeMap 和 Comparator 按值对 HashMap 进行排序

    我使用以下代码创建哈希图 然后使用树形图和比较器对哈希图中的值进行排序 然而 输出结果却出乎意料 所以任何关于我做错了什么的想法都会有帮助 Code public static void main String args System ou
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 在 SWT 中单击鼠标触发事件?

    在SWT中 对于MouseListener接口 可用的方法有mouseUp mouseDown and mouseDoubleClick 如何根据用户点击触发事件 我们可以通过结合来做到这一点mouseUp and mouseDown 但没
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 在 Streamreduce 方法中,求和时恒等式必须始终为 0,乘​​法时恒等式必须始终为 1?

    我继续java 8学习 我发现了一个有趣的行为 让我们看一下代码示例 identity value and accumulator and combiner Integer summaryAge Person getPersons stre
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种

随机推荐

  • Android实现折叠式Toolbar:CollapsingToolbarLayout 使用教程与解析

    简介 在各种不同的应用中 大家可能会经常见到这样一个效果 Toolbar是透明的 有着一个背景图片以及大标题 随着页面向上滑动 其标题逐渐缩放到Toolbar上 而背景图片则在滑动到一定程度后变成了Toolbar的颜色 这种效果也即是折叠式
  • 类与类之间的关系图(Class Diagram,UML图)

    一 简介 二 类的构成 三 类之间的关系 Relationship 1 单向关联 2 双向关联 3 自身关联 4 多维关联 N ary Association 5 泛化 Generalization 6 依赖 Dependency 7 聚合
  • FlatBuffers

    概述 FlatBuffers是google最新针对游戏开发退出的高性能的跨平台序列化工具 目前已经支持C C Go Java JavaScript PHP and Python C和Ruby正在支持中 相对于json和Protocol Bu
  • 很有用的一些的Python小工具送给你

    导读 python作为越来越流行的一种编程语言 不仅仅是因为它语言简单 有许多现成的包可以直接调用 Python作为越来越流行的一种编程语言 不仅仅是因为它语言简单 有许多现成的包可以直接调用 python中还有大量的小工具 让你的pyth
  • Sql Server 日期函数

    1 一个月第一天的复制 保存Select DATEADD mm DATEDIFF mm 0 getdate 0 2 本周的星期一复制 保存Select DATEADD wk DATEDIFF wk 0 getdate 0 3 一年的第一天复
  • ceph存储 pg归置组处于stuck以及degraded状态解决方案

    由于对ceph的兴趣 我们经常自己搭建ceph集群 可能是单节点 也可能是多节点 但是经常遇到pg归置组异常状态 下面是遇到的一些情况 1 单节点的时候pg归置组unclean或者degraded 这个时候应该检查 自己是几个osd 副本数
  • BSC主网链搭建,如何在不到24小时之内同步完成?

    还是老样子 在本篇文档开始之前 大概说明一下本次BSC同步的情况 服务器环境 服务器 阿里云服务器 CPU 16核 内存 64 GB 数据盘 3T SSD 数据盘 带宽 独享 200M 区域 美国弗吉尼亚 软件环境 centos 7 9 B
  • jqGrid 常用方法和事件

    jqGrid 常用方法整理 常用方法 获取行数据 删除行数据 重新加载表格 动态设置列显示隐藏 常用事件 常用方法 获取行数据 div div 1 获取所有行数据 jqGrid getRowData 或者 var IDS jqGrid ge
  • 小型软件公司的绩效考核

    近几个月 我常和一些朋友讨论如何在小型软件公司中对软件开发人员进行绩效考核的问题 发现很多朋友都为此问题而烦恼 由于我正好在一家小型软件公司里负 责绩效考核工作 有一些成功的实践经验 所以特此在这里与大家交流一下我的心得 这些心得可能仅限于
  • 通过python构建一个区块链来学习区块链

    了解区块链Blockchains如何工作的最快方法就是构建一个区块链 你来到这里是因为 和我一样 你对加密钱币的崛起感到很兴奋 而且你想知道区块链是如何工作的 想了解它们背后的基本技术 但理解区块链并不容易 或者至少不适合我 我在密集的视频
  • Fisco-bsco 开发联盟链 账户之间的转账

    Fisco bsco 开发联盟链 账户之间的转账 参考 开发第一个区块链应用 FISCO BCOS v2 9 0 文档 fisco bcos documentation readthedocs io 前提 Fisco bcos节点开启 控制
  • 容器性能比无容器服务器,【译】容器 vs 无服务器(Serverless)

    一些历史 不久之前 开发 部署和运维还相当复杂 在一开始 运维不仅需要修补程序代码 还要支持物理机器 保持服务器 硬件与软件处于最新状态也是一项艰巨的任务 在2000年代 一个新的模型 架构即服务 IaaS 很快流行起来 IaaS提供了从第
  • OSG的控制台报错处理

    OSG报错或者出现警告怎么办 最快解决方法是查资料问人 但是都不凑效的情况下 只能分析源码了 报错信息如下 报错调用方定位 触发位置 State cpp bool State checkGLErrors StateAttribute GLM
  • JSP连接数据库

    2019 10 15 JSP连接数据库 一 连接数据库需要用到的包为mysql connector java 5 1 20 bin jar 导入包的方法有两种 1 在Java Build Path中倒导入 2 把我们需要的包拷入WEB IN
  • Java之XML解析-使用dom(org.w3c.dom)解析XML

    转自 Java之XML解析 使用dom org w3c dom 解析XML 下文笔者将讲述使用W3C org w3c dom 提供的接口 解析XML文档的方法分享 W3C解析xml文档的方法 将整个xml文档读入内存 然后构建一个DOM树
  • 如何查看和修改gcc、g++默认include路径

    如何查找gcc g 默认include路径 注意 是Tab上面的那个符号 gcc gcc print prog name cc1plus v g g print prog name cc1plus v 我们都知道在编译的预处理阶段 编译器会
  • Python爬虫的requests(学习于b站尚硅谷)

    目录 一 requests 1 requests的基本使用 1 文档 2 安装 3 响应response的属性以及类型 4 代码演示 2 requests之get请求 3 requests之post请求 1 演示示例 爬取百度翻译 2 ge
  • simulink半桥逆变电路仿真

    逆变是将直流变为脉冲方波信号 电压是100V的 第一幅为原始直流信号 第二幅是逆变电流 第三幅是逆变电压 参数设置 图3 RC1 图4 RC 图5 晶闸管 图6 脉冲信号的参数
  • Java常用类(比较器、System类、Math类、BigInteger和BigDecimal类)

    Java常用类 比较器 System类 Math类 BigInteger和BigDecimal类 一 比较器 一 自然排序 使用Comparable接口 二 定制排序 使用Comparator接口 二 System类 三 Math类 四 B
  • ServletContext

    ServletContext上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问 Servlet上下文 API用于设置应用程序中所有Servlet共有的信息 Servlet可能需要共享他们之间的共有信息 运行于同 一服务器的