Request 获取请求数据
// 请求行部分
String getMethod() // 获取请求方式
String getContextPath() // 获取项目访问路径 /request-demo
StringBuffer getRequestURL() // 获取 URL 统一资源定位符 http://localhost:8080/request-demo/req1
String getRequestURI() // 获取 URI 统一资源标识符 /request-demo/req1
String getQueryString() // 获取请求参数(Get 方式) username=zhangsan&password=123
// 请求头部分
String getHeader(String name) // 根据请求头名称, 获取值
// 请求体部分 (Post 才有)
// 通过 流读取 来获取 Post请求的参数
ServletInputStream getInputStream() // 字节输入流
BufferedReader getReader() // 字符输入流
对于 请求参数,Get 和 Post 的获取方式不同
Request通用方式获取请求参数
Request对象里封装好了一个 Map集合,Map集合里放的就是所有的参数
Map<String,String[]> getParameterMap() // 返回这个 Map 集合
String[] getParameterValues(String name) // 根据 键名 获取值
String getParameter(String name) // 根据 键名 获取值
Map<String, String[]> map = req.getParameterMap();
for(String key : map.keySet()){
System.out.print(key + ":");
String[] values = map.get(key);
for(String value : values){
System.out.print(value + " ");
}
System.out.println();
}
关于 中文乱码问题
表单通过 get 提交时,参数直接体现在 url 中,此时没有发生乱码
String name = req.getParameter("username");
System.out.println(name); // 小城市堵车
表单通过 post 提交时,参数在请求体中,此时发生了乱码
String name = req.getParameter("username");
System.out.println(name); // å°åŸŽå¸‚å µè½¦
post获取参数乱码解决
由于 post 底层是通过 BufferedReader getReader()
来获取参数的,所以解决 post 乱码,可以通过
设置字符输入流的编码集:
用指定的编码集去覆盖request对象中默认的"ISO-8859-1"
编码集,这样就会用新的编码集去解码这些字节
req.setCharacterEncoding("UTF-8")
另,如果是 getReader 这种方式,则需要 使用 URLDecoder.decode
BufferedReader reader = req.getReader();
String s = reader.readLine();
String s1 = URLDecoder.decode(s, "utf8");
System.out.println(s1); // username=张三
// 如果不用 URLDecoder的话, 返回的是 username=%E5%BC%A0%E4%B8%89
// 原因不详