javaWeb中的Request对象

article/2025/8/30 6:16:53

Request对象概述

方向: 浏览器 -> 服务器

负责获取客户端的请求数据

request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据,然后服务器通过request对象的相关方法来获取这些数据。

  • 查看Servlet中的service方法得知, Servlet中使用的ServletRequest接口, 而我们使用的是ServletRequest的子接口HttpServletRequest, 它继承自ServletRequest, 是与HTTP协议相关的Request请求对象

  • 我们使用的子接口HttpServletRequest, 此接口对象由Tomcat引擎提供

  • 可以实现客户端向服务器发出请求, 请求内容包括: 请求行,请求头,请求体

http请求
在这里插入图片描述

Request对象获取请求行

  • API
方法返回值描述
getMethod()String获取提交的方式 (GET,POST)
getRequestURI()String获取请求的参数,请求服务器路径
getRequestURL()StringBuffer获取请求的参数,请求服务器路径
getQueryString()String获取请求行 问号后面的参数 (GET)
getContextPath()String获取WEB应用名称
  • 代码演示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//request对象方法 getMethod()获取客户端的请求方式String method = request.getMethod();System.out.println(method);//方法 String getRequestURI() 获取请求服务器路径//方法 StringBuffer getRequestURL() 获取请求服务器路径String URI = request.getRequestURI();StringBuffer URL = request.getRequestURL();System.out.println("URI=="+URI);//   /web04/lineSystem.out.println("URL=="+URL);//  http://localhost:8080/web04/line//方法 String getQueryString()获取请求行,?后面的所有参数String query = request.getQueryString();System.out.println(query);//user=tom&pass=123&//获取WEB应用名称  String getContextPath()String path = request.getContextPath();System.out.println(path);//   /web04//获取WEB应用名称, 结合重定向使用//response.sendRedirect(request.getContextPath()+"/ddd");
}

Request对象获取请求头

​ 请求头数据格式键值对, k:v

​ 指导性信息,指导服务器

方法返回值描述
getHeader(String name)String获得一个key对应一个value的请求头
getHeaderNames()Enumeration获取所有的请求头的键
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/** Enumeration getHeaderNames() 获取所有的请求头的键* 返回值Enumeration接口 (向量枚举)* 集合:1.0-1.1 Enumeration    集合1.2  迭代器* Iterator迭代器接口:  hasNext()   next()* Enumeration接口:  hasMoreElement()  nextElement()*/Enumeration<String> enums  = request.getHeaderNames();while (enums.hasMoreElements()){key = enums.nextElement();String value = request.getHeader(key);System.out.println(key+"=="+value);}
}

Request获取请求参数

方法返回值描述
getParameter(表单中的name值)String获得提交的参数(一个name对应一个value)
getParameterValues(表单中的name值)String[]获得提交的参数(一个name对应多个value)
getParameterMap()Map<String,String[]>获得提交的参数,将提交的参数名称和对应值存入到一个Map集合中
<body><form action="/web02/param" method="post">用户名:<input type="text" name="username"><br/>密 码:<input type="password" name="password"><br/>爱 好:<input type="checkbox" name="hobby" value="Basketball">篮球<input type="checkbox" name="hobby" value="football">足球<input type="checkbox" name="hobby" value="pingpang">乒乒球 <br/><input type="submit"></form>
</body>
@WebServlet(urlPatterns = "/param")
public class ParamServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得提交的参数(一个name对应一个value)String username = request.getParameter("username");String password = request.getParameter("password");System.out.println(username +" == " +password);//获得提交的参数(一个name对应多个value)String[] hobbies = request.getParameterValues("hobby");System.out.println("hobbies = " + Arrays.toString(hobbies));//获得提交的参数,将提交的参数名称和对应值存入到一个Map集合中Map<String, String[]> map = request.getParameterMap();for(String key : map.keySet()){String[] values = map.get(key);System.out.println(key + " == " + Arrays.toString(values));}}

Request对象接收表单请求参数的中文乱码处理

