Servlet学习笔记之HttpServletRequest详解

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

 返回完整的请求URL http://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对象,它们属于 两个独立的访问请求和响应过程。

一篇非常好的文章:

      HttpServletRequest应用_李晖晖的个人总结(第五次课)

猜你喜欢

转载自guoying252166655.iteye.com/blog/2041348
今日推荐