Request获取请求数据

分为三部分

  1. 请求行
  2. 请求头
  3. 请求体

1. 请求行

在这里插入图片描述

        // String getMethod():获取请求方式: GET
        String method = req.getMethod();
        System.out.println(method);//GET
        // String getContextPath():获取虚拟目录(项目访问路径):/request-demo
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
        StringBuffer url = req.getRequestURL();
        System.out.println(url.toString());
        // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
        String uri = req.getRequestURI();
        System.out.println(uri);
        // String getQueryString():获取请求参数(GET方式): username=zhangsan
        String queryString = req.getQueryString();
        System.out.println(queryString);

控制台的输出
在这里插入图片描述

2. 请求头

在这里插入图片描述

        // 获取请求头:user-agent: 浏览器的版本信息
        String agent = req.getHeader("user-agent");
        System.out.println(agent);

3. 请求体

在这里插入图片描述

针对的是Post请求

所以先建一个表单

<body>

<form action="http://localhost:8080/request-demo/req4" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="checkbox" name="hobby" value="1"> 游泳
    <input type="checkbox" name="hobby" value="2"> 爬山 <br>
    <input type="submit">
</form>

</body>

在这里插入图片描述

然后重写doPost方法

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取post 请求体:请求参数
        //1. 获取字符输入流
        BufferedReader br = req.getReader();
        //2. 读取数据
        String line = br.readLine();
        System.out.println(line);
    }

此处的字符流不需要手动关闭,当Request对象被销毁时,字符流会自动关闭。

1.Get方式获取请求参数,是通过getQueryString()
2.Post方式而是通过对应的输入流来获取的,
//1. 获取字符输入流 BufferedReader br = req.getReader();
//2. 读取数据 String line = br.readLine();

3. 通用方式获取请求参数

在这里插入图片描述

因为当重写doGet和doPost方法时,其中的代码逻辑只有在请求参数获取方式上不同。
所以可以提供一个统一获取请求参数的方式

在这里插入图片描述

但这里有些问题
在这里插入图片描述

上面是我们获取的参数字符串,我们要用Request来对其进行解析。
request对其进行分割
在这里插入图片描述
分割的字符串是一对对的键值对,所以request采用map集合进行存储
在这里插入图片描述
而避免出现一对多的情况,value值采用字符串数值类型
在这里插入图片描述

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //GET请求逻辑
        //System.out.println("get....");

        //1. 获取所有参数的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key+":");

            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }

            System.out.println();
        }

        System.out.println("------------");

        //2. 根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {

            System.out.println(hobby);
        }

        //3. 根据key 获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username);
        System.out.println(password);
    }

而为了提高代码的复用率,在doPost中直接调用doGet方法即可,方法逻辑是相同的

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //POST请求逻辑
        this.doGet(req,resp);
    }

所以底层到底是getQueryString()还是getReader()就不用关心了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值