从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 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
      • Servlet
    • JavaWeb
  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • 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的功能。

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/4/21 16:56:30
request对象基本使用
Servlet实现登录功能

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

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式