HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分。因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。
本节将针对常用的获取请求行和请求消息头的相关方法进行讲解,下节《Java servlet获取form表单数据(参数)》继续讲解如何通过 HttpServletRequest 接口获取用户提交的 form 表单数据。
当访问 Servlet 时,所有请求消息将被封装到 HttpServletRequest 对象中,请求消息的请求行中包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,HttpServletRequest 接口定义了一系列方法,如表 1 所示。
方法声明 | 功能描述 |
---|---|
String getMethod() | 该方法用于获取 HTTP 请求消息中的请求方式(如 GET、POST 等) |
String getRequestURI() | 该方法用于获取请求行中的资源名称部分即位于 URL 的主机和端门之后、参数部分之前的部分 |
String getQueryString() | 该方法用于获取请求行中的参数部分,也就是资源路径后问号(?)以后的所有内容 |
String getContextPath() | 该方法用于获取请求 URL 中属于 Web 应用程序的路径,这个路径以 / 开头,表示相对于整个 Web 站点的根目录,路径结尾不含 /。如果请求 URL 属于 Web 站点的根目录,那么返回结果为空字符串("") |
String getServletPath() | 该方法用于获取 Servlet 的名称或 Servlet 所映射的路径 |
String getRemoteAddr() | 该方法用于获取请求客户端的 IP 地址,其格式类似于 192.168.0.3 |
String getRemoteHost() | 该方法用于获取请求客户端的完整主机名,其格式类似于 pcl.mengma.com。需要注意的是,如果无法解析出客户机的完整主机名,那么该方法将会返回客户端的 IP 地址 |
int getRemotePort() | 该方法用于获取请求客户端网络连接的端口号 |
String getLocaIAddr() | 该方法用于获取 Web 服务器上接收当前请求网络连接的 IP 地址 |
String getLocalName() |
该方法用于获取 Web 服务器上接收当前网络连接 IP 所对应的主机名 |
int getLocalPort() | 该方法用于获取 Web 服务器上接收当前网络连接的端口号 |
String getServerName() | 该方法用于获取当前请求所指向的主机名,即 HTTP 请求消息中 Host 头字段所对应的主机名部分 |
int gctServcrPort() | 该方法用于获取当前请求所连接的服务器端口号,即 HTTP 请求消息中 Host 头字段所对应的端口号部分 |
StringBuffcr getRequestURL() | 该方法用于获取客户端发出请求时的完整 URL,包括协议、服务器名、端口号、 资源路径等信息,但不包括后面的査询参数部分。注意,getRequcstURL() 方法返冋的结果是 StringBuffer 类型,而不是 String 类型,这样更便于对结果进行修改 |
表 1 列出了一系列用于获取请求消息行信息的方法,为了使读者更好地理解这些方法,下面通过案例演示这些方法的使用。
在 MyEclipse 中创建一个名称为 servletDemo02 的项目,在 src 下新建一个名称为 com.mengma.request 的包,在包中创建一个名为 RequestLineServlet 的 Servlet 类,在该类中编写用于获取请求行中相关信息的方法,如下所示。
package com.mengma.request; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class RequestLineServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); // 获取请求行的相关信息 out.println("getMethod : " + request.getMethod()); out.println("getRequestURI:" + request.getRequestURL()); out.println("getQueryString:" + request.getQueryString()); out.println("getContextPath:" + request.getContextPath()); out.println("getServletPath:" + request.getServletPath()); out.println("getRemoteAddr : " + request.getRemoteAddr()); out.println("getRemoteHost : " + request.getRemoteHost()); out.println("getRemotePort : " + request.getRemotePort()); out.println("getLocalAddr : " + request.getLocalAddr()); out.println("getLocalName : " + request.getLocalName()); out.println("getLocalPort : " + request.getLocalPort()); out.println("getServerName : " + request.getServerName()); out.println("getServerPort : " + request.getServerPort()); out.println("getRequestURL : " + request.getRequestURL()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/servletDemo02/RequestLineServlet 访问 RequestLineServlet,浏览器的显示结果如图 1 所示。
从图 1 中可以看出,浏览器显示出了请求 RequestLineServlet 时发送的请求行信息。由此可见,通过 HttpServletRequest 对象可以很方便地获取请求行的相关信息。