【JavaWeb】 一文搞懂Request

简介: 本文章非常详细的讲解了Request,呕心沥血,童叟无欺,快来看看吧!

在这里插入图片描述

@[Toc]

前言

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 获取请求行的数据

方法名 方法类型 方法作用
getMethod String 获取请求路径的请求方式:如GetPost
getContextPath String 获取虚拟目录(资源的访问路径)
getRequestURL StringBuffer 获取URL(统一资源定位符)
getRequestURI String 获取URI(统一资源标识符)
getQueryString String 获取请求参数(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 获取请求体的数据

方法名 方法类型 方法作用
getInputStream ServletInputStream 获取字节输入流
getReader BufferedReader 获取字符输入流

字节流和字符流的区别

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

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

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

使用方法注意

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

  • 获取数据
  • 读取数据

代码如下:

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

效果

在这里插入图片描述

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

在这里插入图片描述

2.3 通用的请求方式

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

2.3.1通用的请求方法

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

2.3.2实战演练

2.3.2.1 首先创建一个html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</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>

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);
    }
}

2.3.2.3 提交

在这里插入图片描述

2.3.2.4 效果

在这里插入图片描述

3 解决中文乱码的问题

3.1 Post的解决方式

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

req.setCharacterEncoding("UTF-8");

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);
    }
}
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);
    }
}
相关文章
|
数据采集 存储 数据挖掘
【SPSS】数据预处理基础教程(附案例实战)(下)
【SPSS】数据预处理基础教程(附案例实战)(下)
1201 0
|
Prometheus Kubernetes Cloud Native
《Kubernetes 入门:构建、部署和管理你的第一个 K8s 集群》
《Kubernetes 入门:构建、部署和管理你的第一个 K8s 集群》
794 0
|
SQL Java 数据库
【面经】亚信科技面试问题合集
【面经】亚信科技面试问题合集
348 3
win10取消ie浏览器自动跳转edge浏览器
win10取消ie浏览器自动跳转edge浏览器
450 4
|
SQL Java 数据库连接
MyBatis 的 3 种分页方式
MyBatis 的 3 种分页方式
779 1
MyBatis 的 3 种分页方式
|
机器学习/深度学习 人工智能 自然语言处理
【活动】人工智能:前沿科技中的创业机遇与挑战
本文探讨了人工智能领域的创业机遇与挑战。AI技术的快速发展,如深度学习、自然语言处理等,已广泛应用于医疗、金融、制造等行业。未来创业机会包括AI基础设施、垂直行业解决方案、伦理安全领域及AI与其他技术的融合创新。然而,创业者需面对技术壁垒、数据获取、市场接受度、商业模式创新及政策伦理挑战。要在AI领域成功创业,需紧跟技术趋势,深挖行业需求,创新商业模式,并妥善应对各种挑战。
1057 6
|
设计模式 算法 程序员
如何写出好的代码注释?
作为程序员,想必大家在日常开发中必写注释,而且在软件开发过程中,给代码写注释是一项至关重要的工作,也是一名合格的程序员该具备的编程素养。恰当的注释可以提高代码的可读性和可维护性,方便其他人理解熟悉和修改代码,但是不恰当或过度的注释可能会导致混乱和误导,会起到适得其反的作用。那么本文就来分享一些关于如何正确地给代码写注释的方法和指导原则,并提供一些减少注释但仍能让他人理解代码的方法。
563 3
如何写出好的代码注释?
|
开发者
如何在游戏中实现一个好看的金币效果
如何在游戏中实现一个好看的金币效果
403 1
|
运维 Devops 专有云
云效需求评审功能上线!无需拉会,线上就能评!
云效上线了需求评审功能,无需拉会,即可在线发起需求评审。评审的建议也可记录存档,供产品经理参考和修改。
913 1
|
存储 C# 图形学
为虚幻引擎开发者准备的Unity指南
为虚幻引擎开发者准备的Unity指南