request对象是JSP中非常重要的内置对象,每个request对象封装着一次用户请求(即用户每向服务器发送一次请求就是一个request对象),并且所有的请求参数都封装在request对象中,因此request对象是获取用户请求参数的重要途径。JSP中的request内置对象对应了servlet的HTTPServletRequest接口。该类定义如下:
public interface ServletRequest
除此之外,request 可代表本次请求范围,所以还可以用于操作 request 范围的属性。
Web应用是请求/响应架构的应用,浏览器发送请求时通常总会附带一些请求头,还可能包含一些请求参数发给服务器,服务器端负责解析请求头/请求参数的就是JSP或Servlet,而Jsp和Servlet取得参数的途径就是request。request是HTTPServletRequest接口的实例。
通过下面代码来验证request对象是HTTPServletRequest的实例:
<% if ( request instanceof HttpServletRequest ) { out.println("request是HttpServletRequest类的实例"); } else { out.println("request不是HttpServletRequest类的实例"); } %>
输出结果是:
request是HttpServletRequest类的实例
// 获取paramName请求参数值 String getParameter(String paramName) // 获取所有请求参数名和参数值所组成的Map对象 Map getParameterMap() // 获取所有请求参数名所组成的Enumeration对象 Enumeration getParameterNames() // paramName请求参数的值,当参数有多个值时该方法将返回多个值所组成的参数 String[] getParameterValues(String name) HttpServletRequest提供了如下方法来访问请求头: // 根据指定请求头的值 String getHeader(String name) // 获取所有请求头的名称 java.util.Enumeration<String> getHeaderNames() // 获取指定请求头的多个值 java.util.Enumeration<String> getHeaders(String name) // 获取指定请求头的值,并将该值转化为整数值 int getIntHeader(String name)
对于开发人员来说,请求头和请求参数都是由用户发送到服务器的数据,区别在于请求头通常由浏览器自动添加,因此一次请求总是包含若干请求头;而请求参数则通常需要开发人员控制添加,让客户端发送请求参数通常分为两种情况。
直接在浏览器地址蓝输入访问地址发送的请求或提交表单发送请求时,该表单对应的form元素没有设置method属性,或设置method属性为get,这几种请求都是GET方式的请求。GET方式的请求会将请求参数名和值转换成字符串,并附加在源URL之后,因此可以在地址栏中看到请求参数的名和值。且GET请求传送的数据量较小,一般不能大于2KB.
这种方式通常使用提交表单(由form HTML元素表示)的方式来发送,且需要设置form元素的mothod属性为post。POST方式传送的数据量较大通常认为POST请求参数的大小不受限制,但往往取决于服务器的限制,POST请求传输的数据量总比GET传输的数据量大。而且POST方式发送的请求参数以及对应的值放在HTML HEADER中传输,用户不能在地址蓝里看到请求参数,安全性相对较高。
并不是每个表单域都会生成请求参数,而是有name属性的表单域才生成请求参数。关于表单域和请求参数的关系遵循如下4点:
(1)每个有name属性的表单域对应一个请求参数。
(2)如果有多个表单域有相同的name属性,则多个表单域只能生成一个请求参数,只是该参数有多个值。
(3)表单域的name属性指定请求参数名,value指定请求参数的值。
(4)如果表单域设置了disable="disabled"属性,则该表单域不再生成请求参数。
HttpServletRequest还包含如下两个方法,用于设置和获取request范围的属性。 // 将attValue设置成request范围的属性 setAttribute(String attName,Object attValue) // 获取request范围的属性 Object getAttribute(String attName)
request 还有一个功能就是执行 forward 和 include,也就是代替 JSP 所提供的 forward 和 include 动作指令。
HttpServletRequest 类提供了一个 getRequestDispatcher(String path)方法,其中 path 就是希望 forward 或者 include 的目标路径,该方法返回 RequestDispatcher,对象提供了如下两个方法。
// 执行forward forward(ServletRequest request,ServletResponse response) // 执行include include(ServletRequest request,ServletResponse response)
实例1:获取部分请求头信息,如:请求方式、请求的资源名称、请求协议等
<%@ page contentType="text/html;charset=gb2312"%> <%request.setCharacterEncoding("gb2312");%> <html> <head> <title>request对象_例1</title> </head> <body bgcolor="#FFFFF0"> <form action="" method="post"> <input type="text" name="qwe"> <input type="submit" value="提交"> </form> 请求方式:<%=request.getMethod()%><br> 请求的资源:<%=request.getRequestURI()%><br> 请求用的协议:<%=request.getProtocol()%><br> 请求的文件名:<%=request.getServletPath()%><br> 请求的服务器的IP:<%=request.getServerName()%><br> 请求服务器的端口:<%=request.getServerPort()%><br> 客户端IP地址:<%=request.getRemoteAddr()%><br> 客户端主机名:<%=request.getRemoteHost()%><br> 表单提交来的值:<%=request.getParameter("qwe")%><br> </body> </html>
实例2:使用表单提交参数,然后从request对象中获取参数
<%@ page contentType="text/html;charset=gb2312" %> <% request.setCharacterEncoding("gb2312"); %> <%@ page import="java.util.Enumeration" %> <html> <head> <title>request对象_例2</title> </head> <body bgcolor="#FFFFF0"> <form action="" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="text" name="userpass"><br/> <input type="submit" value="进入" > </form> <% String str = ""; if ( request.getParameter("username") != null && request.getParameter("userpass") != null ) { Enumeration enumt = request.getParameterNames(); while( enumt.hasMoreElements() ){ str = enumt.nextElement().toString(); out.println(str + ":" + request.getParameter(str) + "<br>"); } } %> </body> </html>
实例3:获取表单里面所有的value
<%@ page contentType="text/html;charset=gb2312"%> <%request.setCharacterEncoding("gb2312");%> <html> <head> <title>request对象_例3</title> </head> <body bgcolor="#FFFFF0"> <form action="" method="post"> 擅长:<input type="checkbox" name="cb" value="ON1">VC++ <input type="checkbox" name="cb" value="ON2">JAVA <input type="checkbox" name="cb" value="ON3">DELPHI <input type="checkbox" name="cb" value="ON4">VB <br> <input type="submit" value="进入" name="qwe"> </form> <% if(request.getParameter("qwe")!=null ){ for(int i=0;i<request.getParameterValues("cb").length;i++){ out.println("cb"+i+":"+request.getParameterValues("cb")[i]+"<br>"); } out.println(request.getParameter("qwe")); } %> </body> </html>
实例4:获取request的上下文路径
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> <html> <head> <title>request主要方法调用示例</title> </head> <body> <font size="2"> request主要方法调用示例:<br> <% request.setAttribute("attr","Hello!"); out.println("attr属性的值为:"+request.getAttribute("attr")+"<br>"); out.println("上下文路径为:"+request.getContextPath()+"<br>"); out.println("Cookies:"+request.getCookies()+"<br>"); out.println("Host:"+request.getHeader("Host")+"<br>"); out.println("ServerName:"+request.getServerName()+"<br>"); out.println("ServerPort:"+request.getServerPort()+"<br>"); out.println("RemoteAddr:"+request.getRemoteAddr()+"<br>"); request.removeAttribute("attr"); out.println("属性移除操作以后attr属性的值为:"+request.getAttribute("attr")+"<br>"); %> </font> </body> </html>