POST方式接收中文

  • 产生乱码的原因:
    • post方式提交的数据是在请求体中,request对象接收到数据之后,放入request的缓冲区中。缓冲区就有编码(默认ISO-8859-1:不支持中文).
  • 解决方案:
    • 将request的缓冲区的编码修改了即可。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//将request的缓冲区的编码修改request.setCharacterEncoding("utf-8");//获取请求参数String user = request.getParameter("user");System.out.println("user = " + user);
}

GET方式接收中文

Tomcat8.5版本之后, Tomcat自动处理了get请求的中文乱码问题

但在Tomcat8.5之前的版本中, get请求的中文乱码需要自行处理

  • 产生乱码原因:
    • get方式提交的数据在请求行的url后面,在地址栏上其实就已经进行了一次URL的编码了。
  • 解决方案:
    • 将存入到request缓冲区中的值以ISO-8859-1的方式获取到,以UTF-8的方式进行解码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*get方式提交的数据在 请求行中Tomcat8.5之后, Tomcat自动处理了get请求的中文乱码问题, 但在之前的Tomcat版本中,get请求的中文乱码需要自行处理老版本Tomcat中文乱码的解决:将存入到request缓冲区中的值以ISO-8859-1的方式获取到,以UTF-8的方式进行解码。*/String user = request.getParameter("username"); ////将存入到request缓冲区中的值以ISO-8859-1的方式获取到byte[] bytes = user.getBytes("iso-8859-1");//以UTF-8的方式进行解码String value = new String(bytes, "utf-8");System.out.println("user = " + user);
}

BeanUtils 将 map中的数据封装到 pojo类中

导包

在这里插入图片描述

pojo类

package cn.itcast.pojo;import java.util.Arrays;public class User {private String username;private String password;private String[] hobby;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", hobby=" + Arrays.toString(hobby) +'}';}
}

页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/web0202/demo15" method="post">用户名:<input type="text" name="username"><br/>密 码:<input type="password" name="password"><br/>爱 好:<input type="checkbox" name="hobby" value="Basketball">篮球<input type="checkbox" name="hobby" value="football">足球<input type="checkbox" name="hobby" value="pingpang">乒乒球 <br/><input type="submit">
</form>
</body>
</html>

servlet

package cn.itcast.web;import cn.itcast.pojo.User;
import org.apache.commons.beanutils.BeanUtils;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.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/demo15")
public class ServletDemo15 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 解决服务器给浏览器的数据中文乱码问题response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");Map<String, String[]> parameterMap = request.getParameterMap();User user = new User();try {BeanUtils.populate(user, parameterMap);} catch (Exception e) {e.printStackTrace();}System.out.println(user);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

原理

通过map的key值得到set方法的名字,利用反射技术调用set方法,将value值传入
在这里插入图片描述

Request域对象

Request作为域对象的API

Request作为域对象作用范围

Request对象其实就是从客户端浏览器向服务器发送的一次请求信息的封装。那么实质上向Request中所保存的数据有效期也是一次请求范围。

一次请求范围:从客户端浏览器向服务器发送一次请求,服务器针对这次请求对浏览器作出响应。当服务器作出响应之后,请求对象就销毁了,保存在其中的数据就无效了。

如果是两次请求,那么两个request对象是不一样的,所以一个里面存储的内容另外一个是获取不到的
但是如果是一次请求,而这个请求,服务器进行转发的之后,依然是一个request对象,那么他们中存储的对象则是可以被获取到的

每次请求都会创建新的request对象, 当响应结束后立刻销毁request对象.

  • API
方法返回值描述
setAttribute(String name, Object obj)void向Request域中保存数据
getAttribute(String name)Object从Request域中获取数据
removeAttribute(String name)void从Request域中移除数据
  • 代码演示

servlet1

@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向request域对象中 存值request.setAttribute("language","java");//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet1 value = " + value);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

servlet2

@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet2 value = " + value);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

请求转发

请求转发的写法

通过ServletRequest对象获得RequestDispatcher对象

方法返回值描述
getRequestDispatcher(String path)RequestDispatcher获得RequestDispatcher对象

再根据RequestDispatcher中的方法进行请求转发

方法返回值描述
forward(ServletRequest request, ServletResponse response)void进行请求转发

转发的实现步骤

  • request对象方法获取转发器 RequestDispatcher getRequestDispatcher(“转发地址”)返回值就是转发器
  • 使用转发器对象的方法 forward

