ServletConfig、ServletContext、HttpServletRequest与HttpServletResponse常见API

目录

一、ServletConfig

二、ServletContext

三、ServletContext其他重要API

(一)获取文件路径和上下文

(二)域对象的相关API

四、HttpServletRequest常见API

(一)获取请求行/头信息相关

(二)获得请求参数相关

五、HttpServletResponse常见API 


一、ServletConfig

ServletConfig的概念:

  • 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象

  • 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性

新建Web项目:

Servlet1:

// 可以通过注解替代在web.xml配置
@WebServlet(urlPatterns = "/servlet1",initParams = {@WebInitParam(name = "keya", value = "valueA"),@WebInitParam(name = "keyb", value = "valueB")})
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("------------------------ServletConfig获取参数----------------------------");ServletConfig servletConfig = getServletConfig();// 获取初始配置信息即可// 根据参数名获取参数值String keya = servletConfig.getInitParameter("keya");System.out.println("keya:" + keya);// 获取所有的初始参数的名字// hasMoreElements  判断有没有下一个参数  如果有返回true   如果没有返回false// nextElement      1 取出下一个元素      2 向下移动游标Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()) {String pname = initParameterNames.nextElement();System.out.println(pname + "=" + getInitParameter(pname));}        }
}

Servlet2:

@WebServlet(urlPatterns = "/servlet2",initParams = {@WebInitParam(name = "keyc", value = "valueC"),@WebInitParam(name = "keyd", value = "valueD")})
public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("------------------------ServletConfig获取参数------------------");ServletConfig servletConfig = getServletConfig();String keyc = servletConfig.getInitParameter("keyc");System.out.println("keyc:" + keyc);Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()) {String panme = initParameterNames.nextElement();System.out.println(panme + "=" + getInitParameter(panme));}}
}

tomcat配置:

启动tomcat: 

http://localhost:8080/demo03/servlet1

http://localhost:8080/demo03/servlet2

二、ServletContext

ServletContext概念:

  • ServletContext对象有称呼为上下文对象,或者叫应用域对象(后面统一讲解域对象)

  • 容器会为每个app创建一个独立的唯一的ServletContext对象

  • ServletContext对象为所有的Servlet所共享

  • ServletContext可以为所有的Servlet提供初始配置参数

Servlet1和Servlet2分别加入以下代码:

System.out.println("--------------------ServletContext获取参数---------------------");
ServletContext servletContext1 = getServletContext();
ServletContext servletContext2 = servletConfig.getServletContext();
ServletContext servletContext3 = req.getServletContext();
System.out.println(servletContext1 == servletContext2);
System.out.println(servletContext3 == servletContext2);
String encoding = servletContext1.getInitParameter("encoding");
System.out.println("encoding:" + encoding);
// 如果不知道ServletContext的参数名
Enumeration<String> parameterNames = servletContext1.getInitParameterNames();
while (parameterNames.hasMoreElements()) {String pname = parameterNames.nextElement();System.out.println(pname + "=" + servletContext1.getInitParameter(pname));
}

web.xml添加配置信息:

<context-param><param-name>encoding</param-name><param-value>UTF-8</param-value>
</context-param>
<context-param><param-name>username</param-name><param-value>zhangsan</param-value>
</context-param>

启动tomcat: 

http://localhost:8080/demo03/servlet1

http://localhost:8080/demo03/servlet2

三、ServletContext其他重要API

(一)获取文件路径和上下文

@WebServlet("/servlet3")
public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = req.getServletContext();// 获得一个指向项目部署位置下的某个文件/目录的磁盘真实路径的APIString path = servletContext.getRealPath("upload");System.out.println(path);// G:\develop\workspace\atguigujavaweb\one\basecode\out\artifacts\demo03_servletConfig_servletContext_war_exploded\upload// 获得项目部署的上下文路径:项目的访问路径String contextPath = servletContext.getContextPath();System.out.println(contextPath); // /demo03}
}

(二)域对象的相关API

  • 域对象:一些用于存储数据和传递数据的对象,传递数据不同的范围,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同。

  • ServletContext代表应用,所以ServletContext域也叫作应用域,是webapp中最大的域,可以在本应用内实现数据的共享和传递。

  • webapp中的三大域对象,分别是应用域、会话域、请求域。

API功能解释
void setAttribute(String key,Object value);向域中存储/修改数据
Object getAttribute(String key);获得域中的数据
void removeAttribute(String key);移除域中的数据

