从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

    • 服务器软件

    • 环境管理和配置管理-科普篇
    • Servlet入门

      • 什么是 Servlet
      • Servlet 入门案例
      • Servlet 生命周期
      • Servlet 中的注解
      • Tomcat 集成 IDEA
      • Servlet 体系结构
      • HTTP 协议基础
      • 深入 request 和 response 对象
      • request 对象基本使用
      • request 其他功能
        • 获取请求参数通用方式
        • 中文乱码问题
        • 请求转发
        • 数据共享
        • 获取 ServletContext
      • Servlet 实现登录功能
      • HTTP 协议基础-响应
      • Response 对象基本使用
      • response 对象之重定向
      • response 输出字符到浏览器
      • response 输出字节数据
      • 验证码案例
      • ServletContext
      • 文件下载案例
      • Cookie 笔记
      • Cookie 的更多细节
      • Cookie 实践:记住上次访问时间
      • JSP 入门
      • JSP 的内置对象和案例
      • IDEA 与 JavaWeb 的小技巧
      • Session 笔记
      • 验证码案例
      • JSP 深入学习
      • MVC 开发模式
      • EL 表达式和 JSTL 标签
      • JSTL 标签库
      • 案例:列表的增删改查
      • Filter 学习
      • Filter 案例
      • Listener 学习
      • Java 中的 Ajax
      • Java 中的 JSON
  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaWeb
  • Servlet入门
2023-04-17
目录

request 其他功能

# 32.request 其他功能

上一篇博客讲述的方法,都是比较底层的,下面讲一些更方便的方法

  • 获取请求参数通用方式,不管是 get 还是 post
  • 请求转发
  • 共享数据
  • 获取 ServletContext

# 获取请求参数通用方式

获取请求参数通用方式:不论 get 还是 post 请求方式,都可以使用下列方法来获取请求参数

  • String getParameter(String name):根据参数名称获取参数值
  • String[] getParameterValues(String name):获取相同名称的所有值。假设请求参数是 hobby = xx&hobby = game,则可以获取所有 hobby 的参数。复选框可能会出现这样情况
  • Enumeration<String> getParameterNames() : 获取所有请求的参数名称
  • Map<String,String[]> getParameterMap(): 获取所有参数的 map 集合

第 1 个和第 4 个方法比较常用。 ‍

# getParameter

写个代码来演示下:

package com.peterjxl.request;

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.BufferedReader;
import java.io.IOException;

@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       String username = req.getParameter("username");
       System.out.println("username: " + username);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("username: " + username);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

‍ 新建 requestDemo4.html

<!DOCTYPE html>
<html lang="ch">
  <head>
    <meta charset="UTF-8">
    <title>requestDemo4</title>
  </head>

  <body>
    <form action="/hello/requestDemo4" method="post">
      <input type="text" placeholder="请输入用户名" name="username"><br>
      <input type="text" placeholder="请输入密码" name="password"><br>
      <input type="submit" value="注册">
    </form>
  </body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

重启 Tomcat,访问 requestDemo4.html,并输入用户名和密码

然后提交,观察控制台输出:

username: peterjxl
1

# 简化 doGet

既然 doGet 和 doPost 方法做的事情是一样的,为了简化代码,我们可以这样简化:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
}
1
2
3
4

# getParameterValues

‍ 我们修改下 HTML 页面,增加复选框:

<!DOCTYPE html>
<html lang="ch">
  <head>
    <meta charset="UTF-8">
    <title>requestDemo4</title>
  </head>

  <body>
    <form action="/hello/requestDemo4" method="post">
      <input type="text" placeholder="请输入用户名" name="username"><br>
      <input type="text" placeholder="请输入密码" name="password"><br>
      <input type="checkbox" name="hobby" value="sing"> 唱歌 <br>
      <input type="checkbox" name="hobby" value="dance"> 跳舞 <br>
      <input type="checkbox" name="hobby" value="rap"> rap <br>
      <input type="checkbox" name="hobby" value="basketball"> 篮球 <br>
      <input type="submit" value="注册">
    </form>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

‍ 然后获取:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   String username = req.getParameter("username");
   System.out.println("username: " + username);

   String[] hobbies = req.getParameterValues("hobby");
    for (String hobby: hobbies) {
        System.out.println(hobby);
    }
}
1
2
3
4
5
6
7
8
9
10

‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo4.html,勾选后提交

‍

查看控制台输出:

username: 
sing
dance
rap
basketball
1
2
3
4
5

‍

# getParameterNames()

‍ Enumeration<String> getParameterNames() : 获取所有请求的参数名称 ‍

// 获取所有请求的参数名称
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()){
   String name = parameterNames.nextElement();
   String value = req.getParameter(name);
   System.out.printf("name: %s, value: %s\n", name, value);
}
1
2
3
4
5
6
7

‍ 访问页面,随便勾选几个数据,提交

‍

输出如下:

name: username, value: peterjxl
name: password, value: 1233445
name: hobby, value: sing
1
2
3

注意,hobby 只打印了一个,因为 getParameter 只获取一个。

# getParameterMap()

获取所有参数的 map 集合

Map<String, String[]> parameterMap = req.getParameterMap();
Set<String> keyset = parameterMap.keySet();
for (String name : keyset){
    System.out.print("name: " + name);
    // 根据键获取值
    String[] values = parameterMap.get(name);
    for (String value : values){
        System.out.print("  value: " + value);
    }
    System.out.println();
}
1
2
3
4
5
6
7
8
9
10
11

