【Jsp】第三课 Servlet常用对象(二)

2024-05-11 17:18

本文主要是介绍【Jsp】第三课 Servlet常用对象(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里介绍第二个常用对象,ServletContext

概述

1. T omcat服务器为每个web项目都创建一个ServletContext实例,而且只有一个ServletContext对象
2.ServletContext在 tomcat服务器 启动时创建对象,分配内存,服务器关闭时销毁对象,释放内存
3. 在一个web项目中 共享数据 ,管理web项目资源。为整个web配置公共信息等,通俗点讲,就是 一个web项目,就存在一个ServletContext实例 ,每个Servlet都可以访问到它。

共享静态数据

通过上一文章我们学习到ServletConfig对象只能操作每一个Servlet自己的静态数据,那么这在我们开发网站的时候造成了一定的局限性,如果我需要让多个Servlet共享调用同一部分数据,那就造成了一定的麻烦,刚好ServletContext对象就解决了这一问题,就是所有Servlet都能共享同一部分的静态数据。这里如果对ServletConfig对象的使用还未掌握的,可以学习一下文章。【Jsp】第三课 Servlet常用对象(一)_笔触狂放的博客-CSDN博客在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里先介绍第一个常用对象,ServletConfig。概述1.在Servlet的配置文件中,可以使用一个或多个<init-param>标签为Servlet配置一些初始化参数。2.配置在注册信息的Servlet标签中3.当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中4.并在调用servlet的init方法时,https://blog.csdn.net/u010321564/article/details/120674383 那么接下来我们来看看怎么定义共享的静态数据,这里需要将数据添加在web.xml文件中,记住添加的静态数据一定要放在<web-app>标签中,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>Day04Jsp</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><context-param><param-name>lanqiu</param-name><param-value>篮球</param-value></context-param><context-param><param-name>zuqiu</param-name><param-value>足球</param-value></context-param></web-app>

 这里添加共享的静态数据的格式如下:

<context-param><param-name>名称</param-name><param-value>值</param-value></context-param>

如果需要添加更多的静态数据,只要按照这种格式,继续添加即可。

那既然是共享的静态数据,也就意味着所有Servlet都能获得这些内容,接下来我们使用Java注解的方式快速创建三个Servlet,分别命名为Servlet1,Servlet2,Servlet3来演示一下,是否都能获得这些静态数据。为了让初学者更好的理解,可以将三个Servlet看成一个班级中的三个同学,而共享的静态数据可以看成是班级中共有的财产,大家都能使用。接下来看代码:

package com.servlet;import java.io.IOException;import javax.jws.soap.InitParam;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet1*/
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet1() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html");response.setCharacterEncoding("UTF-8");//Servlet1想打篮球//1.获得ServletContext对象ServletContext context=getServletContext();//2.通过对象获得Web.xml文件中的共享的静态数据String n=context.getInitParameter("lanqiu");//将获得的数据发给浏览器显示response.getWriter().append("Servlet1获得了共享的静态数据:"+n);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

将项目运行起来后,根据Servlet1的虚拟地址访问Servlet1,你会发现可以拿到静态数据并显示出来。

package com.servlet;import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet2*/
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet2() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");//Servlet1想玩足球//1.获得ServletContext对象ServletContext context=getServletContext();//2.通过对象获得Web.xml文件中的共享的静态数据String n=context.getInitParameter("zuqiu");//将获得的数据发给浏览器显示response.getWriter().append("Servlet2获得了共享的静态数据:"+n);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

 Servlet2选择了拿静态数据的足球,通过name也能获得共享的静态数据。初学者可自行运行代码,查看运行结果。

package com.servlet;import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet3*/
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet3() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");//Servlet1想打篮球//1.获得ServletContext对象ServletContext context=getServletContext();//2.通过对象获得Web.xml文件中的共享的静态数据String n=context.getInitParameter("lanqiu");//将获得的数据发给浏览器显示response.getWriter().append("Servlet3获得了共享的静态数据:"+n);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

Servlet3选择获得篮球,根据运行效果,可以看出三个Servlet都能随意的获得两个共享的静态数据。

共享动态数据

ServletContext对象不仅仅提供了静态数据,而且还能使用Java共享动态数据。那么这里我们再创建一个Servlet4,这里假设Servlet4是第四个同学,该同学有一个排球,他觉得班级里只有篮球和足球不够大家玩,那么他自行将自己的排球贡献出来作为班级的公共财产,让所有Servlet一起用,代码如下:

package com.servlet;import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet4*/
@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet4() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");//给ServletContext添加动态数据//1.获得ServletContext对象ServletContext sc=getServletContext();//2.使用java代码往ServletContext对象中存放数据称为动态数据//第二个参数要求是Object类型,存放的是字符串为什么不报错?//因为在java里面,Object类型是所有数据类型的最终父类//将"排球"做向上转型转换成了Object类型存起来sc.setAttribute("pq", "排球");//从ServletContext对象中获得排球//需要使用的时候,需要做向下转型(强制类型转换),//将存起来的Object类型的数据转换回String类型String a=(String) sc.getAttribute("pq");response.getWriter().append("Servlet4获得动态数据为: "+a);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

 通过以上代码,可以发现动态数据需要是要setAttribute("pq", "排球");方法根据name和value的形式动态的添加数据,获得动态数据的时候,需要使用getAttribute("pq")方法根据name的名称获得value数据,但一定要做多态的向下转型,因为动态数据的添加Java源代码做了多态的向上转型,为了能存储更多数据类型的不同数据。那么接下来,我们使用之前的Servlet3看能不能获得Servlet4提供的排球。代码如下:

 接下来,我们将项目运行起来,我们先访问Servlet4,将排球进行贡献出来,然后再访问Servlet3,你会看到,Servlet3不仅仅可以获得静态数据,也能获得Servlet4提供的动态数据。

但是如果你重新运行了项目之后,先访问Servlet3,之后访问Servlet4,你会发现Servlet3并不能获得排球。那是因为我们之前讲了ServletContext对象的概念,一旦tomcat停止服务ServletContext对象就会被CPU强制销毁,即里面存放的数据也会被清空,所有才会导致Servlet3获取不到之前Servlet4贡献的排球这个数据。希望初学者可以根据知识点进行理解这个现象。

动态数据任何Servlet都能进行添加,也能进行获得,同时也能进行修改和删除,其他Servlet可以将已存在的动态数据进行修改,只要知道已存在的数据的name即可,用新数据覆盖原有的数据。删除就需要调用removeAttribute("pq")方法根据动态数据的名称进行删除。这里我们在Servlet2中将Servlet4贡献的排球进行删除掉。

 那么当执行Servlet2之后,排球这个数据就已经不存在了,Servlet3就不能在获得这个数据。这里初学者可以自行运行,查看运行结果。

共享文件数据

ServletContext还提供了几个方法可以获得项目中的文件数据,这里我们选中webContent或者webapp文件夹右键--new--file,新建一个文件,文件命名为text.txt记事本文档。

 创建完成后,你会查看到以下结果:

使用Java注解创建Servlet5,ServletContext还提供了三个操作文件的方法:

1.getRealPath():获得项目中指定文件的绝对路径

2.getResourceAsStream():获得项目中指定文件的内容转换成输入流字节

3.getResourcePaths():获得项目中指定文件夹下的所有子文件及子文件路径

那么先看第一个方法,获得text.txt文件在磁盘中的完整路径,代码如下:

package com.servlet;import java.io.IOException;
import java.io.InputStream;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet5*/
@WebServlet("/Servlet5")
public class Servlet5 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet5() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得当前项目在WebContent或者WebApp文件夹下的文件的绝对路径//1.先获得ServletContext对象ServletContext sc=getServletContext();//2.获得text.txt文件的绝对路径String path=sc.getRealPath("text.txt");System.out.println(path);//response.getWriter().append("Served at: ").append(request.getContextPath());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

通过运行可以在控制台看到text.txt文件的完整路径。

第二个方法可以读取文件内容,代码如下:

package com.servlet;import java.io.IOException;
import java.io.InputStream;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet5*/
@WebServlet("/Servlet5")
public class Servlet5 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet5() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得当前项目在WebContent或者WebApp文件夹下的文件的绝对路径//1.先获得ServletContext对象ServletContext sc=getServletContext();//2.获得text.txt文件的绝对路径String path=sc.getRealPath("text.txt");System.out.println(path);//在java中IO流:InputStream(输入流),OutputStream(输出流)//1.从网上下载图片,对于你来说是输入还是输出?//2.电脑上存了一本小说,打开小说进行阅读,对于你来说是输入还是输出?//3.女朋友发了一条短信,你回了一条,对于你来说是输入还是输出?//区分是输入还是输出总结一句话:完成该流程的过程中,始终以自己为主场,观察数据的流向//将text.txt文本里面的内容通过输入流的方式读取出来//分析:1.可能读取的数据非常多,所以不会一次性读取所有数据,这样会造成用户的等待//读取数据是分部分读取,一般情况下一次读取1kb的内容=1024bytebyte[] bytes=new byte[1024];//一次读取512个字//2.可能读取的数据非常小//作用:用于判断是否读取的内容小于1024int count=-1;//-1表示读取结束//String  StringBuffer StringBuilder//String:内存大小是不可变的--是由多个char数组String name="abc";name=name+"ddd";System.out.println(name);//StringBuffer:内存是可变的,但是执行效率不高//StringBuilder:内存是可变的,执行效率高//3.将每一次读取的数据进行临时的存储StringBuilder builder=new StringBuilder();//将text.txt文件内容读取,转换成输入流InputStream is=sc.getResourceAsStream("/text.txt");//将数据从输入流中每次读取1024个字节,并把每一次读取的字节数量赋值给count,进行存储//判断读取的字节数是否等于-1,如果等于说明内容已经全部读取完成,需要停止循环while ((count=is.read(bytes))!=-1) {//因为读取的是字节,但是需要转换成字符串String s=new String(bytes, 0, count);//将临时读取的内容存储至StringBuilder中builder.append(s);}//输出在控制台System.out.println(builder.toString());//response.getWriter().append("Served at: ").append(request.getContextPath());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
接着可以打开text.txt文档,输入一些文本信息,然后运行项目,访问Servlet5可在控制台显示通过java代码IO流读取的文件中的内容。
第三个方法可以指定一个文件相对路径,获得该文件下的所有子文件路径。
//指定一个文件夹路径,可以得到该文件夹下的所有子文件的路径Set<String> oSet=sc.getResourcePaths("/WEB-INF");for (String string : oSet) {System.out.println(string);}

执行效果这里不再演示,初学者可自行运行,查看效果。

这篇关于【Jsp】第三课 Servlet常用对象(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

帆软报表常用操作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 帆软报表常用操作 多序号实现使用数据集作为参数空白页或者竖线页修改页面Title金额,或者保留两位小数等等设置日期格式显示图片使用公式 多序号实现 所用函数为SEQ(),如果一张报表中需要用到多个序号,那么就需要加入参数SEQ(1),SEQ(

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

XMG 常用的手势

// 创建点按手势     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];    tap.numberOfTabsRequired=2; //点击的次数

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment="Center" Content="Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header="打开"/><MenuItem Header="-"/><MenuItem Header="关闭"/></MenuFlyout></Button.Flyout></B

Git代码管理的常用操作

在VS022中,Git的管理要先建立本地或远程仓库,然后commit到本地,最后push到远程代码库。 或者不建立本地的情况,直接拉取已有的远程代码。 Git是一个分布式版本控制系统,用于跟踪和管理文件的变化。它可以记录文件的修改历史,并且可以轻松地回滚到任何历史版本。 Git的基本概念包括: 仓库(Repository):Git使用仓库来存储文件的版本历史。一个仓库可以包含多个文件