Servlet1中添加代码:

servletContext1.setAttribute("key","value");
servletContext1.setAttribute("key","valueA");
servletContext1.removeAttribute("key");

Servlet2中添加代码:能够获取到Servlet1设置的值

// 从域对象中读取数据
String key = (String) servletContext1.getAttribute("key");
System.out.println(key);

四、HttpServletRequest常见API

(一)获取请求行/头信息相关

@WebServlet("/servlet4")
public class Servlet4 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 行相关  GET/POST    uri     http/1.1System.out.println(req.getMethod()); // 获取请求方式  GETSystem.out.println(req.getScheme()); // 获取请求协议  httpSystem.out.println(req.getProtocol()); // 获取请求协议及版本  HTTP/1.1System.out.println(req.getRequestURI()); // 获取请求uri 项目内的资源路径   /demo03/servlet4System.out.println(req.getRequestURL()); // 获取请求的url    项目内资源完整的路径  http://localhost:8080/demo03/servlet4/*** URI:用于标识资源,可以是互联网上的,也可以是其他类型的资源。/demo03/servlet4* URL:用于在互联网上定位和访问资源,是实现资源访问的具体路径。http://localhost:8080/demo03/servlet4*/System.out.println(req.getLocalPort()); // 本应用容器的端口号  8080System.out.println(req.getServerPort()); // 客户端发请求时使用的端口号  8/080System.out.println(req.getRemotePort()); // 客户端软件的端口号  5391// 头相关  key:value   key:value ... ...// 根据名字单独获取某个请求头String accept = req.getHeader("Accept");System.out.println("Accept:" + accept);// Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7// 获取本次请求中所有的请求头的名字Enumeration<String> headerNames = req.getHeaderNames();while (headerNames.hasMoreElements()) {String hname = headerNames.nextElement();System.out.println(hname + ":" + req.getHeader(hname));}}
}

(二)获得请求参数相关

API功能解释
String getParameter(String parameterName);根据请求参数名获取请求单个参数值
String[] getParameterValues(String parameterName);根据请求参数名获取请求多个参数值数组
Enumeration<String> getParameterNames();获取所有请求参数名
Map<String, String[]> getParameterMap();获取所有请求参数的键值对集合
BufferedReader getReader() throws IOException;获取读取请求体的字符输入流,例如读取Json
ServletInputStream getInputStream() throws IOException;获取读取请求体的字节输入流,例如读取文件
int getContentLength();获得请求体长度的字节数

@WebServlet("/servlet5")
public class Servlet5 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取键值对形式的参数// 根据参数名获取单个参数值String username = req.getParameter("username");System.out.println(username);String password = req.getParameter("password");System.out.println(password);// 根据参数名获取多个参数值String[] hobbies = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobbies));// 获取所有的参数名Enumeration<String> parameterNames = req.getParameterNames();while (parameterNames.hasMoreElements()) {String pname = parameterNames.nextElement();String[] values = req.getParameterValues(pname);if (values.length > 1) {System.out.println(pname + "=" + Arrays.toString(values));} else {System.out.println(pname+"="+values[0]);}}// 返回所有参数的map集合     key = 参数名     value = 参数值Map<String, String[]> parameterMap = req.getParameterMap();Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();for (Map.Entry<String, String[]> entry : entries) {String key = entry.getKey();String[] values = entry.getValue();if (values.length > 1) {System.out.println(key + "=" + Arrays.toString(values));} else {System.out.println(key+"="+values[0]);}}System.out.println(req.getServletPath()); }
}

index.html: 

<form action="servlet5" method="post">用户名:<input type="tel" name="username"><br>密码:<input type="password" name="password"><br>爱好:<input type="checkbox" name="hobby" value="1">足球<input type="checkbox" name="hobby" value="2">篮球<input type="checkbox" name="hobby" value="3">排球<input type="checkbox" name="hobby" value="4">羽毛球<br><input type="submit">
</form>

运行结果: 

以上API专门用于获取key=value形式的参数,无论这些参数是在url后,还是在请求体中。

五、HttpServletResponse常见API

