JavaWeb基础专项复习5——请求对象和响应对象request and response
系列文章目录
1、JavaWeb基础专项复习1——XML文件-CSDN博客
2、JavaWeb基础专项复习2——JSP文件-CSDN博客
3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客
4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客
文章目录
- 系列文章目录
- 文章目录
- 1、Tomcat 请求响应机制
- 2、HttpServletRequest 功能
- 2.1 获取请求头数据
- 2.2 获取请求相关其他方法
- 3、HttpServletRequest获取参数
- 3.1 传递参数方式
- 3.2 获取参数方法
- 3.3 中文乱码处理
- 3.3.1 POST 请求:
- 3.3.2 GET 请求:
- 3.6 HttpServletRequest请求转发
- 3.7 request 作用域
- 4、HttpServletResponse 功能
- 4.1 功能介绍
- 4.2 设置状态码和其他方法
- 4.3 设置响应头信息
- 4.4 中文乱码问题
- 4.5 重定向
1、Tomcat 请求响应机制
Web 服务器接收到客户端的 HTTP 请求后,会为每次请求创建request
和response
对象,分别用于获取客户端数据和向客户端输出数据。
2、HttpServletRequest 功能
HttpServletRequest在JavaWeb中非常重要的一个类。它是Servlet的service()方法的参数之一。所以必须要掌握它
request的功能可以分为以下几种:
- 封装了请求头数据;
- 封装了请求正文数据,如果是GET请求,那么就没有正文;
- request是一个域对象,可以把它当成Map来添加获取数据;
- 做请求的转发(一次请求一次数据)·(重定向(两次请求,两次数据))
2.1 获取请求头数据
通过request.getHeader("请求头名称")
获取指定请求头数据
request.getHeaderNames()
可获取所有请求头名称。
response.setContentType("text/html;charset=utf-8");
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()) {String name = (String)names.nextElement();String value = request.getHeader(name);System.out.println(name + ": " + value);response.getWriter().println(name + ": " + value + "<br/>");
}
2.2 获取请求相关其他方法
涵盖获取请求正文字节数、请求类型、请求方法、客户端 IP 地址等众多方法,还能操作请求 URL 各部分信息。
- int getContentLength():获取请求正文的字节数,GET请求没有正文,没有正文返回-1;
- String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded(理解为字符串类型),其它类型以后再学;
- String getMethod():返回请求方法,例如:GET post delete put
- Locale getLocale():返回当前客户端浏览器支持的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
- String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null。表示使用ISO-8859-1编码;GBK UTF-8
- void setCharacterEncoding(String code):设置请求编码,只对正文有效!注意,对于GET而言,没有正文!!!所以此方法只能对POST请求中的参数有效!
- http://localhost:8080/hello/oneServlet?name=zhangSan
- String getContextPath():返回上下文路径,例如:/项目名称
- String getQueryString():返回请求URL中的参数,例如:name=zhangSan
- String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
- StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
- String getServletPath():返回Servlet路径,例如:/oneServlet
- String getRemoteAddr():返回当前客户端的IP地址;
- String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
- int getRemotePort():返回客户端的端口号,每次请求都会变;
- String getSchema():返回请求协议,例如:http;
- String getServerName():返回主机名,例如:localhost
- int getServerPort():返回服务器端口号,例如:80
3、HttpServletRequest获取参数
3.1 传递参数方式
GET 和 POST,GET 可在地址栏、超链接、表单中传递参数;POST 主要在表单中传递。
GET:
- 地址栏中直接给出参数:http://localhost/param/ParamServlet?p1=v1&p2=v2;
- 超链接中给出参数:
<a href=” http://localhost/param/ParamServlet?p1=v1&p2=v2”>点一下</a>
- 表单中给出参数:<form method=”GET” action=”ParamServlet”>…</form>
- Ajax
POST:
- 表单中给出参数:<form method=”POST” action=”ParamServlet”>…</form>
- Ajax
3.2 获取参数方法
String getParameter(String name)
获取单值参数;String[] getParameterValues(String name)
获取多值参数(如复选框);Enumeration getParameterNames()
获取所有参数名;Map getParameterMap()
获取所有参数的 Map 集合。
单值参数接收示例
前台接收
<form action="ParamServlet" method="post"><input type="text" name="p1"/><br/><input type="text" name="p2"/><br/><input type="submit" value="提交"/><br/>
</form>
<a href="ParamServlet?p1=v1&p2=v2">Param</a>
后台接收
String s1 = request.getParameter("p1");
String s2 = request.getParameter("p2");
response.getWriter().print("p1 = " + s1 + "<br/>");
response.getWriter().print("p2 = " + s2 + "<br/>");
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {String name = (String)names.nextElement();String value = request.getParameter(name);System.out.println(name + " = " + value);
}Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){String[] vals = map.get(key);System.out.print(key+" :");System.out.println(key+" :" + Arrays.toString(vals));System.out.println();
}
多值参数接收
多值参数主要就是多选checkbox
例如在注册表单中,如果让用户填写爱好,那么爱好可能就是多个。那么hobby参数就会对应多个值:
前台接收
<form action="ParamServlet" method="post">上网:<input type="checkbox" name="hobby" value="netplay" /><br/>踢球:<input type="checkbox" name="hobby" value="football" /><br/>看书:<input type="checkbox" name="hobby" value="read" /><br/>编程:<input type="checkbox" name="hobby" value="programme" /><br/><input type="submit" value="提交"/><br/>
</form>
后台接收
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){String[] vals = map.get(key);System.out.println(key+" :" + Arrays.toString(vals));
}
3.3 中文乱码处理
3.3.1 POST 请求:
我们知道,请求信息中,只有POST存在正文,所谓POST参数编码就是就是请求正文的编码。默认情况下,使用getParameter()获取POST请求参数时,使用的是ISO-8859-1编码。
方法一,针对字符串本身进行手动转码
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);
方法二,在获取参数前使用request.setCharacterEncoding("UTF-8")
设置编码。
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("name:"+name);
对于每个请求,只需要调用request的setCharacterEncodng()一次,然后所有getParameter()都会使用这个编码来解读参数。但要注意,只对请求正文有效,即POST参数。
该方法 必须放在获取参数值之前
3.3.2 GET 请求:
方法一,对字符串单独解码
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);
方法二,在 Tomcat 的server.xml
中配置URIEncoding="UTF-8"
,但 Tomcat8.5 及以上版本无需设置即可支持 URL 传递中文。(不建议使用get请求传递中文参数)
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8"/>
3.6 HttpServletRequest请求转发
用于在 Servlet 中执行后台业务逻辑后跳转页面,地址栏不变,可跳转到静态页面或 Servlet,还能在请求域内设置和获取属性值。
request.getRequestDispatcher("/success.html").forward(request, response);
此时我们可以给request来设置当前域中的属性值,在该域之内(当前请求完成之前)都能获得到该属性值。
request.setAttribute("name", "txjava");
request.getAttribute("name");
3.7 request 作用域
范围是一次请求响应内,每个线程请求会新生成HttpServletRequest
和HttpServletResponse
对象。
ServletContext
ServletContext 代表整个 Web 应用程序的上下文,在服务器启动时为每个 Web 应用创建一个 ServletContext 对象,所有 Servlet 共享这个对象。它主要用于在整个 Web 应用的不同部分之间共享数据、获取 Web 应用的全局信息等。HttpSession
HttpSession 用于在服务器端跟踪客户端的会话状态。每个客户端访问服务器时,服务器会为其创建一个唯一的 HttpSession 对象,通过会话 ID 来识别不同的客户端。它可以在用户的多次请求之间保持数据,适用于存储用户的登录信息、购物车内容等。HttpServletRequest
HttpServletRequest 代表客户端的请求,当客户端向服务器发送请求时,服务器会创建一个 HttpServletRequest 对象,该对象封装了客户端请求的所有信息,如请求头、请求参数、请求方法等.
4、HttpServletResponse 功能
request是请求对象,而response是响应对象。
response对象用于响应client请求,向客户输出信息。
他封装了JSP产生的响应,并发送到client以响应client请求。
4.1 功能介绍
用于响应客户端请求,包括设置响应头信息、发送状态码、设置响应正文、重定向等功能。
- 设置响应头信息;addHeader(“reFresh”, “5;URL=xxxx”);
- 发送状态码;sendError(404);
- 设置响应正文;getWriter().print(“fdsfdsa”);
- 重定向:sendRedirect(“path”);
4.2 设置状态码和其他方法
- response.setContentType("text/html;charset=utf-8")设置响应类型和编码
- response.setCharacterEncoding(“utf-8”):如果响应类型为文本,那么就需要设置文本的编码类型,然后浏览器使用这个编码来解读文本。注意!如果没有设置contentType,那么浏览器会认为contentType为text/html,如果没设置编码,那么默认为ISO-8859-1编码。所以以上两点在使用response返回结果之前必须设置。
- response.setStatus(200):设置状态码
- response.sendError(404, “您要查找的资源不存在”):发送错误状态码并显示错误信息。
4.3 设置响应头信息
- response.setHeader(“contentType”, “text/html;charset=utf-8”):与setContentType()方法的功能相同。setContentType()方法属于便捷方法;
- 刷新(定时重定向):response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。
4.4 中文乱码问题
通过setContentType("text/html;charset=utf-8")
和setCharacterEncoding("UTF-8")
解决。
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("张三");
4.5 重定向
使用sendRedirect
方法,可重定向到不同主机,会使request
中的属性失效并开启新的request
对象。
这一点与转发不同。在client浏览器上将会得到跳转后的地址,并又一次发送请求链接;用户能够从浏览器的地址栏中看到跳转后的地址
response.sendRedirect("/param_demo/success.html");
相关文章:

