HttpServletRequest简介

HttpServletRequest是什么?

  • HttpServletRequest是一个接口,其父接口是ServletRequest;
  • HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;
  • HttpServletRequest代表客户端发来的请求,请求中的所有信息都可以通过该对象获得;

5c513a5fd6cf4f44b4e9286a189c9e42.png 

如何使用HttpServletRequest? 

获取请求行信息相关方法:

这些方法用于获取客户端发送请求时的信息,包括 URL、协议、方法、端口等。

API功能解释
StringBuffer getRequestURL()获取客户端请求的完整 URL。
String getRequestURI()获取客户端请求的项目目录的具体资源。
int getServerPort()获取客户端发送请求时使用的服务器端口。
int getLocalPort()获取应用程序所在容器的端口。
int getRemotePort()获取客户端程序所使用的端口。
String getScheme()获取请求的协议(如 HTTP、HTTPS)。
String getProtocol()获取请求使用的协议及版本号(如 HTTP/1.1)。
String getMethod()获取请求的 HTTP 方法(如 GET、POST)。

获取请求头信息相关方法:

这些方法用于处理请求头信息,包括获取特定请求头或所有请求头的名称。

API功能解释
String getHeader(String headerName)根据头名称获取请求头的值。
Enumeration getHeaderNames()获取所有的请求头名称。
String getContentType()获取 Content-Type 请求头。

 

package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.Enumeration;@WebServlet("/servlet04")
public class servlet4_1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 行情求相关 get/post           uri         http/1.1System.out.println(req.getMethod()); // 获取请求方式System.out.println(req.getScheme()); // 获取请求协议System.out.println(req.getProtocol()); //获取请求协议及其版本System.out.println(req.getRequestURI());// 获取请求的uri 项目内的资源路径System.out.println(req.getRequestURL());// 获取请求的url 项目内的资源的完成的路径System.out.println(req.getLocalPort());//本应用容器的端口号8080System.out.println(req.getServerPort());        // 客户端发请求时使用的端口号System.out.println(req.getRemotePort());// 客户端软件的端口号System.out.println("--------------------头请求-------------------------");// 根据名字单独获取请求头String accept = req.getHeader("Accept");System.out.println("Accept :" + accept );// 获取本次请求中所有的请求头的名字System.out.println("--------------------所有请求头----------------------");Enumeration<String> headNames = req.getHeaderNames();while(headNames.hasMoreElements()){String hname = headNames.nextElement();System.out.println(hname +" : " +req.getHeader(hname));}}
}

控制台输出:

1e03dc339963424493113bb11f49e72c.png 浏览器的报文内容

dd7efb69828c44b7804a674a2728e8e7.png

获取请求参数相关API

API功能解释
String getParameter(String parameterName)根据请求参数名获取请求单个参数值。
String[] getParameterValues(String parameterName)根据请求参数名获取请求多个参数值数组。
Enumeration getParameterNames()获取所有请求参数名。
Map<String, String[]> getParameterMap()获取所有请求参数的键值对集合。
BufferedReader getReader() throws IOException获取读取请求体的字符输入流。(JSON串)
ServletInputStream getInputStream() throws IOException获取读取请求体的字节输入流。(读文件)
int getContentLength()获取请求体长度的字节数。
package Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;@WebServlet ("/servlet05")
public class servlet4_2 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("usePsw");System.out.println(password);// 根据参数名获取多个参数值String[] hobbies = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobbies));// 获取所有的参数名Enumeration<String> pnames = req.getParameterNames();while(pnames.hasMoreElements()){String pname = pnames.nextElement();String[]  values = req.getParameterValues(pname);if(values.length > 1){System.out.println(Arrays.toString(values));}else System.out.println(pname + " =  " + values[0]);}System.out.println("----------------Map--------------------");// 返回所有参数的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 pname =  entry.getKey();String[] value = entry.getValue();if(value.length > 1){System.out.println(pname +" = " + Arrays.toString(value));} else System.out.println(pname + " = " + value[0]);}}}

.System.out.println(Arrays.toString(hobbies))

  • Arrays.toString(hobbies) 将数组 hobbies 转换为字符串表示形式(如 ["reading", "swimming", "coding"]),方便输出查看。
  • System.out.println 会将转换后的字符串打印到控制台,便于开发者检查获取到的参数值

HTML代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
# 可以改成post方法,Java代码同样可以处理
<form action="servlet05" method="get"><input type="text" name="username"> <br><input type="password" name="usePsw"> <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"> 铅球<input type="submit" >
</form>
</body>
</html>

