接收请求:HttpServletRequest的几种用法

接收请求:HttpServletRequest的几种用法 当浏览器访问Servlet时Tomcat会创建一个HttpServletRequest对象把这个对象作为参数传给service方法。这个对象里封装了浏览器发过来的所有请求信息包括请求参数、请求头、请求方式、Cookie等等。一、获取请求参数的方法方法返回值作用使用场景getParameter(String name)String获取指定名称的参数值最常见的用法参数只有一个值的时候用getParameterValues(String name)String[]获取同名参数的所有值复选框、多选的爱好getParameterNames()EnumerationString获取所有参数名的枚举遍历所有参数不知道具体有哪些参数时用getParameterMap()MapString, String[]获取所有参数的Map集合封装成JavaBean、打印所有参数调试二、获取请求行信息的方法方法返回值作用使用场景getRequestURL()StringBuffer获取完整的请求URL从http开始到?前面结束记录完整访问地址、生成绝对路径getRequestURI()String获取请求的URI站点名Servlet路径权限控制、判断访问的资源getQueryString()String获取请求行中的参数部分?后面的内容记录原始参数、日志追踪getMethod()String获取客户端的请求方式GET/POST等区分处理不同请求方式getProtocol()String获取HTTP版本号HTTP/1.1等协议兼容性判断getContextPath()String获取webapp名字站点名带斜杠拼接路径、生成链接后三个一般用得不多三、完整代码示例WebServlet(/requestDemo) public class RequestDemoServlet extends HttpServlet { Override protected void service(HttpServletRequest request, HttpServletResponse resp) { // 假设请求地址http://localhost:8080/demo/requestDemo?username张三hobby篮球hobby足球 // 获取请求参数 // 1. getParameter - 获取单个参数 String username request.getParameter(username); System.out.println(用户名 username); // 2. getParameterValues - 获取多个值比如爱好 String[] hobbies request.getParameterValues(hobby); if (hobbies ! null) { System.out.println(爱好 Arrays.toString(hobbies)); } // 3. getParameterNames - 遍历所有参数名 EnumerationString paramNames request.getParameterNames(); while (paramNames.hasMoreElements()) { String name paramNames.nextElement(); String value request.getParameter(name); System.out.println(参数名 name 值 value); } // 4. getParameterMap - 获取所有参数的Map MapString, String[] paramMap request.getParameterMap(); for (Map.EntryString, String[] entry : paramMap.entrySet()) { String name entry.getKey(); String[] values entry.getValue(); System.out.println(name Arrays.toString(values)); } // 获取请求行信息 // 5. 获取完整的请求URL StringBuffer url request.getRequestURL(); System.out.println(完整URL url); // 输出http://localhost:8080/demo/requestDemo // 6. 获取请求的URI String uri request.getRequestURI(); System.out.println(请求URI uri); // 输出/demo/requestDemo // 7. 获取请求行中的参数部分 String queryString request.getQueryString(); System.out.println(参数部分 queryString); // 输出username张三hobby篮球hobby足球 // 8. 获取请求方式 String method request.getMethod(); System.out.println(请求方式 method); // 9. 获取HTTP版本号 String protocol request.getProtocol(); System.out.println(HTTP版本 protocol); // 10. 获取webapp名字 String contextPath request.getContextPath(); System.out.println(站点名 contextPath); // 输出/demo } }四、使用时的注意事项①getParameter和getParameterValues的区别单选框、文本框这种只有一个值的用getParameter。复选框这种可能有多个值的必须用getParameterValues否则只能拿到第一个。②getParameterValues返回的是数组哪怕只选中了一个复选框返回的也是长度为1的数组用之前最好判空。③参数不存在时返回nullreq.getParameter(不存在的参数)返回的是null不是空字符串。用的时候要注意空指针。⑤getParameterMap返回的Mapkey是参数名value是String[]。哪怕参数只有一个值也是数组。取值时要记得取第一个MapString, String[] map request.getParameterMap(); String[] values map.get(username); String username values[0];⑥URL和URI的区别URL完整的网络地址包含协议、域名、端口、路径URI只包含站点名和Servlet路径不包含协议和域名⑦getQueryString和getParameter的区别getQueryString()获取原始的参数串就是URL里?后面的原样内容不解析getParameter()获取解析后的参数值根据参数名取值// 请求/test?name张三name李四 String query request.getQueryString(); // name张三name李四URL编码后的原始内容 String[] names request.getParameterValues(name); // [张三, 李四]已自动解码⑧getRequestURL返回的是StringBuffer如果要当作String用需要调用toString()方法。⑨getContextPath返回值带斜杠比如项目名叫demo返回的是/demo不是demo。拼接路径时要注意不要重复加斜杠。⑩GET请求才有QueryStringPOST请求的参数在请求体里getQueryString()返回null。如果想获取POST请求的参数还是得用getParameter。五、乱码问题5.1 不同Tomcat版本的乱码表现Tomcat版本不同乱码的处理方式也不一样Tomcat 7及以下版本GET和POST请求都有乱码问题。GET请求的URI默认用ISO-8859-1解码POST请求的请求体也用ISO-8859-1解码。Tomcat 8及以上版本只有POST请求有乱码问题。GET请求的URI默认改成了UTF-8解码一般不会乱码。5.2 POST请求乱码POST请求的参数在请求体里不管哪个Tomcat版本默认编码都是ISO-8859-1不支持中文。不处理的话获取到的中文全是乱码。解决方法在获取任何参数之前设置请求编码// 这行代码必须在所有getParameter之前执行 request.setCharacterEncoding(UTF-8); // 然后再获取参数 String username request.getParameter(username);这个设置只对POST请求有效只影响请求体的解码方式。如果已经调用过getParameter再设置编码那就来不及了。5.3 GET请求乱码GET请求的参数附在URL后面乱码情况和Tomcat版本有关Tomcat 7及以下版本GET请求也有乱码。这时候request.setCharacterEncoding(UTF-8)对GET请求无效因为GET请求的参数不在请求体里。解决方法修改Tomcat的server.xml配置文件在Connector节点加上URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /Tomcat 8及以上版本默认已经是UTF-8不需要额外配置。如果因为某些原因改过配置导致乱码同样用上面的方法改回来。5.4 手动处理乱码不推荐如果既不能改配置又遇到了GET请求乱码可以手动转码// 先用ISO-8859-1取出来再转成UTF-8 name new String(request.getParameter(name).getBytes(ISO-8859-1), UTF-8);这种办法比较麻烦每次获取都要手动转一次不如直接配置编码来得省事。写在最后浏览器访问时Tomcat根据URL找到对应的Servlet调用service方法。我们可以通过HttpServletRequest获取请求参数和请求行信息处理完业务逻辑后再通过HttpServletResponse返回响应数据。以上是我对HttpServletRequest的学习整理刚接触的时候也分不清这么多方法写一遍代码跑一跑就慢慢记住了希望对同样在学Servlet的你有点帮助。