首页 > 编程语言 >【JavaWeb】 一文搞懂Request

【JavaWeb】 一文搞懂Request

时间:2022-10-20 12:31:54浏览次数:34  
标签:JavaWeb req Request String import 搞懂 servlet javax 请求

【JavaWeb】 一文搞懂Request_Request

 

前言

Request:获取请求数据

Response:设置响应数据

1 Request的继承体系

【JavaWeb】 一文搞懂Request_Request_02

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

  • Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
  • 使用request对象,只需查阅Java EE API文档的HttpServletRequest接口。

2 Request获取请求数据

2.1 请求路径的划分

2.1.1请求行

【JavaWeb】 一文搞懂Request_java_03

2.1.2 请求头

【JavaWeb】 一文搞懂Request_java_04

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:携带的参数、参数的值

分别对应上述五个方法

【JavaWeb】 一文搞懂Request_java_05

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

效果

【JavaWeb】 一文搞懂Request_数据_06

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

【JavaWeb】 一文搞懂Request_数据_07

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 提交

【JavaWeb】 一文搞懂Request_java_08

2.3.2.4 效果

【JavaWeb】 一文搞懂Request_数据_09

3 解决中文乱码的问题

3.1 Post的解决方式

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

req.setCharacterEncoding("UTF-8");

3.2 Get的解决方式

3.2.1 Get产生中文乱码的原因

编解码采用的格式不同

  • 浏览器发送的数据采用的是UTF-8格式
  • Tomcat内部解码采用的是ISO-8859-1的格式

【JavaWeb】 一文搞懂Request_Request_10

URL编码规则

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

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

【JavaWeb】 一文搞懂Request_java_11

4 Request请求转发

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

【JavaWeb】 一文搞懂Request_Request_12

方法名

方法类型

方法作用

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

标签:JavaWeb,req,Request,String,import,搞懂,servlet,javax,请求
From: https://blog.51cto.com/u_15807146/5779843

相关文章