[ServletJSP] 初识ServletContext

2024-06-05 08:38

本文主要是介绍[ServletJSP] 初识ServletContext,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ServletContext是整个Web应用程序运行后的代表对象,可以通过ServletConfig的getServletContext()方法来取得,之后就可以利用ServletContext来取得Web应用程序的相关资源或信息。

ServletContext简介

可以用ServletContext来与Web应用程序进行沟通,甚至是取得同一服务器上其他Web应用程序的ServletContext。

getRequestDispatcher()

该方法可以取得RequestDispatcher实例,使用时路径的指定必须以“/”作为开头,这个斜杠代表应用程序环境根目录(Context Root)。取得RequestDispatcher实例之后,就可以进行请求的转发(Forward)或包含(Include)。

this.getRequestDispatcher("/pages/some.jsp").forward(request, response);

以”/”作为开头时成为环境相对(context-relative)路径,没有以”/”作为开头则成为请求相对(request-relative)路径。

getResourcePaths()

如果想要知道Web应用程序的某个目录中都有哪些文件,则可以使用getResourcePaths()方法。使用时,指定路径必须以”/”作为开头,表示相对于应用程序环境根目录。例如:

public class ShowPathServlet extends HttpServlet{protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<head>");out.println("<title>Resource Paths</title");out.println("</head>");out.println("<body>");out.println("<ul>");Iterator<String> paths = getServletContext().getResourcePaths("/").iterator();while (paths.hasNext()) {String path = paths.next();out.println("<li>" + path + "</li>");}out.println("</ul>");out.println("</body>");out.println("</html>");out.close();}
}

getResourceAsStream()

如果想在Web应用程序中读取某个文件的内容,则可以使用getResourceAsStream()方法,执行路径时必须以“/”作为开头,表示相对于应用程序环境根目录,运行结果会返回InputStream实例,接着就可以运用它来读取文件内容。

使用java.io下的File、FileReader、FileInputStream等与文件读取相关的类时,可以指定绝对路径或相对路径。绝对路径是指文件在服务器上的真实路径。必须注意的是,指定相对路径时,此时路径不是相对于Web应用程序根目录,而是相对于启动Web容器时的命令执行目录。以Tomcat为例,若在Servlet中执行以下语句:

out.println(new File("filename").getAbsolutePath());

则显示的是filename位于Tomcat目录下的bin目录中。

ServletContext初始参数

每个Servlet都会有一个相对应的ServletConfig对象,我们可以在web.xml中定义Servlet时设置初始参数,之后通过ServletConfig的getInitParameter()方法来读取初始参数。通常最适合读取初始参数的位置在Servlet的无参数init()方法之中,因为Web容器初始Servlet后,会调用有参数的init()方法,而该方法又会调用无参数的init()方法。

每个Web应用程序都会有一个相对应的ServletContext,针对应用程序初始化时所需用到的一些参数数据,可以在web.xml中设置应用程序初始化参数,设置时使用<context-param>标签来定义。例如:

<web-app ...><context-param><param-name>MESSAGE</param-name><param-value>/WEB-INF</param-value></context-param>
</web-app>

ServletContextListener

如果想要知道Web应用程序何时初始化或何时结束销毁,可以实现ServletContextListener,并在web.xml中设置告知web容器,在web应用程序初始化后果结束销毁前,调用ServletContextListener实现类中相对应的contextInitialized()或contextDestroyed()。

ServletContextListener接口定义如下:

/*** Implementations of this interface receive notifications about changes to the* servlet context of the web application they are part of. To receive* notification events, the implementation class must be configured in the* deployment descriptor for the web application.** @see ServletContextEvent* @since v 2.3*/public interface ServletContextListener extends EventListener {/**** Notification that the web application initialization process is starting.* All ServletContextListeners are notified of context initialization before* any filter or servlet in the web application is initialized.* @param sce Information about the ServletContext that was initialized*/public void contextInitialized(ServletContextEvent sce);/**** Notification that the servlet context is about to be shut down. All* servlets and filters have been destroy()ed before any* ServletContextListeners are notified of context destruction.* @param sce Information about the ServletContext that was destroyed*/public void contextDestroyed(ServletContextEvent sce);
}

当web容器调用contextInitialized()或contextDestroyed()时,会传入ServletContextEvent,其封装了ServletContext,可以通过ServletContextEvent的getServletContext()方法取得ServletConfig,之后就可以进行ServletContext初始参数的读取了。

对于多个Servlet都会使用到的信息,可以把它设置为ServletContext初始参数,可以在web.xml中做如下定义:

