ServletContext 的 4 个常见应用!

news/2025/1/19 12:10:35/文章来源:https://www.cnblogs.com/o-O-oO/p/18679470

一、ServletContext类详解

Web容器在启动时,会为每一个Web项目创建一个对应的ServletContext对象。它是当前项目中所有Servlet实例之间信息交互的“中间商”。(参见“Servlet的运行原理”)

:一个Web项目对应一个ServletContext。(即:同一个Web项目中的所有servlet实例共用同一个ServletContext对象。)

二、常见应用

ServletContext的常见应用场景主要包括:

  • 数据共享:在一个Servlet中保存的数据,可以在另一个Servlet中使用。

  • 获取初始化参数

  • 请求转发

  • 读取资源文件

三、使用ServletContext实现:数据共享

(1)在上述父项目下再使用Maven模板新建一个MavenWeb子项目:servlet-02。

(2)同样地,为了避免以后出现兼容性问题,建议我们先将该子项目中的web.xml文件替换成“web-app_4_0”版本。

(3)同样地,在该子项目的main文件夹下新建一个java文件夹和一个resource文件夹,并将它们分别标记为“源码根目录”和“资源根目录”。

(4)编译父项目或子项目,此时父项目与子项目的目录结构如下图所示。

(5)配置Tomcat服务器,deploy(发布)servlet-02:war包,并为该子项目添加虚拟路径映射:/s2。

:如果只发布某一子项目,那么其它子项目的war包和虚拟路径映射可以删除。若不删除,则一起发布。

(6)在该子项目的java目录下新建一个com.atangbiji.servlet包,并在该包下新建一个Servlet1类,用于将数据以“键-值“对的形式保存在ServlContex对象中。同样地,让Servlet1类继承(extends)HttpServlet类,以实现Servlet接口。然后,在Servlet1类中重写doGet和doPost方法。

Servlet1.java文件:

public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获取ServlContex对象String usernameVal = "阿汤笔迹";servletContext.setAttribute("username",usernameVal);//将数据以“键-值“对的形式保存在ServlContex对象中}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);    //因为`get`和`post`只是不同的Http请求方式,所以它们之间可以相互调用。}
}

(7)同样地,com.atangbiji.servlet包下再新建一个Servlet2类,用于获取ServlContex对象中保存的“键-值“对。

Servlet2.java文件:

public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获取ServlContex对象String usernameVal = (String)servletContext.getAttribute("username");//从ServletContext中获取username的值resp.setHeader("Content-Type", "text/html; charset=utf-8");resp.getWriter().print("Servlet2从ServletContext中获取到username的值为:" + usernameVal);//在页面上输出响应}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);    //因为`get`和`post`只是不同的Http请求方式,所以它们之间可以相互调用。}
}

(8)同样地,在该子项目的Web配置文件(web.xml)中注册(映射)我们自己编写的两个Servlet,并为它们分别提供一个浏览器可以访问的路径。

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="true"><servlet><servlet-name>SetServletContext</servlet-name><servlet-class>com.atangbiji.servlet.Servlet1</servlet-class></servlet><servlet-mapping><servlet-name>SetServletContext</servlet-name><url-pattern>/setVal</url-pattern></servlet-mapping><servlet><servlet-name>GetServletContext</servlet-name><servlet-class>com.atangbiji.servlet.Servlet2</servlet-class></servlet><servlet-mapping><servlet-name>GetServletContext</servlet-name><url-pattern>/getVal</url-pattern></servlet-mapping></web-app>

(9)在IDEA中启动Tomcat。在浏览器中先输入http://localhost:8080/s2/setVal加载Servlet1,然后再输入http://localhost:8080/s2/getVal,访问结果如下:

:我们可以通过IDEA为我们提供的Web窗口来查看Web项目的结构。

四、使用ServletContext实现:获取初始化参数

(1)在Web.xml文件中配置Web应用的初始化参数(如:连接mybatis的url)。

Web.xml文件:

<!--  配置Web应用初始化参数(连接mybatis的url) -->
<context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>

(2)在该子项目com.atangbiji.servlet包下新建一个Servlet3类,用于获取Web应用的初始化参数。同样地,让Servlet3类继承HttpServlet类,以实现Servlet接口。然后,在Servlet3类中重写doGet和doPost方法。

Servlet3.java文件:

public class Servlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获取ServlContex对象String url = servletContext.getInitParameter("url");//获取连接mybatis的urlresp.getWriter().print(url);//在页面上输出响应}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);    //因为`get`和`post`只是不同的Http请求方式,所以它们之间可以相互调用。}
}