可以看到返回的 map 集合中,value 是 String[] 数组类型的,这样就可以获取所有参数。 ‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo4.html,随便勾选几个提交

‍

输出:

name: username  value: peterjxl
name: password  value: 123456
name: hobby  value: sing  value: dance  value: rap
1
2
3

‍

# 中文乱码问题

有时候我们会遇到乱码问题,我们来演示下。 ‍ 新建 requestDemo5.html

<!DOCTYPE html>
<html lang="ch">
  <head>
    <meta charset="UTF-8">
    <title>requestDemo5</title>
  </head>

  <body>
    <form action="/hello/requestDemo5" method="post">
      <input type="text" placeholder="请输入用户名" name="username"><br>
      <input type="text" placeholder="请输入密码" name="password"><br>
     <input type="submit" value="注册">
    </form>
  </body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

新建 Servlet

package com.peterjxl.request;

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("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       String username = req.getParameter("username");
       System.out.println("username: " + username);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo5.html,并在表单里填入中文 ,提交:

‍

可以看到乱码了!

‍

这是因为 getParameter 内部还是用流来获取参数的值。

解决方法:获取参数前设置 request 的编码 request.setCharacterEncoding("utf-8");。为什么是 UTF8 的编码?因为前端用设置了编码:<meta charset="UTF-8">

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   req.setCharacterEncoding("UTF-8");
   String username = req.getParameter("username");
   System.out.println("username: " + username);
}
1
2
3
4
5
6

如果你使用 get 方式:Tomcat8 已经将 get 方式乱码问题解决了,所以不用担心

# 请求转发

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

为什么需要请求转发:为了避免一个 Servlet 干太多事情,完成所有功能,不合理,难以维护。我们可以拆分 Servlet,将一些公用的方法写成单独的 Servlet。此时我们就需要在一个 Servlet 中,转发请求到另一个 Servlet 的路径上,让另一个 Servlet 执行

转发的方式:

  1. 通过 request 对象获取请求转发器对象:request.getRequestDispatcher("http://www.itcast.cn")
  2. 然后使用 RequestDispatcher 对象来进行转发:forward(ServletRequest request, ServletResponse response) ‍ 方法特点:
  • 浏览器地址栏路径不发生变化
  • 只能转发到当前服务器内部资源中。即不能访问其他网站,访问会报错 404
  • 转发时,浏览器只发送了一次请求,多个资源使用的是同一个请求 ‍ 我们新建 2 个 Servlet 演示下:RequestDemo6 是被转发处理请求的类:
package com.peterjxl.request;

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("/requestDemo6")
public class RequestDemo6 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("requestDemo6被访问了.....");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

RequestDemo7 是转发请求给 RequestDemo6 的类:

package com.peterjxl.request;

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("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("requestDemo7被访问了.....");
        req.getRequestDispatcher("/requestDemo6").forward(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo7。可以看到 IDEA 控制台的输出:

requestDemo7被访问了.....
requestDemo6被访问了.....
1
2

‍

# 数据共享

为什么需要共享数据:比如转发请求后,需要告诉另一个 Servlet 一些数据(例如用户名),然后让另一个 Servlet 处理,此时就需要共享数据了,也就是 Servlet 之间的通信。此时就涉及到域。 ‍ 域对象:一个有作用范围的对象,可以在范围内共享数据

request 域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据,也就是可以通过 request 存储数据

方法:

  1. void setAttribute(String name, Object obj):存储数据
  2. Object getAttitude(String name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对

也就是说,我们可以在 ServletA 中用 setAttribute 存储数据,转发给 ServletB,然后 ServletB 可以用 getAttitude 获取数据。 ‍ 我们来演示下:

在 RequestDemo7 中设置一个属性:

 @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("requestDemo7被访问了.....");
    req.setAttribute("name", "peterjxl");
    req.getRequestDispatcher("/requestDemo6").forward(req,resp);
}
1
2
3
4
5
6

‍ 在 RequestDemo6 中获取属性

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("requestDemo6被访问了.....");
        String name = (String) req.getAttribute("name");
        System.out.println(name);
    }
1
2
3
4
5
6

‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo7,可以看到控制台确实打印了数据 peterjxl。 ‍

# 获取 ServletContext

ServletContext 是一个比较重要的对象,可以通过 request.getServletContext() 获取

@WebServlet("/requestDemo10")
public class RequestDemo10 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("requestDemo10被访问了.....");
        ServletContext servletContext = req.getServletContext();
        System.out.println(servletContext);
    }
}
1
2
3
4
5
6
7
8
9

‍ 重启 Tomcat,访问 http://localhost: 8080/hello/requestDemo10,可以看到控制台有打印对象,

org.apache.catalina.core.ApplicationContextFacade@9af79e
1

后续我们再讲解 servletContext 的功能。 ‍

上次更新: 2025/5/17 12:26:09
request 对象基本使用
Servlet 实现登录功能

← request 对象基本使用 Servlet 实现登录功能→

最近更新
01
吐槽一下《僵尸校园》
05-15
02
2025 年 4 月记
04-30
03
山西大同 “订婚强奸案” 将会给整个社会带来的影响有多严重? - 知乎 转载
04-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式