代码实现

servlet1

@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向request域对象中 存值request.setAttribute("language","java");//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet1 value = " + value);//进行请求转发request.getRequestDispatcher("/my2").forward(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

servlet2

@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet2 value = " + value);//响应回浏览器response.setContentType("text/html;charset=utf-8");response.getWriter().print("我是MyServlet2 页面数据");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

9 请求转发和重定向区别

  • 请求转发是一次请求一次响应,而重定向是两次请求两次响应。
  • 请求转发地址栏不会变化的,重定向地址栏发生变化。
  • 请求转发路径不带工程名,重定向需要带工程名路径。
  • 请求转发只能在本网站内部,重定向可以定向到任何网站。

9.2 代码演示

MyServlet1

@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//向request域对象中 存值request.setAttribute("language","java");//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet1 value = " + value);//进行请求转发//request.getRequestDispatcher("/my2").forward(request, response);//进行重定向response.sendRedirect("/web02/my2");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

MyServlet2

@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//从request域对象中 取值Object value = request.getAttribute("language");System.out.println("MyServlet2 value = " + value);//响应回浏览器response.setContentType("text/html;charset=utf-8");response.getWriter().print("我是MyServlet2 页面数据");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
  • 注意:
    • 如果需要使用request进行值传递,需要通过请求转发完成。
    • 如果页面需要跳转到其他网站上必须使用重定向, 不能使用request进行值传递。

客户端与服务器端地址的写法

  • 什么是客户端地址:客户端直接访问服务器的地址是客户端地址

    • 通过客户端访问web应用 地址必须加上web应用的名称
  • 什么是服务器端地址:web应用内部访问的地址是服务器端地址

    • 特点,访问时,不用写web应用名称
  • 写地址时, 怎么区分是否加上web应用的名称

    • 看在web应用内, 还是外
      • 客户端地址
        • 直接在地址栏中写url地址 — 客户端地址
        • 标签的href — 客户端地址
        • form表单的action-----客户端地址
        • location.href ---- 客户端地址
        • response响应对象的重定向 sendRedirect( 地址) -----客户端地址
      • 目前记住一个服务器端地址:
        • Request请求对象的请求转发getRequestDispatcher(转发地址) — 服务器端地址
        • servlet的映射路径— 也是服务端地址

http://chatgpt.dhexx.cn/article/Z9irr1Us.shtml

相关文章

request 对象

1、HTTP通信协议是客户与服务器之间一种提交&#xff08;请求&#xff09;信息与响应信息&#xff08;request/reponse)的通信协议。在JSP中&#xff0c;内置对象request封装了用户提交的信息&#xff0c;那么该对象调用相应的方法可以获取封装的信息&#xff0c;即使用该对象可…

使用request对象

示例request对象使用 首先建立一个register.jsp文件&#xff0c;最后的提交&#xff0c;提交到那里呢&#xff0c;图二的show.jsp&#xff0c;路径因为两个文件都在webcontent里&#xff0c;所以默认就行&#xff0c;不用再指定路径 在show.jsp中转码后获取&#xff0c;同时因…

Request对象

request对象封装了由客户端生成的HTTP请求的所有细节&#xff0c;主要包括HTTP头信息&#xff0c;系统信息&#xff0c;请求方式和请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。 访问请求参数 我们知道request对象用于处理HTT…

Java 之 Request 对象

一、Request 对象和 Response 对象原理 request和response对象是由服务器创建的&#xff0c;供我们使用的。 request对象是来获取请求消息&#xff0c;response对象是来设置响应消息。 原理示意图&#xff1a; 二、Request 对象继承体系结构 三、Request 功能 1、获取请求消息数…

【Web基础】Request对象

1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。 这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么? request: 获取请求数据 浏览器会发送H…

请求对象request

一、请求对象介绍. 请求:获取资源。在BS架构中,就是客户端浏览器向服务器端发出询问。 请求对象:就是在项目当中用于发送请求的对象。 二、请求对象Request常用方法-获取各种路径 返回值方法名说明StringgetContextPath()获取虚拟目录名称StringgetServletPath()获取Servlet…

【JavaWeb】Request对象详解

