Request请求

2023-11-17

Request请求:
  • Request请求,就是客户端希望从服务器端获取资源,向服务器发出询问。在B/S架构中,就是客户浏览器向服务器发出询问。在我们的JavaEE工程中,客户浏览器发出询问,要遵循HTTP协议所规定的。
  • 请求对象,就是在JavaEE工程中,用于发送请求的对象。我们常用的对象就是ServletRequest和HttpServletRequest,它们的区别就是是否和HTTP协议有关。是Servlet四大域之一
请求对象方法:
返回值 方法名 说明
String getContextPath() 获取虚拟目录名称
String getServletPath() 获取Servlet映射路径
String getRemoteAdd() 获取访问者ip地址
String getQueryString() 获取请求的消息数据
String getRequestURI() 获取统一资源标识符
StringBuffer getRequestURL() 获取统一资源定位符

演示:

@WebServlet("/requestMethod")
public class RequestMethod extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 访问地址http://localhost:8081/demo/requestMethod
        // getContextPath()	获取虚拟目录名称   /demo
        System.out.println(req.getContextPath());
        // getServletPath()	获取Servlet映射路径   /requestMethod
        System.out.println(req.getServletPath());
        // getRemoteAdd()	获取访问者ip地址   0:0:0:0:0:0:0:1
        System.out.println(req.getRemoteAddr());
        // getQueryString()	获取请求的消息数据    null
        System.out.println(req.getQueryString());
        // getRequestURI()	获取统一资源标识符    /demo/requestMethod
        System.out.println(req.getRequestURI());
        // getRequestURL()	获取统一资源定位符   http://localhost:8081/demo/requestMethod
        System.out.println(req.getRequestURL());
        // URI的范围更大(共和国),URL更具体(中华人民共和国)
    }
}
获取请求头方法:
返回值 方法名 说明
String getHeader(String name) 根据请求头名称获取一个值
Enumeration getHeaders(String name) 根据请求头名称获取多个值
Enumeration getHeaderNames() 获取所有请求头

演示:

@WebServlet("/requestHeaderDemo")
public class RequestHeaderDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // getHeader(String name)	根据请求头名称获取一个值
        System.out.println(req.getHeader("connection"));
        System.out.println("------------------------");

        // getHeaders(String name)	根据请求头名称获取多个值
        Enumeration<String> values = req.getHeaders("accept-encoding");
        while (values.hasMoreElements()) {
            String value = values.nextElement();
            System.out.println(value);
        }
        System.out.println("------------------------");

        // getHeaderNames()	获取所有请求头
        Enumeration<String> names = req.getHeaderNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String value = req.getHeader(name);
            System.out.println(name + " : " + value);
        }
    }
获取请求参数信息:
返回值 方法名 说明
String getParameter(String name) 根据名称获取数据
String[] getPaeameterValues(String name) 根据名称获取所有数据
Enumeration getParameterNames() 获取所有名称
Map<String,String[]> getParameterMap() 获取所有参数的键值对

演示:
注册页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>

<form action="/servletDemo08" method="get" autocomplete="off">
    姓名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="hobby" value="game">游戏
    <input type="checkbox" name="hobby" value="study">学习<br/>
    <button type="submit">提交</button>
</form>

</body>
</html>

获取请求参数:

@WebServlet("/servletDemo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // String	getParameter(String name)	根据名称获取数据
        System.out.println(req.getParameter("username"));
        System.out.println(req.getParameter("password"));
        System.out.println("——————————————————————");

        // String[]	getParameterValues(String name)	根据名称获取所有数据
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("——————————————————————");

        // Enumeration<String>	getParameterNames()	获取所有名称
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()) {
            System.out.println(names.nextElement());
        }
        System.out.println("——————————————————————");

        // Map<String,String[]>	getParameterMap()	获取所有参数的键值对
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            String[] values = map.get(key);
            System.out.print(key + ":");
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}
获取参数手动封装到对象:

学生类:

public class Student {
    private String username;
    private String password;
    private String[] hobby;
}

注册页面不变,改一下提交路径即可

