Request对象和response对象
一、概念
request对象和response对象是通过Servlet容器(如Tomcat)自动创建并传递给Servlet的。
Servlet容器负责接收客户端的请求,并将请求信息封装到request对象中,然后将request对象传
递给相应的Servlet进行处理。类似地,Servlet容器会创建一个response对象,并将其传递给
Servlet,用于生成响应并发送给客户端。
总的来说,request对象是来获取请求消息,response对象是来设置响应消息
二、Request
在Servlet的service()方法被调用时,Servlet容器会创建一个包含请求信息的HttpServletRequest对象,并将其作为参数传递给Servlet的service()方法。类似地,Servlet容器还会创建一个HttpServletResponse对象,并将其作为参数传递给Servlet的service()方法。
1、Request功能
(1)获取请求行数据
请求行的数据有:请求方式 请求url 请求协议/协议版本号
①获取请求方式:getMethod()
②获取虚拟目录:getContextPath()
③获取servlet路径:getServletPath()
④获取get方式请求参数:getQueryString()
⑤获取请求URI:统一资源定位符:getRequestURI()
统一资源标识符:getRequestURL()
⑥获取协议及版本: getProtocol()
⑦获取客户机的IP地址:getRemoteAddr()
代码示例:
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1获取请求方式String method=request.getMethod();System.out.println(method);//2获取虚拟目录String contextPath = request.getContextPath();System.out.println(contextPath);//3获取servlet路径String servletPath = request.getServletPath();System.out.println(servletPath);//4获取请求参数String queryString = request.getQueryString();System.out.println(queryString);//5获取请求URIString requestURI = request.getRequestURI();System.out.println(requestURI);StringBuffer requestURL = request.getRequestURL();System.out.println(requestURL);//6获取请求协议及版本号String protocol = request.getProtocol();System.out.println(protocol);//7获取客户机的ip地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
(2)获取请求头数据
方法:getHeader(String name):通过请求头的名称获取请求头的值
getHeaderNames():获取所有的请求头名称
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据//获取所以请求头数据Enumeration<String> headerNames = request.getHeaderNames();//遍历while(headerNames.hasMoreElements()){String s = headerNames.nextElement();//根据名称获取请求头的值String header = request.getHeader(s);System.out.println(s+"......"+header);}//演示获取请求头数据:user-AgentString header = request.getHeader("user-agent");//判断agent的浏览器版本System.out.println(header);}
(3)获取请求体数据
只有post请求有请求体
步骤:①获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
② 再从流对象中拿数据
@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求消息体--请求参数//1、获取字符流BufferedReader reader = request.getReader();//2、读取数据String line=null;while((line=reader.readLine())!=null){System.out.println(line);}System.out.println("-------------------------------------");}
2、其他功能
(1)获取请求参数(不区分post和get方法)
①根据参数名称获取参数值:getParameter(String name)
②根据参数名称获取参数值数组:getParameterValues(String name)
③获取所有请求的参数名称:getParameterNames()
④获取所有参数的map集合:getParameterMap()
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决中文乱码问题request.setCharacterEncoding("utf-8");//根据请求参数的名称获取请求参数值String username = request.getParameter("username");System.out.println(username);System.out.println("post");System.out.println();//根据参数名称获取请求参数数组String[] parameterValues = request.getParameterValues("hobby");for (String hobby:parameterValues) {System.out.println(hobby);}System.out.println();//根据所以请求参数名称Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()){String s = parameterNames.nextElement();System.out.print(s);String parameter = request.getParameter(s);System.out.println(parameter);}System.out.println();//获取所以参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();Set<String> strings = parameterMap.keySet();for(String name:strings){String[] strings1 = parameterMap.get(name);System.out.print(name);for(String value:strings1){System.out.println(value);}}}
}
(2)请求转发
在服务器内部的资源跳转方式
步骤:
通过request对象获取请求转发器对象:getRequestDispatcher(String path)。
使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 。
特点:
浏览器地址栏不发生改变
只能转发到当前服务器内部资源中
转发是一次请求
(3)共享数据
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
①setAttribute(String name,Object obj):存储数据
②getAttitude(String name):通过键获取值
③ void removeAttribute(String name):通过键移除键值对
注意:这个放于forward方法的上面,不然响应太快会导致无法获取信息!
代码示例:
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5被访问了");request.setAttribute("ttt","hhhh");//转发到demo6request.getRequestDispatcher("/requestDemo6").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Object ttt = request.getAttribute("ttt");System.out.println(ttt);System.out.println("demo6被访问了");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
(4)获取ServletContext对象 :getServletContext()
三、Response
response:设置响应消息
1、设置响应行方法
(1)设置响应行状态码方法:setStatus();
(2)设置响应头:setHeader(String name,String value)
(3)设置响应体:
使用步骤:
①获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
② 使用输出流,将数据输出到客户端浏览器
2、重定向: 一种资源跳转的方式
(1)方法:sendRedirect()
(2) 重定向的特点:redirect
① 地址栏发生变化
② 重定向可以访问其他站点(服务器)的资源
③ 重定向是两次请求。不能使用request对象来共享数据
@WebServlet( "/responseDemo1")
public class responseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo1");//设置状态码为302response.setStatus(302);/* //设置响应头locationresponse.setHeader("location","/servlet/responseDemo2");*///获取当前应用程序的上下文路径String contextPath = request.getContextPath();//简单的重定向方法response.sendRedirect(contextPath+"/responseDemo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet("/responseDemo2")
public class responseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(3)服务器输出字符数据到浏览器
步骤:
获取字符输出流
输出数据
@WebServlet("/responseDemo3")
public class responseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*//获取流对象之前,设置流的默认编码:ISO-8859-1设置为:浏览器默认编码response.setCharacterEncoding("utf-8");//告诉浏览器服务器发送的消息体数据的编码,建议浏览器使用改编码解码response.setHeader("content-type","text/html;charset=utf-8");*/response.setContentType("text/html;charset=utf-8");//解决乱码问题//获取字符输出流PrintWriter writer = response.getWriter();//输出数据writer.write("牛牛牛");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(4)服务器输出字节数据到浏览器
步骤:
获取字节输出流
输出数据
@WebServlet("/responseDemo4")
public class responseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取字节输出流ServletOutputStream outputStream = response.getOutputStream();//输出数据outputStream.write("你好".getBytes());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
三、ServletContext对象
1、概念
ServletContext 实例代表了整个 Web 应用程序的上下文环境,可以在整个应用程序中访问和共享,可以和服务器来通信。
2、获取
方式一:
通过request对象获取:request.getServletContext();
方式二:
通过HttpServlet获取:this.getServletContext();
3、功能
(1)获取MIME类
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 text/html image/jpeg
获取方法:getMimeType(String file)
代码示例:
@WebServlet("/ContextDemo1")
public class ContextDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取Context对象的方式// ServletContext servletContext = request.getServletContext();ServletContext servletContext1 = this.getServletContext();//定义文件名称String filename="a.jpg";//获取MIME类型String mimeType = servletContext1.getMimeType(filename);System.out.println(mimeType );}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(2)域对象:共享数据
① setAttribute(String name,Object value)
② getAttribute(String name)
③removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();servletContext1.setAttribute("n","hello");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext1 = this.getServletContext();Object n = servletContext1.getAttribute("n");System.out.println(n);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}
(3) 获取文件的真实(服务器)路径
方法:String getRealPath(String path)
相关文章:

Request对象和response对象
一、概念 request对象和response对象是通过Servlet容器(如Tomcat)自动创建并传递给Servlet的。 Servlet容器负责接收客户端的请求,并将请求信息封装到request对象中,然后将request对象传 递给相应的Servlet进行处理。类似地&…...

设计模式之桥接模式
文章目录 一、介绍二、案例1. 组件抽象化2. 桥梁抽象化 一、介绍 桥接模式,属于结构型设计模式。通过提供抽象与实现之间的桥接结构,把抽象化与实现化解耦,使得二者可以独立变化。 《Head First 设计模式》: 将抽象和实现放在两…...

pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案
现象: 在 Maven 创建模块Moudle时,由于开始没有正确创建好,所以把它删掉了,然后接着又创建了与一个与之前被删除的Moudle同名的Moudle时,出现了 Ignore pom.xml,并且新创建的 Module 的 pom.xml配置文件失效…...

文本编辑器Vim常用操作和技巧
文章目录 1. Vim常用操作1.1 Vim简介1.2 Vim工作模式1.3 插入命令1.4 定位命令1.5 删除命令1.6 复制和剪切命令1.7 替换和取消命令1.8 搜索和搜索替换命令1.9 保存和退出命令 2. Vim使用技巧 1. Vim常用操作 1.1 Vim简介 Vim是一个功能强大的全屏幕文本编辑器,是L…...

【算法系列篇】位运算
文章目录 前言什么是位运算算法1.判断字符是否唯一1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 丢失的数字2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 两数之和3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 只出现一次的数字4.1 题目要求4.2 做题思路4.3 Java代码实现 5.…...

