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

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 {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 行情求相关 get/post           uri         http/1.1
        System.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());//本应用容器的端口号8080
        System.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

在 Servlet 中,获取请求参数是指从客户端发送的 HTTP 请求中提取传递的参数。这些参数通常通过 URL、表单提交 或 查询字符串 发送,常见的获取请求参数的方法有以下几种:

GET 请求中的查询参数: 通过 URL 传递的参数,例如:http://example.com?name=John&age=25。参数 name 和 age 就是 URL 中的查询参数。

POST 请求中的表单数据: 通过 HTML 表单的提交来传递数据。表单数据以键值对的形式提交,服务器可以接收这些参数。

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 {
    @Override
    protected 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怎么用? 

1. 设置响应行相关:

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 {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应行相关的API
//        resp.setStatus(404); // 故意响应404
        resp.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.kler.cn/news/324401.html

相关文章:

  • 美团中间件C++一面-面经总结
  • 25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)
  • 基于两分支卷积和 Transformer 的轻量级多尺度特征融合超分辨率网络 !
  • 如何组织一场考试并筛选未参加答题的考生?
  • 搜索:如何用 A*搜索算法实现游戏中的寻路功能?
  • Python脚本示例,你可以使用这个脚本来自动化登录网站、选择页面元素和提交表单
  • 『网络游戏』GoLand服务器框架【01】
  • 第 2 章:Vue 组件化编程
  • Cluster Explanation via Polyhedral Descriptions
  • 【性能优化】低配starRocks常驻内存优化
  • py-mmcif提取结构解析的方法、提交日期以及pdb ID等
  • 基于Node.js+Express+MySQL+VUE实现的在线电影视频点播网站管理系统的设计与实现部署安装
  • Kubernetes服务发布基础
  • [leetcode刷题]面试经典150题之9python哈希表详解(知识点+题合集)
  • [go] 状态模式
  • CSS3 字体
  • 卷轴模式开发的技术架构分析与源代码展示
  • 数据结构讲解二叉树 【一】
  • 自动化测试实例:Web登录功能性测试(无验证码)
  • 【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
  • S32K312 RTD 4.0.0 版本 OCU 例程配置流程说明
  • HuggingChat macOS 版现已发布
  • 【路径规划】基于球向量的粒子群优化(SPSO)算法在无人机路径规划中的实现
  • 002.动手实现softmax回归(pytorch简洁版)
  • AutosarMCAL开发——基于EB MCU驱动
  • 爬虫逆向学习(八):Canvas画图滑块验证码解决思路与绕过骚操作
  • 第十四章:html和css做一个心在跳动,为你而动的表白动画
  • Maven 实现依赖统一管理
  • 树莓派外挂Camera(基操)(TODO)
  • 如何通过 GitHub Actions 使用 SSH 自动化部署到阿里云 ECS 实例