@WebServlet("/servletDemo09")
public class ServletDemo09 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获取所有的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");

        // 2.封装学生对象
        Student student = new Student(username, password, hobby);

        // 3.打印学生对象
        System.out.println(student);
    }
}
反射封装对象:
@WebServlet("/servletDemo10")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {

        // 1. 获取所有的数据
        Map<String, String[]> map = req.getParameterMap();

        // 2. 封装学生对象
        Student student = new Student();

        // 3. 遍历集合
        for (String name : map.keySet()) {
            String[] value = map.get(name);
            try {
                // 获取Student对象的属性描述器,就是获取get/set,然后把get/set封装到pd里
                // 拿到User对象中的属性描述器。是谁的属性描述器:是由构造函数的第一个参数决定的。第二个参数是指定javabean的字节码
                PropertyDescriptor pd = new PropertyDescriptor(name, student.getClass());//参数指的就是拿哪个类的哪个属性的描述器
                // 设置javabean属性的值
                Method writeMethod = pd.getWriteMethod();

                if (value.length > 1) {
                    writeMethod.invoke(student, (Object) value);
                } else {
                    writeMethod.invoke(student, value);//第一个参数是指的给哪个对象,第二个参数指的是赋什么值
                }
            } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }

        // 4. 输出对象
        System.out.println(student);
    }
}
BeanUtils封装对象:

使用apache的commons-beanutils实现封装
如果遇到报500可能是没有将jar包要导入到项目中

@WebServlet("/servletDemo11")
public class ServletDemo11 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        //1.获取所有的数据
        Map<String, String[]> map = req.getParameterMap();

        //2.封装学生对象
        Student stu = new Student();
        try {
            // 通过该方法将map中的数据映射/封装到javabean的get和set方法中
            BeanUtils.populate(stu, map);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //4.输出对象
        System.out.println(stu);
    }
}
流对象获取请求信息:

方法:

返回值 方法名 说明
BufferedReader getReader() 获取字符输入流
ServletInputStream getInputStream() 获取字节输入流

演示:

@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 字符流获取必须使用post,字符流不是new出来的不需要关闭
/*        BufferedReader reader = req.getReader();
        String len;
        while ((len = reader.readLine()) != null) {
            System.out.println(len);
        }*/
        // 如果用post出现乱码就在代码前加个编码格式就可以了
        // setCharacterEncoding:设置编码格式
        req.setCharacterEncoding("UTF-8");
        // 字节流
        ServletInputStream inputStream = req.getInputStream();
        byte[] bytes = new byte[1024];
        int len;
        while ((len = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
中文乱码问题:

GET方式请求:

  • GET方式请求的正文是在地址栏中,在Tomcat8.5版本及以后,Tomcat服务器已经帮我们解决了,所以不会有乱码问题了。

POST方式请求

  • 在POST方式请求中,我们的乱码问题可以用如下代码解决:
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        /*
         * GET方式:正文在地址栏
         * username=%D5%C5%C8%FD
         * %D5%C5%C8%FD是已经被编过一次码了
         *
         * 解决办法:
         * 	 使用正确的码表对已经编过码的数据进行解码。
         */
        // setCharacterEncoding:设置编码格式
        req.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        System.out.println(username);
}
请求域:
  • 请求域(request域):可以在一次请求范围内进行共享数据
  • 一般用于请求转发 的多个资源中共享数据
请求对象操作共享数据方法:
返回值 方法名 说明
void setAttribute(String name,Object value) 向请求域对象中存储数据
object setAttribute(String name) 通过名称获取请求域对象中的数据
void removeAttribute(String name) 通过名称移除请求域对象中的数据
请求转发:

客户端的一次请求到达以后,发现借助其他的Servlet来实现功能

特点:

  • 浏览器地址不变
  • 域对象中的数据不丢失
  • 负责转发的Servlet转发前后的显示正文会丢失
  • 由转发的目的地来响应客户端
请求转发的方法:
返回值 方法名 说明
RequestDispatcher getRequestDispatcher(String name) 获取请求调度对象
void forward(ServletRequest req,ServletResponse resp) 实现转发
@WebServlet("/servletDemo12")
public class ServletDemo12 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置共享数据
        req.setAttribute("itzhuzhu", "正在学习");
        // 获取请求调度对象
        RequestDispatcher rd = req.getRequestDispatcher("servletDemo13");
        // 实现转发功能
        rd.forward(req, resp);
    }
}
@WebServlet("/servletDemo13")
public class ServletDemo13 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取共享数据
        System.out.println(req.getAttribute("itzhuzhu"));
        System.out.println("ServletDemo13执行");
    }
}
请求包含:

可以合并其它Servlet中的功能一起响应给客户端

特点:

  • 浏览器地址不变
  • 域对象数据不丢失
  • 被包含的Servlet响应头会丢失