(3)同样地,在该子项目的Web配置文件(web.xml)中注册(映射)我们自己编写的Servlet,并为它提供一个浏览器可以访问的路径。

web.xml文件:

<servlet><servlet-name>GetInitParameter</servlet-name><servlet-class>com.atangbiji.servlet.Servlet3</servlet-class>
</servlet>
<servlet-mapping><servlet-name>GetInitParameter</servlet-name><url-pattern>/getInitParameter</url-pattern>
</servlet-mapping>

(4)在IDEA中启动Tomcat。在浏览器中输入http://localhost:8080/s2/getInitParameter,访问结果如下:

五、使用ServletContext实现:请求转发

5.1 什么是请求转发

请求转发(RequestDispatcher)指的是:一个web资源(Servlet1)接受到客户端的请求后,通知服务器去调用另外一个web资源(Servlet2)进行处理。

5.2 请求转发的工作原理

在 Servlet中,通常使用 forward()方法将当前请求转发给其他的Web 资源进行处理。请求转发的工作原理如下图所示:

5.3 请求转发的特点

  • 请求转发是服务器端的行为,浏览器不知道在服务器内部发生了转发行为,更无法得知转发的次数。

  • 请求转发之后,浏览器地址栏中的 URL 不会发生变化。

  • 请求转发不支持跨域访问,只能跳转到当前应用中的资源。

  • 参与请求转发的 Web资源之间共享同一 request对象和 response对象。

  • 只有转发到最后一个Web资源时,生成的响应才会被发送到客户端。

5.4 请求转发的实现

(1)在该子项目com.atangbiji.servlet包下新建一个Servlet4类,用于将访问Servlet4的请求转发到Servlet3的请求路径上来。同样地,让Servlet4类继承HttpServlet类,以实现Servlet接口。然后,在Servlet4类中重写doGet和doPost方法。

Servlet4.java文件:

public class Servlet4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获取ServlContex对象//获取访问该Servlet的请求将要转发的路径RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/getInitParameter");//调用forward方法实现请求转发requestDispatcher.forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);    //因为`get`和`post`只是不同的Http请求方式,所以它们之间可以相互调用。}
}

(2)同样地,在该子项目的Web配置文件(web.xml)中注册(映射)我们自己编写的Servlet,并为它提供一个浏览器可以访问的路径。

web.xml文件:

<servlet><servlet-name>RequestDispatcher</servlet-name><servlet-class>com.atangbiji.servlet.Servlet4</servlet-class>
</servlet>
<servlet-mapping><servlet-name>RequestDispatcher</servlet-name><url-pattern>/requestDispatcher</url-pattern>
</servlet-mapping>

(3)在IDEA中启动Tomcat。在浏览器中输入http://localhost:8080/s2/requestDispatcher,此时服务器会将我们的请求转发到/getInitParameter路径上来。访问结果如下:

:请注意请求转发与请求重定向的区别,我们将在介绍重定向是对比说明。

六、ServletContext应用示例:读取资源文件

(1)在该子项目的resources文件夹下新建一个db.properties文件。

db.properties文件:

username = root
password = 123456789

(2)在该子项目com.atangbiji.servlet包下新建一个propertiesServlet类,用于读取db.properties资源文件。同样地,让propertiesServlet类继承HttpServlet类,以实现Servlet接口。然后,在propertiesServlet类中重写doGet和doPost方法。

propertiesServlet.java文件:

public class propertiesServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获取ServlContex对象//以数据流的方式获取资源InputStream stream = servletContext.getResourceAsStream("/WEB-INF/classes/db.properties");//项目打包后的相对路径Properties prop = new Properties();//加载数据流prop.load(stream);//获取属性值String username = prop.getProperty("username");String password = prop.getProperty("password");//在页面上输出响应resp.getWriter().print(username + ":" + password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);    //因为`get`和`post`只是不同的Http请求方式,所以它们之间可以相互调用。}
}

(3)同样地,在该子项目的Web配置文件(web.xml)中注册(映射)我们自己编写的Servlet,并为它提供一个浏览器可以访问的路径。

web.xml文件:

<servlet><servlet-name>PropertiesServlet</servlet-name><servlet-class>com.atangbiji.servlet.propertiesServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>PropertiesServlet</servlet-name><url-pattern>/propertiesServlet</url-pattern>
</servlet-mapping>

(4)在IDEA中启动Tomcat。在浏览器中输入http://localhost:8080/s2/propertiesServlet,访问结果如下:

