• 【JavaWeb】 一文搞懂Request


    在这里插入图片描述

    前言

    Request:获取请求数据

    Response:设置响应数据

    1 Request的继承体系

    image-20220910084122159

    service(request,response)是由谁创建的?

    • Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。

    • 使用request对象,只需查阅Java EE API文档的HttpServletRequest接口。

    2 Request获取请求数据

    2.1 请求路径的划分

    2.1.1请求行

    在这里插入图片描述

    2.1.2 请求头

    在这里插入图片描述

    2.1.3 请求体

    Post请求方式,会将相应的参数放到请求体里面。

    2.2 常见的请求方式

    2.2.1 获取请求行的数据

    方法名方法类型方法作用
    getMethodString获取请求路径的请求方式:如GetPost
    getContextPathString获取虚拟目录(资源的访问路径)
    getRequestURLStringBuffer获取URL(统一资源定位符)
    getRequestURIString获取URI(统一资源标识符)
    getQueryStringString获取请求参数(Get方式)

    实战

    访问一个这样的路径http://localhost:8080/JavaWeb_Demo_05_war/webServlet04?name=zhangsan,我们来打印一下这些方法的效果。

    • http://localhost:8080:端口号

    • JavaWeb_Demo_05_war:项目名

    • webServlet04:Servlet名

    • name=zhangsan:携带的参数、参数的值

    分别对应上述五个方法

    在这里插入图片描述

    2.2.2 获取请求头的数据

    方法名方法类型方法作用
    getHeader(String name)String根据请求头的名称,获取值

    2.2.3 获取请求体的数据

    方法名方法类型方法作用
    getInputStreamServletInputStream获取字节输入流
    getReaderBufferedReader获取字符输入流
    字节流和字符流的区别

    Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。二进制数据如图像、多媒体文件和可执行软件代码。

    Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。

    相应的如果传送的是图像、文件资源,需要用到字节输入流,如果是字符串只需要用到字符输入流。

    使用方法注意

    使用流读取数据时,分两步:

    • 获取数据

    • 读取数据

    代码如下:

    /*1、获取数据*/
     BufferedReader reader = request.getReader();
    /*2、读取数据*/
     String s = reader.readLine();
     System.out.println("获取请求体的数据:"+s);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    效果

    在这里插入图片描述

    获取数据之后,直接输入,则会出现以下的效果

    在这里插入图片描述

    2.3 通用的请求方式

    所谓通用的请求方式,即doGet或者doPost都用一种获取参数的方法,另外一个直接调用另一个即可。

    2.3.1通用的请求方法

    方法名方法类型方法作用
    getParameterMapMap获取所有参数Map集合
    getParameterValues(String name)String[]根据名称获取参数值(数组)
    getParameterString根据名称获取参数值(单个值)

    2.3.2实战演练

    2.3.2.1 首先创建一个html
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
        <form action="/JavaWeb_Demo_05_war/demo05" method="post">
            <input type="text" name="username">
            <br/>
            <input type="password" name="password">
            <br/>
            <input type="checkbox" name="hobby" value="1">抽烟
            <input type="checkbox" name="hobby" value="2">喝酒
            <input type="checkbox" name="hobby" value="3">烫头
            <br/>
            <input type="submit">
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    2.3.2.2 创建一个Servlet相应
    package com.you.web;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Map;
    
    @WebServlet(urlPatterns = "/demo05")
    public class webServlet05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /* 1、第一种方法:获取所有的参数Map集合*/
            Map<String, String[]> parameterMap = req.getParameterMap();
            for (String key : parameterMap.keySet()) {
                System.out.print(key+":");
                String[] value = parameterMap.get(key);
                for (String s : value) {
                    System.out.print(s+" ");
                }
                System.out.println();
            }
            System.out.println("-----------------------------");
            /* 2、第二种:根据名称获取参数值 */
            String[] hobbies = req.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.print(hobby+" ");
            }
            System.out.println();
            System.out.println("-----------------------------");
            /* 3、第三种:根据名称获取参数值*/
            String username = req.getParameter("username");
            System.out.println(username);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    2.3.2.3 提交

    在这里插入图片描述

    2.3.2.4 效果

    在这里插入图片描述

    3 解决中文乱码的问题

    3.1 Post的解决方式

    在使用req获取数据之前,加上这一句

    req.setCharacterEncoding("UTF-8");
    
    • 1

    3.2 Get的解决方式

    3.2.1 Get产生中文乱码的原因

    编解码采用的格式不同

    • 浏览器发送的数据采用的是UTF-8格式

    • Tomcat内部解码采用的是ISO-8859-1的格式

    在这里插入图片描述

    URL编码规则

    1. 将字符串按照编码方式转为二进制
    2. 每个字节转为2个16进制数并在前面加上%

    中文字符占3个字节,而且Tomcat8以后已解决了Get请求乱码的问题

    在这里插入图片描述

    4 Request请求转发

    4.1 请求转发:一种服务器内部的资源跳转方式

    在这里插入图片描述

    方法名方法类型方法作用
    getRequestDispatcher(“要转发的资源路径”).forward(req,resp);RequestDispatcher转发的作用:从一个Servlet转到另一个Servlet
    setAttribute(String name, Object o)void存储到Request域中
    getAttribute(String name)Object根据key,获取值
    removeAttribute(String name)void根据key,删除该键值对

    getRequestDispatcher()中,要转发的路径直接写Servlet配置的访问路径就好,不需要写’/’

    4.2 请求转发的特点

    • 浏览器地址栏路径不发生变化
    • 只能转发当前服务器的内部资源
    • 一次请求,可以在转发的资源间使用request共享数据

    4.3 实战举例

    demo6设置参数,并转发到demo7,demo7获取参数并输出

    package com.you.web;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/demo6")
    public class webServlet06 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get.....");
            req.setAttribute("hobby","girl");
            req.getRequestDispatcher("demo7").forward(req,resp);
            
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    package com.you.web;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/demo7")
    public class webServlet07 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Object hobby = req.getAttribute("hobby");
            System.out.println("获取的数据是:"+hobby);
            System.out.println("get7....");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post7...");
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    如何选择合适的自动化测试工具?
    基于SSM+Vue的药品商超销售进销存网站设计与实现
    DeepFace【部署 01】轻量级人脸识别和面部属性分析框架安装使用详解(网盘分享模型文件)
    软考-高项-论文-信息系统项目的质量管理
    win11 使用 QEMU 配置龙芯 3A5000 虚拟环境
    详解 Java 19 中的记录类型的模式匹配
    基于php的物流信息公共平台设计与实现
    华为机试 - 最长的顺子
    高精度数字压力表丨铭控传感多款数字压力表在多场景中的应用
    猎聘爬虫(附源码)
  • 原文地址:https://blog.csdn.net/m0_59792745/article/details/126800075