当前位置:   article > 正文

Request对象(获取请求数据)_request对象接收数据

request对象接收数据

Request对象

Request对象概念

在之前的service方法中有两个参数request对象和response对象, requestresponse对象是由服务器创建的。

在我们向服务器发出请求时请求肯定会携带请求参数,在Tomcat中创建了Request对象,这个对象中封装了请求消息数据;创建的Response对象用来填充数据作为响应,这两个对象都将被作为参数传递service方法

request对象继承体系结构:
ServletRequest – 接口
| 继承
|
HttpServletRequest – 接口
| 实现
|
org.apache.catalina.connector.RequestFacade 类(tomcat)

Request对象的功能

  1. 获取请求消息数据

    1. 获取请求行数据

      • 示例:GET http://localhost:8080/web/demo3 HTTP/1.1

      • 方法:

        1. 获取请求方式 :GET :String getMethod()

        2. 获取虚拟目录:/web String getContextPath()

        3. 获取Servlet路径:/demo3 String getServletPath()

        4. 获取get方式请求参数:name=qiangjingzhou String getQueryString()

        5. 获取请求URI:/web/demo3

          1. String getRequestURI(): /web/demo3

          2. StringBuffer getRequestURL(): http://localhost:8080/web/demo3

            • URL:统一资源定位符 :http://localhost:8080/web/demo3 中华人民共和国
            • URI:统一资源标识符 : /web/demo3 共和国
        6. 获取协议及版本:HTTP/1.1
          1. String getProtocol()

        7. 获取客户机的IP地址:
          1. String getRemoteAddr()

    2. 获取请求头数据

      方法:

      1. String getHeader(String name):通过请求头的名称获取请求头的值

      2. Enumeration<String> getHeaderNames():获取所有的请求头名称

    3. 获取请求体数据:

      请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

      步骤:

      1. 获取流对象

        1. BufferedReader getReader():获取字符输入流,只能操作字符数据
        2. ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
          • 在文件上传知识点后讲解
      2. 再从流对象中拿数据

代码演示

获取请求行数据

在之前的项目中在web目录下创建request目录,在该目录下创建RequestDemo1
在这里插入图片描述
该类的内容为

package com.westos.web.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("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String method = request.getMethod();
        System.out.println(method);

        String contextPath = request.getContextPath();
        System.out.println(contextPath);

        String servletPath = request.getServletPath();
        System.out.println(servletPath);

        String queryString = request.getQueryString();
        System.out.println(queryString);

        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURI);
        System.out.println(requestURL);

        String protocol = request.getProtocol();
        System.out.println(protocol);

        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }
}
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

启动项目,启动后在浏览器访问该项目,访问URL为,这里我们偷了个懒,没有通过表单提交数据,直接在url后添加了请求参数

http://localhost:8080/web/requestDemo1?name=qiangjingzhou

注意:在访问前打开开发者工具
在这里插入图片描述查看第一条请求
在这里插入图片描述可以看到我们的请求数据,在IDEA 中查看控制台的输出
在这里插入图片描述可以看到在控制台输出了请求头中的数据,可以通过这些数据做出相应的响应

获取的IP是IPV6版本的IP地址

这里需要注意一点,浏览器提交请求的方式默认是GET方式,当请求被提交到Servlet后,Servlet会根据请求方式是GET还是POST来执行相应的doGet还是doPost方法,我们需要将上面获得请求头数据的代码写到doGet方法中,如果写到doPost方法中就获取不到

获取请求头数据

在request目录下新建RequestDemo2,注意修改映射名

String getHeader(String name):通过请求头的名称获取请求头的值

Enumeration<String> getHeaderNames():获取所有的请求头名称

RequestDemo2中的内容为

package com.westos.web.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;
import java.util.Enumeration;

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();

        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //根据请求头名称获取请求头的值
            String value = request.getHeader(name);
            System.out.println(name + "----" + value);
        }
    }
}
  • 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
  • 26
  • 27
  • 28
  • 29

运行项目,在浏览器访问localhost:8080/web/requestDemo2
在这里插入图片描述可以看到控制台输出的请求头是以键值对的形式存在

但是Enumeration<String> getHeaderNames()方法用的比较少,因为我们一般在获取请求头的值的时候一般是知道请求头的名称的

