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

启动项目,启动后在浏览器访问该项目,访问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);
        }
    }
}

运行项目,在浏览器访问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("谷歌来了");
        }
    }
}

运行项目

在火狐浏览器上访问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>

在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 {

    }
}

运行项目,在浏览器访问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>

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

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

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

接下来演示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>

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

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

Enumeration<String> parameterNames = request.getParameterNames();
     while(parameterNames.hasMoreElements()){
           String s = parameterNames.nextElement();
           System.out.println(s);
}

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uni-app中,使用uni.request()是无法直接上传文件的,因为request的data参数无法接受FormData格式的数据。所以需要通过曲线救国的方式来上传文件,可以使用uni.uploadFile()来实现。首先,你需要使用uni.chooseImage()方法选择要上传的文件,并将文件保存在file变量中。然后,将file作为参数传递给uni.uploadFile()方法,同时指定上传文件的URL、文件类型、文件名等信息。最后,在success回调函数中可以处理上传成功后的响应。以下是一个示例代码: uni.chooseImage({ count: 1, // 默认为9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 从相册选择 success: (res) => { let file = res.tempFiles; // 获取file格式的文件 uni.uploadFile({ url: 'XXX', // 上传文件的URL file: file, // 要上传的文件 fileType: 'image', // 文件类型 name: 'img_file', // 文件名 success: (res) => { console.log(res); } }); } }); 通过以上代码,你可以在uni-app中使用uni.request()来实现文件上传功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [uni-app 上传图片 H5 微信小程序 APP 均可使用](https://blog.csdn.net/weixin_49230250/article/details/127262596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [uniapp上传文件(图片、视频)](https://blog.csdn.net/u011200562/article/details/113544671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [uniapp前端单文件上传JAVA后台接收实现(亲测)](https://download.csdn.net/download/nhb8890/12936989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值