JavaWeb基础专项复习5——请求对象和响应对象request and response
系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 文章目录 系列文章目录文章目录1、Tom…...

mac下载MAMP6.8.1;解决mac使用小皮面板安装php7.4
因为mac的小皮面板没有php7.4了 链接:c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程:MAMP PRO教程 - 牛奔 - 博客园 更新一下,2-27 昨天已经可以使用php7.4了,我就在想能…...

大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3)
大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3) 前言本篇摘要12. LangChain原理及agents构建Gradio UI12.3 LangChain架构12.3.1 LangChain12.3.2 Integration Packages1. 概念2. 示例12.3.3 LangGraph1. 概念2. 示例12.3.4 LangGraph Platform1. 概览2. 优势分…...

redis --- 相关基础知识整理
目录 一、基本1、数据结构2、有序集合的编码1. 压缩列表(Ziplist)2. 跳跃列表(SkipList)3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化(RDB AOF)4、 RDB和AOF的对比…...
如何用 Python 进行机器学习
文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 数据收集与加载3. 数据探索与可视化4. 数据预处理5. 模型选择与训练6. 模型评估7. 模型调优8. 模型部署 前言 使用 Python 进行机器学习一般可以按照以下步骤进行,下面将详细介绍每个步骤及对应…...

《Effective Objective-C》阅读笔记(下)
目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...
解释Promise的工作原理及其状态
Promise的工作原理及其状态 1. 什么是Promise? Promise是JavaScript中的一种用于处理异步操作的对象。它代表一个可能在未来某个时间点完成的操作,并且可以有三种状态:待定(pending)、已解决(fulfilled&a…...
SHELL32!ILCombine函数分析之连接两个idl
SHELL32!ILCombine函数分析之连接两个idl 第一部分: STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...
es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
Elasticsearch 生产集群部署架构及面试解析 在后端面试中,Elasticsearch(ES)是一个经常被问到的技术点,尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验,而不仅仅是玩过一…...
Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用
1. 信号与槽机制的基本原理 在 Qt 中,信号与槽机制是一种事件驱动的通信方式,用于对象之间的解耦交互。其关键特点如下: 信号不能直接调用 信号只是一个声明,并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...

ollama和open-webui部署ds
博客地址: ollama和open-webui部署ds 引言 最近,deepseek是越来越火,我也趁着这个机会做了下私有化部署,我这边使用的ollama和 open-webui实现的web版本 ollama 简介 Ollama 是一个开源的工具,专门用于简化机器学…...
泛微Ecode新增Button调用服务器中的JSP页面里的方法
前言 前端Ecode调用 后端接口编写 JSP文件方法 总结 前言 因为我们是从之前E8版本升级到E9的,所以会有一些接口是通过jsp文件来实现前后端调用的,这里介绍的就是如果你有接口是写在jsp文件里面调用的,但是你又想在Ecode中调用的对应的接…...
LVS+Keepalived高可用群集配置案例
以下是一个 LVSKeepalived 高可用群集配置案例: 1、环境准备 LVS 主调度器(lvs1):IP 地址为 192.168.8.101,心跳 IP 为 192.168.4.101LVS 备调度器(lvs2):IP 地址为 192.168.8.102…...

杰发科技AC7801——滴答定时器获取时间戳
1. 滴答定时器 杰发科技7801内部有一个滴答定时器,该定时器是M0核自带的,因此可以直接用该定时器来获取时间戳。 同样,7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器,它从预设的重装载值…...

Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)
Pycharm使用matplotlib出现的问题 问题1:Pycharm调试时出现:AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因:可能是由于matplotlib后端设置不正确或与运行环境不兼容引…...

Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替
如题,笔者在Cursor中使用pycharm写python程序,试用期到了Tab自动补全功能就不能用了,安装Codeuim插件可以代替这个功能。步骤如下: 1. 在应用商店中搜索扩展Codeuim,下载安装 2. 安装完成后左下角会弹出提示框&#x…...
spring--ApplicationContext和BeanFactory的区别(源码)
ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。 一、 功能对比 特性BeanFactoryApplicati…...

HTMLS基本结构及标签
HTML5是目前制作网页的核心技术,有叫超文本标记语言。 基本结构 声明部分位于文档的最前面,用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后,用于告知浏览器这是一个HTML文档。< html>表示文档开始,&l…...

【蓝桥杯嵌入式】各模块学习总结
系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…...

Vue的项目创建以及项目目录与组合式API
一.创建Vue 1.Vue-CLI:创建Vue的脚手架工具 2.Create-vue:是Vue官方提供的脚手架之一,底层采用官方自主研发的vite,快捷,开发方便。 3.准备工作:系统中需要安装nodejs环境,在该环境中提供npm包管理器 4.创建Vue项目的命令:npm init vuela…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...