Get请求和post请求的区别 

数据传递方式

  • GET 请求
    • 数据通过 URL 查询字符串 传递,放在 URL 的末尾。
    • 例如:GET /search?query=java HTTP/1.1,其中 query=java 是查询参数。
    • 查询字符串长度受浏览器和服务器的限制(通常在 2000 个字符左右)。
  • POST 请求
    • 数据通过 请求体(body) 传递,而不是 URL。这使得 POST 请求适合传输较大或复杂的数据。
    • 例如:POST /submit HTTP/1.1,数据放在请求体中(如表单数据或 JSON 数据)。

其他常用API

API功能解释
String getServletPath()获取请求的 Servlet 的映射路径。(就是WebServlet ("/servlet05")中的 /servlet05)
ServletContext getServletContext()获取 ServletContext 对象,用于与 Servlet 环境交互。
Cookie[] getCookies()获取请求中所有的 Cookie
HttpSession getSession()获取 HttpSession 对象,处理会话信息。
void setCharacterEncoding(String encoding)设置请求体字符编码。

HttpServletRequest怎么用? 

. 设置响应行相关:

API功能解释
void setStatus(int code)设置响应状态码
  • setStatus(int code):用于设置 HTTP 响应的状态码,如 200(成功)、404(未找到)、500(服务器内部错误)等。

2. 设置响应头相关:

API功能解释
void setHeader(String headerName, String headerValue)设置或修改响应头键值对。
void setContentType(String contentType)设置 Content-Type 响应头以及字符集(设置 MIME 类型)。
  • setHeader(String headerName, String headerValue):用于设置或修改 HTTP 响应头信息。例如,设置 Content-TypeCache-Control 等。
  • setContentType(String contentType):用于设置 Content-Type 响应头,指定返回内容的类型,如 text/htmlapplication/json 等。

3. 设置响应体相关:

API功能解释
PrintWriter getWriter() throws IOException获取响应输出体放入信息的字符输出流(通常用于文本)。
ServletOutputStream getOutputStream() throws IOException获取响应输出体放入信息的字节输出流(通常用于二进制数据)。
void setContentLength(int length)设置响应体的字节长度,其实质是在设置 Content-Length 响应头。
  • getWriter():用于获取 PrintWriter 对象,可以通过它向客户端发送字符数据(如 HTML、JSON、纯文本等)。
  • getOutputStream():用于获取 ServletOutputStream 对象,通常用于发送二进制数据(如图片、PDF 等)。
  • setContentLength(int length):设置响应体的字节长度,用于告诉客户端响应内容的大小
package Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/servlet06")
public class servlet4_3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应行相关的API
//        resp.setStatus(404); // 故意响应404resp.setStatus(200);// 设置响应头相关的API
//            resp.setHeader("aaa","valuea");
//        resp.setHeader("Content-Type","text/html");
//        resp.setHeader("Content-Length","1234");String info = "<h1>hello<h1>";resp.setContentType("text/html");resp.setContentLength(info.length());// 设置响应体内容的API// 获得一个响应体中输入文本字符输出流PrintWriter writer = resp.getWriter();writer.write(info);}
}

 

 

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

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

相关文章

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

OTTO奥托机器人开发总结

OTTO机器人是一个开源外壳&#xff0c;硬件和软件的桌面机器人项目&#xff0c;非常适合新手研究和拓展。 我一直希望找一个合适的项目入手研究机器人&#xff0c;这种项目最好是软硬件都开源的&#xff0c;可以随着自己的想法无限的扩展和私人订制&#xff0c;做为初学者&…

Vue3:element-plus el-Table列表合计处理显示字符串类型/计算合计数值

需求整理 1.使用element组件库中的 el-table组件实现图上 底部当前页合计的功能。在一般的情况下&#xff0c;只需要计算数值部分的值&#xff0c;因为组件中的方法中处理的就是将值的类型转换成数值类型&#xff0c;像string类型的字符串的话&#xff0c;在进行转换的时候会出…

计算机毕业设计电影票购买网站 在线选票选座 场次订票统计 新闻留言搜索/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

系统功能 ‌在线选票选座‌&#xff1a;用户可浏览电影场次&#xff0c;选择座位并生成订单。‌场次订票统计‌&#xff1a;系统实时统计各场次订票情况&#xff0c;便于影院管理。‌新闻发布与留言‌&#xff1a;发布最新电影资讯&#xff0c;用户可留言互动。‌搜索功能‌&a…

springboot整合nacos

docker安装nacos参考docker安装各个组件的命令 一、目录结构 二、引入必要依赖 <!-- nacos服务注册与发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>…

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么&#xff1f; 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类&#xff1a;对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