HTTP之Request&#xff1a;接上一篇博文HTTP协议详细. 本文目录 一.Request请求1.Request对象和Response对象的原理2.Request对象继承体系结构3.Request功能3.1 获取请求消息数据3.2 获取请求头数据3.3 获取请求体数据 4.Request其它功能4.1 获取请求参数通用方式4.1.1 中文请求…

java基础教程:基础语法之术语和入口类(2)

我们上节课已经学会了如何安装java环境&#xff0c;编译和运行java代码。那么&#xff0c;java当中有哪些编程的语法规则呢&#xff1f; 我们会通过几节课来了解这部分内容。这几节课不会从面向对象的方向来解释java的语法&#xff0c;后面会单独介绍。 这节课我们了解如下两个…

【Java基础教程】(三十二)常用类库篇 · 第二讲:包装类 Wrapper Class——概念及用途, 自动装箱与拆箱,常用操作方法~

Java基础教程之常用类库 包装类 1️⃣ 概念2️⃣ 设计目的&#xff08;作用&#xff09;和用途3️⃣ 使用3.1 自动装箱与拆箱3.2 常用方法3.3 常用属性3.4 null和默认值 4️⃣ 注意事项&#x1f33e; 总结&#x1f4d1; 本文源码下载地址 1️⃣ 概念 在Java编程中&#xff0c…

java基础教程01讲:使用idea写第一个java程序

1、使用idea创建一个java、web项目&#xff0c;新安装的idea&#xff0c;第一次&#xff0c;打开如图下面的界面 选择第一个 2、如果不是第一次打开&#xff0c;就我们选择new---》project 3、点击下一步 再点击下一步 4、project name写项目名称、project location是代码存放…

grpc java 基础教程

1 RPC 框架原理RPC 框架的目标就是让远程服务调用更加简单、透明&#xff0c;RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#xff09;、序列化方式&#xff08;XML/Json/ 二进制&#xff09;和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇9、多线程篇10、IO篇11、网络编程篇12、集合体系篇13、JDBC篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01…

idea java 单元测试_Java基础教程:IDEA单元测试

Java基础教程&#xff1a;IDEA单元测试 环境配置 使用idea IDE 进行单元测试&#xff0c;首先需要安装JUnit 插件。 安装JUnit插件步骤 File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit Generator V2.0安装。 安装完成后需要重新启动…

【Java基础教程】标识符与关键字

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 标识符与关键字 标识符关键字…

【Java基础教程】用Java实现猜数字小游戏

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 &#x1f3c6;在本周获得了新…

【Java基础教程】详解Java三种流程控制语句

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker,新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java基础教程 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点…

java基础教程:集合概述(27)

今天要讲的内容是集合。集合是我们编程时非常频繁的对象&#xff0c;必须花费大量时间学习。 我们还是从是什么和为什么两个角度进行引入。 集合是什么&#xff1f; 集合是存储和操作一组对象的对象。类似一个池子&#xff0c;可以存储操作一组元素。 为什么要有集合&#xf…

Java 零基础教程,看完就会,建议收藏

如果你不懂Java 并且想认真学习接触了解一下Java的语法&#xff0c;建议把这篇文章收藏了&#xff0c;多看几遍&#xff0c;应该可以初步掌握Java 大部分基础的语法 。 让我们出发吧&#xff01;ps:本文有点长&#xff0c;耐心阅读 。 〇&#xff0c;编程环境 工程项目推荐使…

找呀找呀找地铁

杭州地铁1号线据说2010年开通&#xff0c;还好下沙那边有地铁站&#xff0c;刚好在单位门口&#xff0c;不然在城区和这个鸟不生蛋的地方两头跑&#xff0c;可怎么活啊&#xff1f; 谁要以前不好好努力&#xff0c;多捞点钱呢&#xff1f;真是“老大徒伤悲”啊&#xff01;这个…

转载-高仙机器人落地北京杭州深圳多个城市地铁

你知道吗&#xff1f;世界上第一条地铁始建于1863年的伦敦&#xff0c;中国的地铁时代则在1969年的北京开启。 地铁作为黄金动脉&#xff0c;是衡量城市发展的关键指标之一。地铁不仅可以减少城市交通道路拥堵&#xff0c;带动周边地区发展&#xff0c;还可以减少环境污染&…