HttpServlet
类的请求处理方法(doGet
,doPost
…)有2个参数。
javax.servlet.http.HttpRequest
javax.servlet.http.HttpResponse
例如,下面是HttpServlet.doGet()
方法的声明,可以看到有上面提到的2个参数
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
本文将学习HttpRequest
类。
HttpRequest
类表示浏览器向web服务端发送的HTTP请求,浏览器发送的任何内容都可以通过HttpRequest访问。
HttpRequest
类有很多方法,我们只关注最常用的方法,其他内容可参考java官方文档。
参数
请求参数通常作为URL的一部分(在query string
中),或者请求体的一部分发送,例如:
http://qikegu.com/some-page.html?param1=hello¶m2=world
URL中的:param1=hello¶m2=world
这部分包含2个参数:
param1=hello
param2=world
可以从HttpRequest
中访问这些参数:
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 读取参数
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");
}
如果在HTTP请求体中发送了请求参数(如POST请求),可使用与上面相同的代码获取参数。如果给定名称的参数不存在,则返回null
。
通常如果浏览器发送GET请求,参数会放在URL中;发送POST请求,参数包含在请求体中。
Headers
请求头是浏览器发送请求时的头部信息,包含了一组名/值对,向服务端提供了诸如浏览器软件版本,接受文件类型等信息。
可以从HttpRequest
中访问请求头:
String contentLength = request.getHeader("Content-Length");
上面示例从请求头中读取浏览器发送的内容长度。
通常给定名称的值不存在,则返回null。
InputStream
如果浏览器发送一个HTTP POST请求,请求参数可放在请求体中。实际上请求体中可以放任何数据,如JSON数据。
要访问HTTP POST的请求体,可通过从HttpRequest
中获得InputStream
,从中读取请求体数据:
InputStream requestBodyInput = request.getInputStream();
注意: 此方法必须在调用
getParameter()
之前调用。原因是调用getParameter()方法将导致servlet引擎解析请求体以获取参数,一旦被解析,就不能以原始字节流的形式访问请求体了。
从InputStream
中读取的数据是原始数据,你需要解析这些数据。
Session(会话)
可以从HttpRequest
对象获得session
(会话)对象。
session
对象中保存了当前用户的会话信息。如果在某次请求期间将一些信息保存到session
对象中,那么在session
有效期内,任何后续请求都可以从session
对象中读取信息。
下面示例是从HttpRequest
访问session
对象:
HttpSession session = request.getSession();
关于session
对象,后续有更详细的介绍。
ServletContext
可以从HttpRequest
中访问ServletContext
对象。ServletContext
包含关于web应用程序的元信息。例如,可以从中存取web.xml
文件中设置的参数,可以将请求转发给其他servlet,还可以在ServletContext
中存储作用范围是整个web应用的参数。
下面示例是从HttpRequest
中访问ServletContext对象:
ServletContext context = request.getSession().getServletContext();
必须首先获得session
对象,然后再访问ServletContext
对象。
关于ServletContext
对象,后续有更详细的介绍。