HttpServlet中二次读取问题

今天跟着视频学习如何获取POST的请求体数据,发现问题
bufferedreader读取了请求的信息 username=%E1%B2&password=“123” (utf-8的编码好像是16进制数)
然后后面的enumerations = req.getParameterNames()的结果竟然为空,req.getParameter(“username”);的读取结果也为空。

post表单页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action = "/test_01_war_exploded/servlet_demo2" method="post">
        <input type = "text" placeholder="用户名" name="username">
        <br>
        <input type = "text" placeholder="密码" name="password">
        <input type = "submit" value = "注册">
    </form>
</body>
</html>

servlet代码

@WebServlet("/servlet_demo2")
public class request_02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /*...*/
        /*封装POST消息的请求参数*/
        /*POST才有*/
        /*字符流*/
        BufferedReader bf = req.getReader();
        while (true) {
            String s;
            s = bf.readLine();
            if (s == null) {
                break;
            }
            System.out.println(s);
        }
        Enumeration<String> enumerations = req.getParameterNames();
        while (enumerations.<String>hasMoreElements()) {
            /*(*)通过请求头获取请求值*/
            String name = enumerations.nextElement();
            System.out.println(name + ";");
        }
        String username = req.getParameter("username");
        System.out.println(username);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

运行上面发现bufferedreader读取了请求的信息 username=%E1%B2&password=“123” (utf-8的编码好像是16进制数)
但是后面的enumerations = req.getParameterNames()的结果为空,req.getParameter(“username”);的读取结果也为空。

原因:servlet的请求体放在流中,getParameter方法或得到流的方法都要操作该流,如果先执行上面的代码,流就到了结尾,再用getParameter就是空了
如果先执行下面,那么上面的也得不到输出。

结论 getParameter req.getReader() req.getInputStream()三个方法互相冲突

还有一个有趣的地方 getParameter里面封装了parameter对象,还有一个标志,读过一次流后标志会置为true,parameter对象保存了读取的信息。所以getParameter一类的方法可以:

		String username = req.getParameter("username");
        String usernames = req.getParameter("username");

这是不冲突的。具体可以看源码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值