当前位置: 首页 > news >正文

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容器&#xff08;如Tomcat&#xff09;自动创建并传递给Servlet的。 Servlet容器负责接收客户端的请求&#xff0c;并将请求信息封装到request对象中&#xff0c;然后将request对象传 递给相应的Servlet进行处理。类似地&…...

设计模式之桥接模式

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

pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案

现象&#xff1a; 在 Maven 创建模块Moudle时,由于开始没有正确创建好&#xff0c;所以把它删掉了&#xff0c;然后接着又创建了与一个与之前被删除的Moudle同名的Moudle时&#xff0c;出现了 Ignore pom.xml&#xff0c;并且新创建的 Module 的 pom.xml配置文件失效&#xf…...

文本编辑器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是一个功能强大的全屏幕文本编辑器&#xff0c;是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 研习之三、四&#xff0c;可到秋码记录上浏览。 测试和验证 了解模型对新案例的推广效果的唯一方法是在新案例上进行实际尝试。 一种方法是将模型投入生产并监控其性能。 这很有效&#xff0c;但如果你的模型非常糟糕&#xff0c;你的用户会抱怨——这…...

RNN循环神经网络

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

安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…...

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助推应急管理业务,打造百万级数据可视化大屏

「导语」 硬石科技&#xff0c;成立于2018年&#xff0c;总部位于武汉&#xff0c;是一家专注于应急管理行业和物联感知预警算法模型的技术核心的物联网产品和解决方案提供商。硬石科技作为一家高新技术企业&#xff0c;持有6项发明专利&#xff0c;拥有100余项各类平台认证和资…...

蒲公英路由器如何设置远程打印?

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

国产自主可控C++工业软件可视化图形架构源码

关于国产自主代替的问题是当前热点&#xff0c;尤其是工业软件领域。 “一个功能强大的全自主C跨平台图形可视化架构对开发自主可控工业基础软件至关重要&#xff01;” 作为全球领先的C工业基础图形可视化软件提供商&#xff0c;UCanCode软件有自己的思考&#xff0c;我们认…...

【linux命令讲解大全】022.网络管理工具和命令概述

文章目录 lsattr命令语法选项参数实例 nmcli补充说明语法选项OPTIONSOBJECT 实例 systemctl补充说明任务 旧指令 新指令 实例 开启防火墙22端口 从零学 python lsattr命令 用于查看文件的第二扩展文件系统属性。 语法 lsattr(选项)(参数) 选项 -E&#xff1a;可显示设备属…...

应急响应流程及思路

应急响应流程及思路 一&#xff1a;前言 对于还没有在项目中真正接触、参与过应急响应的同学来说&#xff0c;“应急响应”这四个字见的最多的就是建筑工地上的横幅 —— 人人懂应急&#xff0c;人人会响应。这里的应急响应和我们网络安全中的应急响应有着某种本质的相似&…...

网页自适应

自适应 那就要最好提前商量好 是全局自适应 或者是 局部自适应 一般网站页面纵向滚动条都是无法避免的 都是做横向适配也就是宽度 那就不能写死宽度像素 局部自适应 一般对父元素设置百分比就行 里面的子元素就设置固定像素、 比如一些登录 全局自适应 也就是要对每个元素…...

什么是Sui Kiosk,它可以做什么,如何赋能创作者?

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

【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包

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

基于Axios完成前后端分离项目数据交互

一、安装Axios npm i axios -S 封装一个请求工具&#xff1a;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…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...