数集相等定义凸显“R各元x的对应x+1的全体=R”是几百年重大错误

黄小宁 变量x所取各数也均由x代表&#xff0c;x代表其变域&#xff08;x所有能取的数组成的集&#xff09;内任一元。设集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;&#xff5b;x&#xff5d;中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标所以x∈R变换…

Unity进阶之C#知识补充

概述 Unity跨平台的基本原理 了解.Net相关知识 Unity跨平台的基本原理&#xff08;Mono&#xff09; Unity跨平台的基本原理&#xff08;IL2CPP&#xff09; IL2CPP 模式可能存在的问题处理 报错的话就去下载 用到的测试类 C#版本和Unity的关系 C#各版本新功能和语法 C# 1~4 功…

怎样写论文及论文格式?分享4款ai论文生成软件

撰写一篇学术论文是一项复杂而系统的工作&#xff0c;需要从选题、文献综述、研究方法到最终的写作和修改等多个步骤。本文将详细介绍如何写好一篇论文&#xff0c;并推荐四款AI论文生成软件&#xff0c;特别是千笔-AIPassPaper。 如何写好一篇论文 1. 选题与题目表达 选题是…

消息中间件常见面试题(RabbitMQ)

MQ场景&#xff1a; 异步发送&#xff08;验证码、短信、邮件&#xff09;MySQL、Redis、ES之间的数据同步分布式事务等 一、RabbitMQ 1.1 消息不丢失 提问&#xff1a;如果保证消息不丢失呢&#xff1f; 流程&#xff1a;生产者将消息发送给交换机&#xff0c;交换机发送给…

FortiWLC 控制器系统恢复操作介绍

简介 对于 FortiWLC 控制器在有些实际操作过程中,会由于某些原因导致升级失败, 无法升级,或是系统文件错乱等情况, 对于这些问题,我们可以通过重新恢复控制 器系统来解决这些问题. 本文详细说明恢复控制器系统的操作步骤. 注意: 本操作需要通过串口登录到控制器设备上,另外在控…

Kubernetes 深入浅出系列 | 容器剖析之容器基本实现原理

一、容器基本实现原理 Docker 主要通过如下三个方面来实现容器化&#xff1a; ① 使用操作系统的 namespace 隔离系统资源技术&#xff0c;通过隔离 网络、PID 进程、系统信号量、文件系统挂载、主机名和域名&#xff0c;来实现在同一宿主机系统中&#xff0c;运行不同的容器&…

Linux之我不会

一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…

uni-app进度条

<template><view><canvas canvas-id"ring" id"ring" style"width: 200px; height: 180px;"><!-- <p>抱歉&#xff0c;您的浏览器不支持canvas</p> --></canvas></view> </template><…

Oracle逻辑备份脚本【生产环境适用】

1 说明 从Oracle10g开始&#xff0c;引入了数据泵&#xff08;Data Pump&#xff09;&#xff0c;是一种高效的数据传输工具&#xff0c;它通过导出&#xff08;Export&#xff09;和导入&#xff08;Import&#xff09;的方式帮助用户迁移数据。 在Oracle的产品设计中&#…

数据结构~二叉搜索树

文章目录 一、二叉树搜索的概念二、二叉树搜索的结构二叉树搜索的性能分析二叉树搜索的插入二叉树搜索的查找二叉树搜索的删除 三、二叉搜索树key和key/value使用场景四、二叉树搜索的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

1.3 MySql的用户管理

一、下载Mysql客户端 下载navicat:Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 二、安装Navicat 三、创建数据库 创建一个数据库的连接吧&#xff0c;因为这个界面儿是图形界面儿&#xff0c;所以我们创建…

RT_Thread内核源码分析(二)——链表和对象管理

实时操作系统基本上都是通过一些链表进行线程、信号、队列的管理&#xff0c;RT_Thread也不例外&#xff0c;本章主要讲解RT_Thread的链表结构和对象管理。 本章基于RT_Thread Nano V3.1.5版本分析 1、链表 RT_Thread使用的链表非常简单&#xff0c;链表节点只有节点指针&#…

深度学习(2):梯度下降

文章目录 梯度下降梯度是什么常见梯度下降算法 代码实现批量梯度下降 梯度下降 梯度是什么 类似y ax b这种单变量的函数来说&#xff0c;导数就是它的斜率&#xff0c;这种情况下可以说梯度就是导数。 但在多变量函数中&#xff0c;梯度是一个向量&#xff0c;其分量是各个…