在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletReauest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。
当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HTTPServletRequest接口中,定义了一系列用于获取请求行的方法,如下表:
示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取请求行的相关信息
out.println("getMethod:" + request.getMethod() + "<br/>");
out.println("getQueryString:" + request.getQueryString() + "<br/>");
out.println("getProtocol:" + request.getProtocol() + "<br/>");
out.println("getContextPath" + request.getContextPath() + "<br/>");
out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
out.println("getServletPath:" + request.getServletPath() + "<br/>");
out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
out.println("getLocalName:" + request.getLocalName() + "<br/>");
out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
out.println("getServerName:" + request.getServerName() + "<br/>");
out.println("getServerPort:" + request.getServerPort() + "<br/>");
out.println("getScheme:" + request.getScheme() + "<br/>");
out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
通过request获得请求头
当请求Servlet时,需要通过请求头向服务器传递附加信息,例如,客户端可以接收的数据类型,压缩方式,语言等。为此,在HttpServletRequest接口中,定义了一系列用于获取HTTP请求头字段的方法,如下表:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取请求头信息
Enumeration headerNames = request.getHeaderNames();
//使用循环遍历请求头,并通过getHeader()方法获取一个指定名称的头字段
while (headerNames.hasMoreElements()){
String headerName = (String) headerNames.nextElement();
out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
}
}
通过request获得请求体(请求参数)
在实际开发中,经常需要获取用户提交的表单数据,例如,用户名,密码、电子邮件等,为了方便获取表单中的请求参数,在HttpServletRequest接口总,定义了一些列获取请求参数的方法,如下表所示:
示例:
创建一个带有表单的jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表单</title>
</head>
<body>
<form action="/JavaEEDemo/request" method="post">
用户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"><br/>
爱 好:
<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="dance">跳舞
<input type="checkbox" name="hobby" value="football">足球
<input type="submit" value="提交">
</form>
</body>
</html>
编写Servlet的doPost方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
//获取参数名为hobby的值
String[] hobbys = request.getParameterValues("hobby");
System.out.println("爱好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.println(hobbys[i] + ", ");
}
}