请求包含方法:
返回值 方法名 说明
RequestDispatcher getRequestDispatcher(String name) 获取请求调度对象
void include(ServletRequest req,ServletResponse resp) 实现包含
@WebServlet("/servletDemo14")
public class ServletDemo14 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置共享数据
        req.setAttribute("itzhuzhu", "正在学习");
        // 获取请求调度对象
        RequestDispatcher rd = req.getRequestDispatcher("/servletDemo13");
        // 实现包含功能
        rd.include(req, resp);
    }
}
重定向和请求转发 :
  • 重定向:通过各种方法将各种网络请求重新定个方向转到其它位置,地址会变
  • 请求转发:客户端发起请求后,在服务器之间的跳转,然后服务器返回页面给客户端进行显示,地址不变
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Request请求 的相关文章

  • 我可以使用 JavaScript/JQuery 将上传的文件添加到 ASP.NET 中的 Request.Files 中吗?

    我不完全确定如何使用 JavaScript 将文件添加到 Request Files 中 这就是我要去的 var x input type file eq 0 Add the data to the hidden field hiddenF
  • 每次我发出 http 请求时应用程序都会崩溃

    这是我的代码 每次我触摸 imageview 我的应用程序都会等待大约 5 秒然后崩溃 我有互联网权限 在服务器端 我有一个 php 页面 它读取 GET 并将其插入数据库中 public class Home extends Activi
  • 使用 Retrofit 2.0 POST 方法获取请求正文内容

    我需要在执行之前获取请求正文并使用 Retrofit 2 0 执行一些逻辑操作enque手术 但不幸的是 我无法从我的服务呼叫中获取帖子正文内容 目前 经过大量搜索后 我发现只有一种解决方案 例如logging the request我使用
  • Spring中有没有静态的方法来获取当前的HttpServletRequest

    我正在使用Spring注释 我可以通过HttpRequestContext从控制器到服务 我正在寻找一种静态方式或任何比通过更好的解决方案RequestContext around 如果您使用 spring 您可以执行以下操作 public
  • 从 URL 获取图像作为缓冲区

    我花了几个小时尝试获取图像数据作为缓冲区 搜索结果导致我使用 请求 模块 其他建议导致使用更高版本的节点中的其他模块 我无法使用它 因为我们依赖于节点 v 6 11迄今为止 这是我的试验 request imageURL pipe fs c
  • 如果没有收到请求的响应,会发生什么情况?我看到重试

    我认为我遇到的问题可能更多是与浏览器相关的问题 但它是一个非常基本的问题 当我冒险构建一个 Web 应用程序时 我也想找到答案 在我的客户端代码中我正在做一个 ajax称呼 这篇文章可能需要一段时间才能回复 我看到的是在一段时间后再次发送请
  • 我如何在soapUI中循环发出具有不同内容的请求? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个方法作为soapUI 中的请求 它将数据传输到在线平台 我有不同的变量 每次都有不同的竞争 有没有办法让我每次都用不同的内容循
  • Django:从 QueryDict 读取 JSON 对象数组

    如何通过 JS 的 AJAX 调用传递复合 JSON 结构 并在服务器端将其读取为 python 中的 非常相似 的数据结构 我知道可以使用 json 格式 simplejson 等 但我不知何故觉得 QueryDict 本身在我的情况下格
  • RSpec 请求 - 如何为所有请求设置 http 授权标头

    我正在使用 rspec 请求来测试 JSON API 该 API 需要在每个请求的标头中包含 api key 我知道我可以这样做 get v1 users janedoe json HTTP AUTHORIZATION gt Token t
  • 关于 PHP 范围的问题 - 从 Java 程序员的角度来看

    我对 PHP 还很陌生 所以我试图理解 PHP Web 应用程序中的范围概念 在 Java 世界中 Java Web 应用程序 使用 Java Server Pages JSP 及以上 将允许 Java Bean 具有以下级别的范围 Pag
  • Python请求响应以utf-8编码但无法解码

    我正在尝试使用 python 抓取我的messenger com facebook Messenger 聊天记录 并且我使用谷歌浏览器开发工具来查看聊天历史记录的 POST 请求 并且我已将整个标头和正文复制为请求可以使用的格式 我得到 H
  • Slack Webhook - 获取 Invalid_Payload

    我正在尝试设置 Slack 的 Webhook 但收到 Invalid Payload 错误消息 我浏览过 Stack Slack 和 Github 但找不到我想要的答案 为了保护隐私 其中的 自定义链接 正在使用实际链接 CODE var
  • Java获取调用页面的URL

    为了让您了解情况 我们使用基于 Tomcat 6 0 29 的自定义服务器 我们正在使用 Java 和 Spring 进行开发 假设我有一个链接 您可以从http localhost 显示 http localhost display to
  • 在 Tomcat 中触发内部 ServletRequest

    我正在使用 Quartz 来安排 Web 应用程序的后台任务 其中一些任务只是针对同一 Web 应用程序发出请求 我想避免依赖于任何类型的网络设置 例如 如果从数据中心内发出带有我自己域名的请求 则可能无法正确路由 是否有一个 Java A
  • Web 服务器是否可以向自身发出 HTTPS 请求?

    假设您有两个应用程序 A 和 B 在同一 Web 服务器上运行 您希望应用程序 A 通过 SSL 调用应用程序 B 上的 webService 是否可以使用类似的地址来做到这一点https localhost appsB webServic
  • 如何制作将 HTML 文件加载到 div 中的 XMLHttpRequest?

    我正在尝试做一个XMLHttpRequest从外部文件加载 HTML 并将文件内容插入到div 当我运行该函数时 它会在所有正文中插入 HTML 这是不够的 My code gt HTML
  • PdoStatement->bindParam() 上的字符串编码问题?

    我正在尝试执行一个简单的SELECT来自取自 a 的字符串的语句 REQUESTvar 但我的 PDO 语句似乎不喜欢字符串格式 为什么 My REQUESTvar 包含一个字符串 例如Hello World 所以我需要替换 用空格来做我的
  • Nodejs:带有 URL 列表的异步请求

    我正在研究爬虫 我有一个需要请求的 URL 列表 如果我不将其设置为异步 则会同时有数百个请求 我担心它会爆炸我的带宽或产生对目标网站的大量网络访问 我应该怎么办 这是我正在做的事情 urlList forEach url index gt
  • ExpressJS - DELETE 请求后 res.redirect

    我一直在寻找如何执行此操作 我正在尝试在发出删除请求后重定向 这是我正在使用的代码没有重定向 exports remove function req res var postId req params id Post remove id p
  • 使用 VB/ASP classic 可以向 API 发出 HTTP 请求吗?

    是否可以使用 ASP classic 向 Web API 发出请求 例如 像 Flickr API 这样简单的东西 或者这种东西很久以前就不支持了 这是很有可能的 Dim req Set req Server CreateObject MS

