获取请求消息体的相关方法
由于HTTP请求消息中,用户提交的大量表单数据都是通过消息体发送给服务器的,为此,在HttpServletRequest 接口中,同样遵循以IO流传递大量数据的设计理念,在接收请求消息体时,定义了两个与输入流相关的方法,具体如下:
● getInputStream()方法
该方法用于获取表示实体内容的ServletInputStream对象。需要注意的是,如果实体内容为非文本,那么只能通过getInputStream()方法获取请求消息体。
● getReader()方法
该方法用于获取表示实体内容的BufferedReader对象,该对象会将实体内容中的字节数据按照请求消息中指定的字符集编码转换成文本字符串。需要注意的是,当调用getReader()方法时,可以使用setCharacterEncoding()方法指定BufferedReader对象所使用的字符编码,但是,如果在请求消息中不指定实体内容的字符编码,那么,返回的BufferedReader对象将采用ISO8859-1作为其默认的字符集编码。
了解了HttpServletRequest获取请求消息体的两个方法,接下来,通过一个用户登录的案例,分步骤讲解如何使用request对象获取请求消息体,具体如下:
(1)编写一个用户登录的表单文件form.html,如例1所示。
例1 form.html
1 <form action="/chapter05/RequestBodyServlet" method="post">
2 用户名:<input type="text" name="username"><br>
3 密 码:<input type="password" name="password"><br>
4 <input type="submit" value="提交">
5 </form>
(2)编写一个用于接收请求消息体的RequestBodyServlet,如例2所示。
例2 RequestBodyServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class RequestBodyServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 response.setContentType("text/html;charset=utf-8");
9
10 InputStream in = request.getInputStream();// 获取输入流对象
11 byte[] buffer = new byte[1024]; // 定义1024个字节的数组
12 StringBuilder sb = new StringBuilder(); // 创建StringBuilder对象
13 int len;
14 // 循环读取数组中的数据
15 while ((len = in.read(buffer)) != -1) {
16 sb.append(new String(buffer, 0, len));
17 }
18 System.out.println(sb);
19 }
20 public void doPost(HttpServletRequest request, HttpServletResponse response)
21 throws ServletException, IOException {
22 doGet(request, response);
23 }
24 }
(3) 在web.xml中配置完RequestBodyServlet映射后,启动Tomcat服务器,在浏览器的地址栏中输入URL地址http://localhost:8080/chapter05/form.html
访问form.html,浏览器显示的结果如图1所示。
图1 运行结果
(4)在图1所示的页面中,填写用户名“itcast”和密码“123”,点击提交按钮,控制台显示的结果如图2所示。
图2 运行结果
从图2中可以看出,控制台将用户名和密码打印了出来。由此说明,通过request对象的getInputStream()方法可以很方便地获取到请求消息体。getReader()方法的使用与getInputStream()类似,在此不再进行演示了。
注意:
HttpServletRequest 获取请求消息的两个方法是互斥的,即getInputStream()和getReader()方法不能同时使用,否则会抛出IllegalStateException异常。