什么是request对象?
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类的实例
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 getHeaderNames()
// 获取指定请求头的多个值
java.util.Enumeration getHeaders(String name)
// 获取指定请求头的值,并将该值转化为整数值
int getIntHeader(String name)
对于开发人员来说,请求头和请求参数都是由用户发送到服务器的数据,区别在于请求头通常由浏览器自动添加,因此一次请求总是包含若干请求头;而请求参数则通常需要开发人员控制添加,让客户端发送请求参数通常分为两种情况。
GET方式的请求
直接在浏览器地址蓝输入访问地址发送的请求或提交表单发送请求时,该表单对应的form元素没有设置method属性,或设置method属性为get,这几种请求都是GET方式的请求。GET方式的请求会将请求参数名和值转换成字符串,并附加在源URL之后,因此可以在地址栏中看到请求参数的名和值。且GET请求传送的数据量较小,一般不能大于2KB.
POST方式的请求
这种方式通常使用提交表单(由form HTML元素表示)的方式来发送,且需要设置form元素的mothod属性为post。POST方式传送的数据量较大通常认为POST请求参数的大小不受限制,但往往取决于服务器的限制,POST请求传输的数据量总比GET传输的数据量大。而且POST方式发送的请求参数以及对应的值放在HTML HEADER中传输,用户不能在地址蓝里看到请求参数,安全性相对较高。
并不是每个表单域都会生成请求参数,而是有name属性的表单域才生成请求参数。关于表单域和请求参数的关系遵循如下4点:
(1)每个有name属性的表单域对应一个请求参数。
(2)如果有多个表单域有相同的name属性,则多个表单域只能生成一个请求参数,只是该参数有多个值。
(3)表单域的name属性指定请求参数名,value指定请求参数的值。
(4)如果表单域设置了disable="disabled"属性,则该表单域不再生成请求参数。
操作request范围的属性HttpServletRequest还包含如下两个方法,用于设置和获取request范围的属性。
// 将attValue设置成request范围的属性
setAttribute(String attName,Object attValue)
// 获取request范围的属性
Object getAttribute(String attName)
执行forward或include
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)
实例:获取部分请求头信息,如:请求方式、请求的资源名称、请求协议等
request对象_例1请求方式:
请求的资源:
请求用的协议:
请求的文件名:
请求的服务器的IP:
请求服务器的端口:
客户端IP地址:
客户端主机名:
表单提交来的值:
实例:使用表单提交参数,然后从request对象中获取参数
request对象_例2用户名:
密 码:
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) + "
");
}
}
%>
实例:获取表单里面所有的value
request对象_例3擅长:VC++
JAVA
DELPHI
VB
if(request.getParameter("qwe")!=null ){
for(int i=0;i
out.println("cb"+i+":"+request.getParameterValues("cb")[i]+"
");
}
out.println(request.getParameter("qwe"));
}
%>
实例:获取request的上下文路径
request主要方法调用示例request主要方法调用示例:
request.setAttribute("attr","Hello!");
out.println("attr属性的值为:"+request.getAttribute("attr")+"
");
out.println("上下文路径为:"+request.getContextPath()+"
");
out.println("Cookies:"+request.getCookies()+"
");
out.println("Host:"+request.getHeader("Host")+"
");
out.println("ServerName:"+request.getServerName()+"
");
out.println("ServerPort:"+request.getServerPort()+"
");
out.println("RemoteAddr:"+request.getRemoteAddr()+"
");
request.removeAttribute("attr");
out.println("属性移除操作以后attr属性的值为:"+request.getAttribute("attr")+"
");
%>