随机推荐

  • 李宏毅机器学习 hw1 boss baseline 解析

    hw1 代码 任务描述 任务很简单 就是一个回归问题 给你过去四天新冠肺炎感染人数的相关情况 让你预测最后一天的新冠感染人数 上图展示了特征的解析特征共有117维 首先是37维的关于州的one hot编码 然后是4维的特征表示是否有新冠相像
  • 山东理工大学第十五届ACM程序设计竞赛 R - Zyn的超能力

    Description Zyn 需要能量提高自己的超能力 有两种能量存在 超级能量和小能量 对于超级能量 Zyn 绝对不可以错过 而且努力的 Zyn 希望得到更多的小能量 但是 Zyn 每天最多可以获得 k 次能量 而且每个能量都会在第 x
  • DNF那个跨区服务器稳定,dnf2017年最新跨区表 dnf2017跨区大区汇总介绍

    小编今天为大家带来的就是dnf2017年的最新跨区表 还不清楚dnf2017年各大区跨区详情的小伙伴们抓紧时间跟上小编一起来看一下吧 DNF跨6有哪些区 地下城与勇士跨区列表2017 跨一 广东1区 广东2区 广东3区 广东4区 广东5区
  • Vue:配置.env.dev文件不生效的问题

    问题描述 Vue项目的 env dev文件配置如下 但是在启动项目之后 通过process env VUE APP SCISERVE获取到的变量值一直为undefined 开发环境配置 在配置文件中定义自定义变量时 一定要以 VUE APP
  • WI-FI定位算法原理与介绍

    所谓的定位 就是利用所有可以获取的信息 对用户所在的位置进行推算 得到最大可能的用户位置 定位可以分为很多种定位 基站定位 WI FI定位 GPS定位 甚至地磁定位 几种定位方式各有优缺点 定位方式 精度 M 速度 耗电量 适用范围 基站定
  • Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归

    Scikit Learn 机器学习笔记 线性回归 逻辑回归 softmax回归 参考文档 handson ml import numpy as np from matplotlib import pyplot as plt 创建线性回归数据
  • 河北计算机等级考试但不包含职称,河北省计算机等级考试但不包含职称的页面(河北省计算机等级考试时间)...

    最佳案可以的 职称计算机在考试时 往往解决方法不止一种 只要达到最终结果 把题操作对就行了 界通2015年全国职称计算机考试模拟题库软件祝您考试顺利 最佳案职称计算机考试和全国计算机等级考试不是一回事 职称计算机考试是用于评职称的 比如评高
  • Java基础:Callable

    Callable具有返回值 抛出异常 import java util concurrent Callable public class TestCallable implements Callable Override public Bo
  • mysql 数据库字段动态扩展

    主要有一下几种方案 1 动态添加属性字段 当数据库中需要增加一个字段的时候 直接在数据库中增加 并修改相应的代码 优点 操作简单 易懂 缺点 每增加一个字段都需要修改数据库表结构 修改代码 而且在一张大表进行操作的时候 还可能需要很长时间
  • windows下的torch=1.2.0环境配置

    神经网络学习小记录48 windows下的torch 1 2 0环境配置 学习前言 环境内容 Anaconda安装 下载Cudnn和CUDA 配置torch环境 安装VSCODE 学习前言 好多人问环境怎么配置 还是出个教程吧 环境内容 t
  • Vmware 虚拟机 网络设置

    弄了很久 每次重启虚拟机都会网络连接不上 于是 这次弄好了之后 决定记录一下 我的虚拟机 主要用于PHP swoole 需要装在linux 上面 不得不通过虚拟机安装 学习一下 一 关于虚拟机的设置 1 选择NAT 模式 2 设置NAT模式
  • ShardingJDBC数据库中间件学习笔记

    简介 官网地址 https shardingsphere apache org index zh html Apache ShardingSphere 产品定位为 Database Plus 旨在构建多模数据库上层的标准和生态 它关注如何充
  • 【Docker】Docker java shell ssh

    1 在宿主机执行docker容器中的shell脚本或命令 常见命令形式 docker exec it master bin bash c echo PATH docker exec it master bin bash c cd home
  • 剑指offer-两个栈实现-队列尾部插入,头部删除

    大家都知道 队列是一个尾部 rear 插入 头部 front 删除的数据结构 本题要求 用两个栈 构造出一个队列出来 本题中 构造两个栈 stack1和stack2 1用来插入 2用来弹出 其中 栈1的插入很简单 函数体内部 直接用add方
  • 快速体验 Sentinel 集群限流功能,只需简单几步

    Pic by Alibaba Tech on Facebook 集群限流可以限制某个资源调用在集群内的总 QPS 并且可以解决单机流量不均导致总的流控效果不佳的问题 是保障服务稳定性的利器 Sentinel 从 1 4 0 传送门 版本开始
  • glog编译与使用

    1 拉取 git clone https github com google glog git cd glog mkdir build cd build cmake vs2022打开 编译release的 2 放到项目中 3 案例一 inc
  • 《动手学深度学习 Pytorch版》 5.4 自定义层

    5 4 1 不带参数的层 import torch import torch nn functional as F from torch import nn class CenteredLayer nn Module def init se
  • html中按钮下拉菜单,Bootstrap3.0学习笔记之按钮与下拉菜单

    前面的文章算是把Bootstrap CSS部分简单的学习了一遍 应该忽视了比较多的细节问题 不过大部分的内容我都过了一遍 并且用代码实现了一遍 而且看到了真实的效果 挺不错的 那么接下来的几篇文章主要来讲解Bootstrap的组件 那么本文
  • 回收站被清空如何找回

    回收站被清空如何找回 清空回收站 可以是手动清理也可以是自动定期清理 不过在清空回收站前 还是先排查所有文件 以防止误删的或意外删除的 但很多时候回收站是存放大量临时删除的文件 不可能在去一个一个排查的 通常都是看一下就直接按清空键清空了
  • Request请求

    Request请求 Request请求 就是客户端希望从服务器端获取资源 向服务器发出询问 在B S架构中 就是客户浏览器向服务器发出询问 在我们的JavaEE工程中 客户浏览器发出询问 要遵循HTTP协议所规定的 请求对象 就是在Java