:由于Maven的“约定大于配置”思想,我们以后可能会遇到我们自己写的配置文件(如:我们配置文件*.xml写在了项目中的Java目录下)无法被导出或者无法生效的问题。该问题的解决方法是:在pom.xml的<build>……</build>中配置resources,修改Maven约定的过滤条件,来防止我们的资源导出失败。

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build><resources><!--选择需要导出资源的路径,可以选择多个--><resource><directory>src/main/resources</directory><!--写入需要导出的什么类型的文件--><includes><include>**/*.properties</include><include>**/*.xml</include></includes><!--不去过滤这些文件--><filtering>false</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><!--不去过滤这些文件--><filtering>false</filtering></resource></resources>
</build>

关注 “阿汤笔迹” 微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871673.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet 映射(访问)路径的 3 种方式!

Servlet的映射(访问)路径是在Web配置文件(web.xml)中编写的。如: <!-- Servlet的访问路径 --> <servlet-mapping><servlet-name>servlet1</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>1、servlet映射…

Java初学者笔记-05、集合框架

集合体系 集合是可变长的。 Collection:代表单列集合,每个元素包含一个值。 Map:代表双列集合,每个元素包含两个值。 Collection集合List系列集合:添加的元素是有序、可重复、有索引。ArrayList、 LinekdList:有序、可重复、有索引。Set系列集合:添加的元素是无序、不重…

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处理功能;Wu.CommTool,支持Modbus RTU和MQTT调…

Servlet 详解!

一、Servlet简介 Servlet是Sun公司开发动态Web的一门技术。Sun公司在这些API中提供了一个Servlet接口,如果你想开发一个Servlet程序只需要完成如下两个步骤: 1、编写一个Java类实现Servlet接口。 2、把开发好的Java类部署到Web服务器中。 我们把实现了Servlet接口的Java程序叫…

图论/连通性

点边连通度:耳分解: 强连通有向图/边双联通无向图 从一个点出发,每次加入从集合出发回到集合,中间点不在集合内的环,一定能生成该图。 边双 强连通 双极定向:link 割空间与环空间互为正交补。 切边等价:模板 qoj1351CF1648F 树分解:也就是找到一种划分方式,使得每种划…

比特c语言-分支与循环

# 分支与循环 if语句 目录if语句ifeg:输入一个整数,判断是否为奇数elseeg:输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数嵌套ifeg:输入一个人的年龄关系操作符条件操作符eg:使用条件操作符表示代码逻辑eg:使用条件表达式找两个数中较大值逻辑操作符…

NOIP 冲刺之——数据结构

\(\texttt{0x00}\) 前言 本篇文章主要记录笔者 NOIP 冲刺阶段复习的各种数据结构题型及 tricks ans tips,同时也用于及时复习与巩固。 那么,开始吧。 \(\texttt{0x01}\) 树状数组、线段树 知识点 \(1\):二维偏序 众所周知,逆序对可以用归并排序离线求,但是要求在线呢? 这…

windows 将docker desktop上镜像打包并通过资源管理器找到使用

在 Windows 上使用 Docker Desktop 时,可以通过以下步骤将 Docker 镜像保存为 .tar 文件,并通过资源管理器找到该文件:步骤 1:打开 Docker Desktop 确保 Docker Desktop 正在运行。如果未运行,请启动它。步骤 2:打开 PowerShell 或命令提示符按 Win + S,搜索 PowerShell…

解决方案 | office365/office 修复方法

打开控制面板,选择卸载程序,右键office 一般情况下,选择快速修复可以实现修复。如不行,那么选择联机修复‘。还是不行那就重装office

【pywinauto 库】启动PC端应用程序 - 上篇

一、简介 经过上一篇的学习、介绍和了解,想必小伙伴或者童鞋们,已经见识到pywinauto的强大了,今天继续介绍pywinauto,上一篇已经可以打开计算器了,这里宏哥再提供其他方法进行打开计算器和非电脑自带程序。pywinauto 可以启动电脑自带的应用程序,也可以启动电脑安装的应用…

【反EDR 】概要

一、什么是 EDR EDR 是“端点检测和响应”的缩写。它是部署在每台机器上的代理,用于观察操作系统生成的事件以识别攻击。如果检测到某些东西,它将生成警报并将其发送到 SIEM 或 SOAR,由人工分析师进行查看。“响应”是指在识别威胁后执行的操作,例如隔离主机,这不是本文的…

USB接口颜色都代表什么含义

手机充电器人人都有!充电器线颜色都不同!你知道不同颜色的USB接口的各个颜色都代表什么含义吗?大部分人都是不知道的,这篇文章让您 一目了然!建议收藏备用!以备不时之需!