...<context-param><param-name>BOOKMARK</param-name><param-value>/WEB-INF/bookmarks.txt</param-value></context-param><listener><listener-class>club.cuxing.web.BookmarkInitializer</listener-class></listener>
...

<listener><listener-class>标签用来定义实现了ServletContextListener接口的类名称。

一个实现了ServletContextListener接口的简单例子:

package club.chuxing.web;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.*;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import club.chuxing.model.Bookmark;public class BookmarkInitializer implements ServletContextListener{public void contextInitialized(ServletContextEvent sce) {BufferedReader reader = null;try {ServletContext context = sce.getServletContext();String bookmarkFile = context.getInitParameter("BOOKMARK");reader = new BufferedReader(new InputStreamReader(context.getResourceAsStream(bookmarkFile), "UTF-8"));List<Bookmark> bookmarks = new LinkedList<Bookmark>();List<String> categories = new LinkedList<String>();String input = null;while ((input = reader.readLine()) != null) {String[] tokens = input.split(",");Bookmark bookmark = new Bookmark(tokens[0], tokens[1], tokens[2]);bookmarks.add(bookmark);if (!categories.contains(tokens[2])) {categories.add(tokens[2]);}}context.setAttribute("bookmarks", bookmarks);context.setAttribute("categories", categories);} catch (IOException ex) {Logger.getLogger(BookmarkInitializer.class.getName()).log(Level.SEVERE, null, ex);} finally {try {reader.close();} catch (IOException ex) {Logger.getLogger(BookmarkInitializer.class.getName()).log(Level.SEVERE, null, ex);}}}public void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stub}
}

ServletContext属性

在整个web应用程序生命周期内,Servlet所需共享的数据可以设置为ServletContext属性。由于ServletContext在web应用程序期间都会一直存在,所以对于设置为ServletContext属性的数据,除非你主动移除,否则也是一直存活于web应用程序之中的。ServletContext的相关方法:

  • setAttribute() 设置对象为ServletContext属性
  • getAttribute() 取出某个属性
  • removeAttribute() 移除某个属性

这篇关于[ServletJSP] 初识ServletContext的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032602

相关文章

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

初识Linux · 进度条

目录 前言: 1 缓冲区和回车换行 2 进度条 前言: 我们目前学习了些许知识,已经足够支持我们写一个非常非常小的项目了,即进度条,相信大家都有过下载游戏,等待游戏更新完成的时候,那么此时就有一个进度条,代表着游戏的更新进度,那么我们今天就来模拟实现这个过程,在此之前,我们需要一些预备知识。 1 缓冲区和回车换行 回车换行?是的,你没有看错,相信不少人对换行有一定的误解,我们

Linux初识线程

前言 前面在介绍进程的时候,说过进程的内核表述是"进程是承担资源分配的基本实体",但是我们至今都没有介绍如何理解他?本期我们就会介绍! 目录 前言 一、再谈地址空间和页表 1、OS对物理内存的管理 • 为什么4KB是OS进行I/O的基本单位? 2、再谈页表 • 二级页表 • 如何找到一个变量的所有字节? • 虚拟地址是如何转为物理地址的? • 理解动态内存管理 • 为什么对

初识命名空间

1.创建两个命名空间 ip netns add host1 ip netns add host2 2.  查看命名空间 ip netns ls 3 、 创建veth ip -netns host1 link add veth0 type veth peer name host1-peer 4、 查看命名空间接口  ip -netns host1 address 5、 把hos

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一:为什么在体系结构中存在存储器(内存)? 存储单元总结: 问题二:为什么程序在运行的时候,必须把程序先加载到内存? 问题三:请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 2、操作系统 2.1操作系统的概念: 我们首先要明白什么是管理: 2.2为什么要有操作系统? 2.3操作系统如何保证稳定和安全呢?(利用系统调用函数解决)

初识string(一)and内存管理

对类和对象的补充:缺省参数在函数定义中从右向左依次赋值,如果从右向左有一个参数没有赋值缺省参数,则左边的变量就不能在赋缺省参数,类中的变量可以赋缺省参数并且没有限制。 在类定义中我们总是看到函数后加const。这其实是调用常量类对象或类对象的意思。 一、引言 俗话说“工欲善其事,必先利其器。”一门语言创造的初衷一定是为了交流和记录重要的事。计算机语言肯定也不例外,虽然计算机语言创造的初衷单纯

数据可视化01-初识echart

1、echart官网 http://echarts.baidu.com/index.html 2、echart特性 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观,交互丰富,可高度个性