【JavaWeb】 一文搞懂Request

简介: 【JavaWeb】 一文搞懂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);
    }
}
相关文章
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
347 37
|
22天前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
29 2
|
29天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
34 5
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
85 2
|
2月前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
4月前
|
存储 程序员
JavaWeb之Listener监听器
JavaWeb之Listener监听器
71 0
|
5月前
|
前端开发 JavaScript 算法
javaweb(四)——过滤器与监听器
javaweb(四)——过滤器与监听器
|
5月前
|
存储 JSON 前端开发
JavaWeb中用来定义统一的响应结果的result类
JavaWeb中用来定义统一的响应结果的result类
147 0
|
5月前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
33 0