@WebServlet("/servlet6")
public class Servlet6 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应行相关的API      HTTP/1.1    200/404/405/505/...resp.setStatus(200);String info = "<h1>hello</h1>";// 设置响应头相关的APIresp.setHeader("aaa", "valueA");resp.setContentType("text/html");resp.setCharacterEncoding("UTF-8");resp.setContentLength(info.getBytes().length);// 设置响应体相关的APIPrintWriter writer = resp.getWriter();writer.write(info);// 获得一个向响应体中输入二进制信息的字节输出流// ServletOutputStream outputStream = resp.getOutputStream();}
}

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

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

相关文章

MySQL缓存使用率超过80%的解决方法

MySQL缓存使用率超过80%的解决方法 一、识别缓存使用率过高的问题1.1 使用SHOW GLOBAL STATUS命令监控1.2 监控其他相关指标二、分析缓存使用率过高的原因2.1 数据量增长2.2 查询模式变化2.3 配置不当三、解决缓存使用率过高的方法3.1 调整Buffer Pool大小3.1.1 计算合理的Buff…

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…

springboot004基于springboot004网页时装购物系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…

【链路层】空口数据包详解(4):数据物理通道协议数据单元(PDU)

目录 一、概述 1.1. 头部&#xff08;Header&#xff09;结构 1.2. MIC字段的情况说明 1.3. 有效载荷&#xff08;Payload&#xff09;格式与LLID字段的关联 二、LL Data PDU 2.1. 定义与用途 2.2. 头部字段设置 2.3. 空PDU&#xff08;Empty PDU &#xff09; 2.4. 数…

使用 Web Search 插件扩展 GitHub Copilot 问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。但是 Copilot 本身不能回答非技术类型的问题。为了扩展 Copilot 的功能&#xff0c;微软发布了一个名为 Web Search 的插件&am…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

python的matplotlib实现数据分析绘图

目录 需求 效果 数据分析绘图示例 代码解释 运行结果 需求 分析一个班级中学生成绩分布&#xff0c;并绘图 效果 数据分析绘图示例 import matplotlib.pyplot as plt import numpy as np# 假设的学生成绩数据 np.random.seed(0) # 设置随机种子以确保结果可复现 score…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

MySQL Online DDL

文章目录 1. 在线DDL的优势2. 支持的DDL操作3. 在线DDL的原理4. Online DDL的操作流程1. 准备阶段&#xff08;Prepare phase&#xff09;2. 拷贝阶段&#xff08;Copy phase&#xff09;3. 应用阶段&#xff08;Apply phase&#xff09;4. 替换阶段&#xff08;Swap phase&…

SwanLab安装教程

SwanLab是一款开源、轻量级的AI实验跟踪工具&#xff0c;提供了一个跟踪、比较、和协作实验的平台&#xff0c;旨在加速AI研发团队100倍的研发效率。 其提供了友好的API和漂亮的界面&#xff0c;结合了超参数跟踪、指标记录、在线协作、实验链接分享、实时消息通知等功能&…

基于rk356x u-boot版本功能分析及编译相关(三)Makefile分析

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 一、Makefile简要概述二、简要流程图三、Makefile文件具体分析大家好哈,这次因工作比较忙,文章更新拖的有些久了。哈哈,话不多说,咱们接着上次继续说u-boot的Makefile。 一、Makefile简要概述 一般要了解u-boot源码的编译…

vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-

1.前提&#xff1a; VScode中的git组件执行任何合并动作的时候需要提交远程合并的commit信息&#xff0c;然后编辑器自动打开的是nano文本编辑器 2.nano编辑器说明&#xff1a; 1.保存文件&#xff1a;按 Ctrl O&#xff0c;然后按 Enter 来保存文件。 2.退出编辑器&#xf…

微信小程序 === 使用腾讯地图选点

目录 插件介绍 接入指引 相关参数说明 插件错误处理 效果图 permission 插件的作用 添加插件 引入插件代码包 使用插件 页面 js 接口 插件介绍 腾讯位置服务地图选点插件 可以让用户快速、准确地选择并确认自己的当前位置&#xff0c;并将相关位置信息回传给开发者。…

vue内置指令和自定义指令

常见的指令&#xff1a; v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

Mac终端字体高亮、提示插件

一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可&#xff0c;安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …

CentOS8 在MySQL8.0 实现半同步复制

#原理 MySQL默认是异步的,不要求必须全部同步到从节点才返回成功结果; 同步复制: 用户发请求到代理, 代理收到请求后写/更新数据库写入到二进制日志bin_log, 然后必须等数据发到所有的从节点, 从节点全部收到数据后, 主节点才返回给客户端的成功结果。 弊端&#xff1a; 客…