机器学习的测试和验证(Machine Learning 研习之五)
关于 Machine Learning 研习之三、四,可到秋码记录上浏览。 测试和验证 了解模型对新案例的推广效果的唯一方法是在新案例上进行实际尝试。 一种方法是将模型投入生产并监控其性能。 这很有效,但如果你的模型非常糟糕,你的用户会抱怨——这…...

RNN循环神经网络
目录 一、卷积核与循环核 二、循环核 1.循环核引入 2.循环核:循环核按时间步展开。 3.循环计算层:向输出方向生长。 4.TF描述循环计算层 三、TF描述循环计算 四、RNN使用案例 1.数据集准备 2.Sequential中RNN 3.存储模型,acc和lose…...

安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…...
Docker技术--Docker的安装
1..Docker的安装方式介绍 Docker官方提供了三种方式可以实现Docker环境的安装。分别为:Script、yum、rpm。在实际的环境中建议使用yum或者是rpm。 2..Docker的yum安装 # 1.下载docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.re…...

客户案例|MemFire Cloud助推应急管理业务,打造百万级数据可视化大屏
「导语」 硬石科技,成立于2018年,总部位于武汉,是一家专注于应急管理行业和物联感知预警算法模型的技术核心的物联网产品和解决方案提供商。硬石科技作为一家高新技术企业,持有6项发明专利,拥有100余项各类平台认证和资…...

蒲公英路由器如何设置远程打印?
现如今,打印机已经是企业日常办公中必不可少的设备,无论何时何地,总有需要用到打印的地方,包括资料文件、统计报表等等。 但若人在外地或分公司,有文件急需通过总部的打印机进行打印时,由于不在同一物理网络…...

国产自主可控C++工业软件可视化图形架构源码
关于国产自主代替的问题是当前热点,尤其是工业软件领域。 “一个功能强大的全自主C跨平台图形可视化架构对开发自主可控工业基础软件至关重要!” 作为全球领先的C工业基础图形可视化软件提供商,UCanCode软件有自己的思考,我们认…...
【linux命令讲解大全】022.网络管理工具和命令概述
文章目录 lsattr命令语法选项参数实例 nmcli补充说明语法选项OPTIONSOBJECT 实例 systemctl补充说明任务 旧指令 新指令 实例 开启防火墙22端口 从零学 python lsattr命令 用于查看文件的第二扩展文件系统属性。 语法 lsattr(选项)(参数) 选项 -E:可显示设备属…...
应急响应流程及思路
应急响应流程及思路 一:前言 对于还没有在项目中真正接触、参与过应急响应的同学来说,“应急响应”这四个字见的最多的就是建筑工地上的横幅 —— 人人懂应急,人人会响应。这里的应急响应和我们网络安全中的应急响应有着某种本质的相似&…...
网页自适应
自适应 那就要最好提前商量好 是全局自适应 或者是 局部自适应 一般网站页面纵向滚动条都是无法避免的 都是做横向适配也就是宽度 那就不能写死宽度像素 局部自适应 一般对父元素设置百分比就行 里面的子元素就设置固定像素、 比如一些登录 全局自适应 也就是要对每个元素…...

什么是Sui Kiosk,它可以做什么,如何赋能创作者?
创作者和IP持有者需要一些工具帮助他们在区块链上实现其商业模式。Sui Kiosk作为Sui上的一种原语可以满足这种需求,为创作者提供动态选项,使他们能够在任何交易场景中设置完成交易的条件。 本文将向您介绍为什么要在SuiFrens中使用Sui Kiosk,…...

【MySQL】mysql connect
目录 一、准备工作 1、创建mysql用户 2、删除用户 3、修改用户密码 3.1、自己改自己密码 3.2、root用户修改指定用户的密码 4、数据库的权限 4.1、给用户授权 4.2、回收权限 二、连接mysql client 1、安装mysql客户端库 2、验证是否引入成功 三、 mysql接口 1、初…...

基于 vue2 发布 npm包
背景:组件化开发需要,走了一遍发布npm包的过程,采用很简单的模式实现包的发布流程,记录如下。 项目参考:基于vue的时间播放器组件,并发布到npm_timeplay.js_xmy_wh的博客-CSDN博客 1、项目初始化 首先&a…...

基于Axios完成前后端分离项目数据交互
一、安装Axios npm i axios -S 封装一个请求工具:request.js import axios from axios// 创建可一个新的axios对象 const request axios.create({baseURL: http://localhost:9090, // 后端的接口地址 ip:porttimeout: 30000 })// request 拦截器 // 可以自请求…...

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比
时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比。 1.Matlab实现PSO-BiLSTM和BiLSTM…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...