Servlet学习笔记之HttpServletRequest详解

本文深入探讨了HttpServletRequest对象的用途,展示了如何通过其常用方法获取客户端请求的详细信息,包括请求行、请求头、网络连接及客户端提交的数据。同时,文章阐述了Servlet API中的RequestDispatcher接口及其两个关键方法forward和include,解释了请求转发的概念,以及与请求重定向的区别,提供了实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息。

一、通过request常用方法获得相关信息

1:获得请求行消息

<!--请求行消息的格式如下-->
GET  /ServletStudy/requestServlet?name=bill&age=20  HTTP/1.1

<!--通过如下URL可以产生上面的请求行消息-->
http://localhost:8080/ServletStudy/requestServlet?name=bill&age=20

 

 常用方法说明:

方法名功能示例值
getMethod返回请求行中的请求方法(如GET、POST、PUT)GET
getRequestURI返回请求行中的资源部分(不包括参数部分)/ServletStudy/requestServlet
getQueryString返回查询字符串(即“?”后面的内容)name=bill&age=20
getProtocol返回请求行中的协议部分GET
getContextPath返回该请求所属的Web应用的路径 /ServletStudy

 

各方法执行结果如下:

 

 
 

2:获取请求头消息

方法名功能示例值
getHeader返回指定的头字段的值 
getHeaders

返回重名头字段的值

这个方法返回一个java.util.Enumeration

 
getHeaderNames返回一个包含所有头字段名字的Enumeration对象 
getIntHeader返回指定的头字段的值,并将其转换为int 
getDateHeader返回指定的头字段的值,并将其转换为Date 
getContentType返回请求正文的内容类型 
getContentLength

返回请求正文的长度,单位是字节。

如果未指定长度,则返回-1。

 
getCharacterEncoding

返回请求正文的字符集编码。

如果没有指定,则返回null。

 

 

3:获取网络连接消息

方法名功能示例值

getRemoteAddr

返回客户端的ip地址127.0.0.1

getRemoteHost

返回客户端的主机名。

如果无法解析出主机名,则返回客户端的ip地址。

127.0.0.1

getRemotePort

 返回客户端的端口号。50278

getLocalAddr

 返回服务器的ip地址127.0.0.1

getLocalName

 返回服务器的主机名localhost

getLocalPort

 返回服务器的端口号8080

getServerName

 返回HTTP请求消息的Host字段的主机号部分 127.0.0.1

getServerPort

返回HTTP请求消息的Host字段的端口号部分  8080

getScheme

 返回请求的协议名http

getRequestURL

 返回完整的请求URLhttp://127.0.0.1:8080/ServletStudy/requestServlet

各方法执行结果如下:



 

4:获取客户端提交的数据

方法名功能
getParameter(name)获取指定名称的参数值
getParameterValues(String name)获取指定名称参数的所有值数组
getParameterNames()返回一个包含请求消息中的所有参数名的Enumeration对象
getParameterMap()返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组。

 

 

二、request对象实现请求转发

 

Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:

 

public  void  forward (ServletRequest  request, ServletResponse  response) 
public  void  include (ServletRequest  request,ServletResponse  response)

 

 

   获取RequestDispatcher实例的方式主要有两种:

  1.  调用ServletContext接口提供的getRequestDispatcher(String  url)方法。
  2. 调用ServletRequest接口提供的getRequestDispatcher(String  url)方法。

  被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的     执行结果将被忽略。

 

 例:

request.getRequestDispatcher("./Welcome.jsp").forward(request,response);

即可从当前应用跳转到相应的"./Welcome.jsp"页面。

 

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

 

三、关于请求转发的一些细节

 

  1. forward方法用于将请求转发到RequestDispatcher对象封装的资源。
  2. 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
  3. 如果在调用forward方法之前向Servlet引擎的缓冲区 (response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的 内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。

四、请求重定向和请求转发的区别

    一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

   一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

注意:

 

  1. RequestDispatcher.forward方法只能将请求 转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 如果传递HttpServletResponse.sendRedirect方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
  2. 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL 地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  3. HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
  4. RequestDispatcher.forward方法的调用者与 被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而 HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于 两个独立的访问请求和响应过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值