java web HttpServletRequest
一、HttpServletRequest介绍
HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,通过这个对象提供的方法,可以获得客户端请求的所有信息。
HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息.
HTTP 请求消息有三部分: 1、请求行,2、请求消息头, 3、请求消息体
因此在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。
获取“请求行”信息的相关方法
方法声明 | 功能描述 |
---|---|
String getMethod() | 【获取请求方式 】该方法用于获取 HTTP 请求消息中的请求方式(如 GET、POST 等) |
String getRequestURI() | 【获取请求URI】该方法用于获取请求行中的资源名称部分即位于 URL 的主机和端门之后、参数部分之前的部分 |
String getQueryString() | 【获取get方式请求参数】该方法用于获取请求行中的参数部分,也就是资源路径后问号(?)以后的所有内容 |
String getContextPath() | 【获取虚拟目录:】该方法用于获取请求 URL 中属于 Web 应用程序的路径,这个路径以 / 开头,表示相对于整个 Web 站点的根目录,路径结尾不含 /。如果请求 URL 属于 Web 站点的根目录,那么返回结果为空字符串("") |
String getServletPath() | 【获取Servlet路径】该方法用于获取 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】该方法用于获取客户端发出请求时的完整 URL,包括协议、服务器名、端口号、 资源路径等信息,但不包括后面的査询参数部分。注意,getRequcstURL() 方法返冋的结果是 StringBuffer 类型,而不是 String 类型,这样更便于对结果进行修改 |
例子:
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());//获取 HTTP 请求消息中的请求方式(如 GET、POST 等) 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); } }
获取“请求消息头”的相关方法
方法声明 | 功能描述 |
---|---|
String getHeader(String name) | 该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,则 getHeader() 方法返回 null;如果请求消息中包含多个指定名称的头字段,则 getHeader() 方法返回其中第一个头字段的值 |
Enumeration getHeaders(String name) | 该方法返回一个 Enumeration 集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次 |
Enumeration getHeaderNames() | 该方法用于获取一个包含所有请求头字段的 Enumeration 对象 |
int getIntHeader(String name) | 该方法用于获取指定名称的头字段,并且将其值转为 int 类型。需要注意的是,如果指定名称的头字段不存在,则返回值为 -1;如果获取到的头字段的值不能转为 int 类型,则将发生 NumberFormatException 异常 |
long getDateHeader(String name) | 该方法用于获取指定头字段的值,并将其按 GMT 时间格式转换为一个代表日期/时间的长整数,该长整数是自 1970 年 1 月 1 日 0 时 0 分 0 秒算起的以毫秒为单位的时间值 |
String getContentType() | 该方法用于获取 Content-Type 头字段的值,结果为 String 类型 |
int getContentLength() | 该方法用于获取 Content-Length 头字段的值,结果为 int 类型 |
String getCharacterEncoding() | 该方法用于返回请求消息的实体部分的字符集编码,通常是从 Content-Type 头字段中进行提取,结果为 String 类型 |
获取消息体“请求参数”
方法声明 | 功能描述 |
---|---|
String getParameter(String name) | 【根据参数名称获取参数值】该方法用于获取某个指定名称的参数值。 如果请求消息中没有包含指定名称的参数,则 getParameter() 方法返回 null。 如果指定名称的参数存在但没有设置值,则返回一个空串。 如果请求消息中包含多个该指定名称的参数,则 getParameter() 方法返回第一个出现的参数值。 |
String [] getParameterValues (String name) |
【根据参数名称获取参数值的数组】HTTP 请求消息中可以有多个相同名称的参数(通常由一个包含多个同名的字段元素的 form 表单生成),如果要获得 HTTP 请求消息中的同一个参数名所对应的所有参数值,那么就应该使用 getParameterValues() 方法,该方法用于返回一个 String 类型的数组。 |
Enumeration getParameterNames() | 【获取所有请求的参数名称】方法用于返回一个包含请求消息中所有参数名的 Enumeration 对象,在此基础上,可以对请求消息中的所有参数进行遍历处理。 |
Map getParameterMap() | 【获取所有参数的map集合】getParameterMap() 方法用于将请求消息中的所有参数名和值装入一个 Map 对象中返回。 |
请求转发:一种在服务器内部的资源跳转方式
1. 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
2. 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
共享数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
* 方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext:
* ServletContext getServletContext()