今天跟着视频学习如何获取POST的请求体数据,发现问题
bufferreader读取了请求的信息 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);
}
}
运行上面发现bufferreader读取了请求的信息 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");
这是不冲突的。具体可以看源码。