写点什么

【JavaWeb】 一文搞懂 Request

作者:游坦之
  • 2022-11-27
    山东
  • 本文字数:2986 字

    阅读完需:约 10 分钟


前言

Request:获取请求数据


Response:设置响应数据

1 Request 的继承体系


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


实战


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


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

  • JavaWeb_Demo_05_war:项目名

  • webServlet04:Servlet 名

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


分别对应上述五个方法


2.2.2 获取请求头的数据

2.2.3 获取请求体的数据

字节流和字符流的区别

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 通用的请求方法

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()中,要转发的路径直接写 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); }}
复制代码


发布于: 刚刚阅读数: 5
用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【JavaWeb】 一文搞懂Request_javaWeb_游坦之_InfoQ写作社区