【JavaWeb】 一文搞懂Request

举报
游坦之 发表于 2022/10/16 08:24:50 2022/10/16
【摘要】 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天。@[Toc] 前言Request:获取请求数据Response:设置响应数据 1 Request的继承体系service(request,response)是由谁创建的?Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。使用request对...

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天。

在这里插入图片描述

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。