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

JavaWeb-HttpServletRequest请求域接口

文章目录

  • HttpServletRequest请求域接口
    • HttpServletRequest请求域接口简介
    • 关于请求域和应用域的区别
  • 请求域接口中的相关方法
    • 获取前端请求参数(getParameter系列方法)
    • 存储请求域名参数(Attribute系列方法)
  • 关于转发和重定向的细致剖析

HttpServletRequest请求域接口

HttpServletRequest请求域接口简介

其实关于请求域这个词也蛮熟悉的, 因为我们之前学习过 应用域 这一概念, 应用域的生命周期很长, 伴随这服务器的启动和终止, 作用范围也很广, 对所有的处于当前 webapp 也就是 web 应用的所有Servlet对象都生效


  • HttpServletRequest 是位于jakarta.servlet.http.*包下面的一个接口

  • 继承了ServletRequest接口
    public interface HttpServletRequest extends ServletRequest

  • 之前我们学习过HTTP协议的相关内容, 这个对象中封装的其实就是网络传输的时候, 发送的HTTP请求(Request)中封装的相关参数内容信息

  • 实现这个接口是Tomcat服务器实现的, 传递对象封装参数也是Tomcat服务器完成好的内容, 我们作为Java程序员, 只需要学习获取其中封装的相关参数即可


关于请求域和应用域的区别

  • 生命周期不同, 应用域伴随着Tomcat的生命周期 而 请求域 只作用域这一次请求之内, 而且http协议的特点就是, 一次请求一次创建一次请求域对象

请求域接口中的相关方法

上面都说了, 请求域是封装了相关的http协议的参数信息, 所以必定提供了一些方法来让我们程序员获取到这些参数的信息…


获取前端请求参数(getParameter系列方法)

首先我们思考, 前端传递过来的参数应该采用什么数据结构来组织比较好

我们从下面的前端的页面中获取信息

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>个人信息</title>
</head>
<body>
    <h2>个人信息</h2>
    <form action="" method="get">
        姓名:<input type="text" name="name" value=""><br>
        年龄:<input type="text" name="age" value=""><br>
        性别:<input type="radio" name="sex" value="">
            <input type="radio" name="sex" value=""><br>
        爱好:<input type="checkbox" name="hobby" value="吃饭">
            <input type="checkbox" name="hobby" value="睡觉">
            <input type="checkbox" name="hobby" value="打游戏"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

我们执行 http://127.0.0.1:8080/servlet08/test.html

在这里插入图片描述

我们对URL拆解如下(涉及URLEncoding)

在这里插入图片描述

我们可以发现, 前端向后端提交数据的格式其实并不是单纯的键值对的结构存储的, 因为如果是键值对结构存储的话, 一个key只能对应一个value, 但是复选框这种提交信息的结构, 一个key可以对应多个value信息

所以实际上, 我们的前端发来的数据存储格式是一个特殊的map集合

Map<String, String[]> map = new HashMap<>();

一个String类型的key可以对应一个String[] 数组, 也就是多个value(前端传递参数都是String类型)


上面是一个html页面, 其中包含test类型文本, 单选框, 复选框

在这里插入图片描述

上面的方法的解释:

  • String getParameter(String name): 根据key返回String数组中的第一个参数
  • String[] getParameterValues(String name): 根据key返回完整的String[]数组
  • Enumeration< String > getParameterNames(): 返回一个由所有key组成的集合
  • Map<String, String[]> getParameterMap(): 返回一个key和value组成的完整的集合

还拿我们上面写的那个html页面进行测试(设置一下传递的Servlet路径地址)
(注意, 我们下面的method其实写错了, 实际上是post请求)

在这里插入图片描述

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.*;
import java.util.Enumeration;
import java.util.Map;

@WebServlet(urlPatterns = "/getparameter")
public class GetParameterServlet extends HttpServlet {