可以获取user-agent的内容,判断向服务器提交请求的浏览器的版本以及浏览器的种类来设置不同的响应来解决浏览器兼容的问题

对之前的项目做一些修改

package com.westos.web.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;
import java.util.Enumeration;

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();

        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //根据请求头名称获取请求头的值
            String value = request.getHeader(name);
            System.out.println(name + "----" + value);
        }

        String header = request.getHeader("user-agent");
        if (header.contains("Firefox")){
            System.out.println("火狐来了");
        }else if (header.contains("Chrome")){
            System.out.println("谷歌来了");
        }
    }
}
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

运行项目

在火狐浏览器上访问http://localhost:8080/web/requestDemo2
在这里插入图片描述在这里插入图片描述在谷歌浏览器上访问同样的url
在这里插入图片描述在这里插入图片描述前面的输出结果是因为我没有删除之前的获取请求头的代码,通过这样的方式可以解决浏览器兼容的问题

获取请求体数据

只有POST请求的方式才会有请求体,在请求体中封装的POST的请求参数

步骤:

  1. 获取流对象

    1. BufferedReader getReader():获取字符输入流,只能操作字符数据
    2. ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
      • 在文件上传知识点后讲解
  2. 再从流对象中拿数据

在这里插入图片描述

在web目录下创建register.html文档,文档的内容为

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web/requestDemo3" 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
  • 17

在request目录下创建 RequestDemo3

package com.westos.web.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;
import java.util.Enumeration;

@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedReader reader = request.getReader();
        String line = null;
        while((line = reader.readLine()) != null){
            System.out.println(line);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
  • 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

运行项目,在浏览器访问URL http://localhost:8080/web/register.html

在这里插入图片描述
输入用户名和密码
在这里插入图片描述点击登录
在这里插入图片描述可以在终端看到我们的请求参数

获取请求参数的通用方式

request中存在一些方法

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

  1. String getParameter(String name):根据参数名称获取参数值 username=qiangjingzhou&password=12138
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 (多用于复选框)
    hobby=xx&hobby=game
  3. Enumeration<String> getParameterNames():获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap():获取所有参数的map集合

在web目录下创建register1.html文档

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web/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
  • 17

在request目录下创建RequestDemo4

package com.westos.web.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 {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println("POST");
        System.out.println(username);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println("GET");
        System.out.println(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

在Servlet中获取请求参数username的值,因为获取请求参数的方法在POSTGET是通用的,所以两种方法除了System.out.println("GET");System.out.println("POST");的结果不同,其余如果在请求参数一致只有提交请求方式不同的情况下我们获取的参数的值是一样的

运行项目,在浏览器访问http://localhost:8080/web/register1.html
在这里插入图片描述访问完成后,输入用户名和密码

在这里插入图片描述可以看到请求的提交方式以及请求参数username的值

修改文档中的表单提交方式,运行项目,提交表单
在这里插入图片描述可以看到提交方式发生改变,但是获取的参数和之前使用POST提交方式获取的参数一致,既然获取到的值是一致的并且代码也是一致通用的,就可以在doPost方法中调用doGet方法或者在doGet方法中调用 doPost方法

package com.westos.web.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 {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这样可以节省许多代码,后续我们都会这样使用

接下来演示String[] getParameterValues(String name)方法,这个方法主要应用于复选框,因为在复选框中一个名称对应多个请求参数的值

在web目录下创建register2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web/requestDemo4" method="get">
        <input type="text" placeholder="请输入用户名", name="username">
        <br>
        <input type="text" placeholder="请输入密码", name="password">
        <br>

        <input type="checkbox" name="hobby" value="game">游戏
        <input type="checkbox" name="hobby" value="study">学习
        <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
  • 20
  • 21
  • 22

在request目录下创建RequestDemo5

package com.westos.web.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 {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行项目,在浏览器访问localhost:8080/web/register2.html
在这里插入图片描述点击登录,可以看到控制台的输出
在这里插入图片描述在上面的代码中添加

Enumeration<String> parameterNames = request.getParameterNames();
     while(parameterNames.hasMoreElements()){
           String s = parameterNames.nextElement();
           System.out.println(s);
}
  • 1
  • 2
  • 3
  • 4
  • 5

启动项目,在浏览器访问,随便输入一些参数,提交表单
在这里插入图片描述获取到了请求参数的名称

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/310029
推荐阅读
相关标签
  

闽ICP备14008679号