    // 由于是form表单提交的数据, 我们尽量采用重写doPost的方式进行测试
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 最好还是设置一下字符集, 防止出现乱码
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 1. 使用getParameterMap获取整个的map形式参数集合
        out.print("<h3>使用getParameterMap获取整个集合</h3>");
        Map<String, String[]> parameterMap = request.getParameterMap();
        for(Map.Entry<String, String[]> entry : parameterMap.entrySet()){
            out.print(entry.getKey() + "=");
            for(String value : entry.getValue()){
                out.print(value + " ");
            }
        }
        out.print("<br>");
        out.print("====================================<br>");

        // 2. 使用getParameterNames获取整个参数集合的key
        out.print("<h3>使用getParameterNames获取整个集合中的key</h3>");
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            out.print(name + " ");
        }
        out.print("<br>");
        out.print("====================================<br>");

        // 3. 使用getParameterValues, 根据key获取参数集合的value数组
        String[] hobbys = request.getParameterValues("hobby");
        out.print("hobby=");
        for(String hobby : hobbys){
            out.print(hobby + " ");
        }
        out.print("<br>");
        out.print("====================================<br>");

        // 4. 使用getParameter, 根据key获取到value数组中的第一个值
        String name = request.getParameter("name");
        out.print("name=" + name);
        out.print("<br>");
        out.print("====================================<br>");
    }
}

测试:

下面是form表单中提交的数据信息

在这里插入图片描述


下面是在浏览器中输出的内容

在这里插入图片描述


存储请求域名参数(Attribute系列方法)

Attribute 这个词其实我们很熟悉了, 因为之前学习ServletContext就出现过这个词, 也出现了和下面一模一样的一系列方法, 当时是设置应用域对象, 但是现在是设置请求域对象

在这里插入图片描述
在这里插入图片描述

  • void setAttribute(String name, Object o): 设置请求域参数
  • Object getAttribute(String name): 获取请求域参数
  • Enumeration< String > getAttributeNames(): 获取所有请求域的key组成的集合
  • void removeAttribute(String name): 移除 key 为参数的请求域信息

没啥可说的, 直接上测试代码

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.*;
import java.util.Enumeration;

// 使用注解来配置Servlet
@WebServlet("/attribute")
public class AttributeInfoServlet extends HttpServlet {

    // 重写doGet方法
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        // 1. 使用 void setAttribute(String name, Object o) 设置请求域参数
        request.setAttribute("name", "Jack");
        request.setAttribute("age", 18);

        // 2. 使用 Object getAttribute(String name) 获取请求域参数
        Object name = request.getAttribute("name");
        Object age = request.getAttribute("age");
        out.print("<h3>" + name + " " + age + "</h3>");

        out.print("<br>========================================<br>");

        // 3. 使用 Enumeration< String > getAttributeNames() 获取所有的请求域参数key集合
        Enumeration<String> attributeNames = request.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
            String attributeName = attributeNames.nextElement();
            out.print("<h3>" + attributeName + "</h3>");
        }

        out.print("<br>========================================<br>");

        // 4. 使用 void removeAttribute(String name) 移除参数
        request.removeAttribute("name");
        Object name1 = request.getAttribute("name");
        out.print("<h3>" + name1 + "</h3>");
    }
}

测试结果如下

在这里插入图片描述

关于转发和重定向的细致剖析


http://www.kler.cn/a/573277.html

相关文章:

  • 北京大学第四弹:《DeepSeek原理和落地应用》
  • 计算机视觉|Swin Transformer:视觉 Transformer 的新方向
  • C++课程设计【宿舍管理查询软件】
  • spring-ioc-bean
  • 【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】
  • Finebi_求组内占比和组内累计占比
  • Cursor+Claude3.7实现从原型到app开发
  • Docker卷挂载:为何不同路径指向同一份文件
  • 了解JVM
  • [machine learning] MACS、MACs、FLOPS、FLOPs
  • AI智能化办公与AI绘画商业应用
  • 鸿蒙5.0实战案例:使用Snapshot Insight分析ArkTS内存问题
  • 宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪
  • FFmpeg 命令详解(完整详细版)
  • 分布式WEB应用中会话管理的变迁之路
  • 苹果Siri升级遇阻,国行iPhone或将引入阿里、百度AI自救
  • Web3 的去中心化治理:如何实现透明与公正
  • 代码混淆与代码打包---bash脚本
  • 轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题
  • redis八股个人总结