JSP脚本中的9个内置对象---06 request对象

原创 2017年01月03日 13:42:27

request对象是获取请求参数的重要途径.

每个request对象封装着一次用户请求,所有的请求参数都被封装在requset对象中.request可代表本次请求范围,可用于操作request范围的属性.

1 .  获取请求头/请求参数

web 应用是请求/响应架构的应用,浏览器发送请求时通常附带请求头,或者包含请求参数发送给服务器,服务器负责解析参数的就是jsp或者Servlet.

request是HttpServletRequest接口的实例,

提供以下方法用来获取请求参数:

  • String getParameeter(String paramName); 获取parameter请求参数的值
  • Map getParameterMap(); 获取所有的请求参数名和参数值所组成的Map对象
  • Enumeration getParameterNames();获取所有请求参数名组成的Enumeration对象
  • String[ ]  getParameterValues(String name);   paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组


HttpServletRequest提供以下方法来访问请求头.

  • String getHeader(String name);根据指定请求头的值
  • java.util.Enumeration<String>getHeaderNames();获取所有请求头的名称
  • java.util.Enumeration<String>getHeaders(String name);获取指定请求头的多个值
  • int getIntHeader(String name);获取指定请求头的值,并将该值转换为整形值


请求头和请求参数都是由用户发送到服务器的数据,

区别在于请求头通常由浏览器自动添加,因此一次请求总是包含若干请求头,

请求参数通常需要开发人员控制添加,让客户端发送请求参数通常分为两种情况:

  • GET方式请求:

    直接在地址栏输入访问地址所发送的请求或提交表单发送请求时,该表单对应的from元素没有设置method属性,或设置method属性是get,则请求都是get方式的请求.

    get方式的请求会将请求参数的名和值转换为字符串,并附加在原URL之后,因此可以在地址栏中看到请求参数的名和值.

    get请求传送数据的数据量较小(一般不大于2KB)

  • POST方式请求:

  使用提交表单(由formHTML元素表示)的方式发送,需要设置form元素的method属性为post.

  post方式传送的数据量较大,通常认为POST请求参数大小不受限制,但往往取决于服务器的限制.

  post方式发送请求的请求参数以及对应的值放在HTML HEADER中传输,安全性相对较高


例: 下面的表单页向 request1.jsp页面发送请求

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单页</title>
</head>
<body>
	<form id="form1" action="request1.jsp" method="post">
		用户名:<input type="text" name="name"><br /> 
		性别:<br /> 
		男:<input type="radio" name="gender" value="男"><br /> 
		女:<input type="radio" name="gender" value="女"><br /> 
		喜欢的颜色:<br /> 
		白:<input type="checkbox" name="color" value="白"> 
		黑:<input type="checkbox" name="color" value="黑"><br /> 
		国家: <select name="country">
			   	<option value="中国">中国</option>
				<option value="美国">美国</option>
			</select><br /> 
		<input type="submit" value="OK"> 
		<input type="reset" value="重置">
	</form>
</body>
</html>

有name的属性的表单域才生成请求参数.关于表单域和请求参数的关系遵循如下4点:

  1. 每个有name属性的表单域对应一个请求参数
  2. 如果有多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值
  3. 表单域的name属性指定请求参数名,valuie指定参数值
  4. 如果某个表单域设置了disabled="disabled"属性,则表单域不再生成请求参数.


例:    request1.jsp

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取请求头/请求参数</title>
</head>
<body>
	<%
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();
			out.println(headerName + ": " + request.getHeader(headerName) + "<br/>");
		}
		out.println("<hr/>");
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String[] color = request.getParameterValues("color");
		String national = request.getParameter("country");
	%>
	名字:<%=name%><br /> 
	性别:<%=gender%><br /> 
	颜色:<%
		for (String c : color) {
			out.println(c + "");
		}
	%><br /> 
	国家:<%=national%>
</body>
</html>


上面代码示范如何获取请求头,请求参数,

在获取表单域对应的请求参数值之前,先设置request编码的字符集

如果POST请求的请求参数里包含非西欧字符,则必须在获取请求参数之前调用 setCharacterEncoding()方法设置编码的字符集.



如果需要传递的参数是普通字符串,而且仅需传递少量参数,可以选择使用GET方式发送请求参数.

GET方式发送的请求参数被附加到地址栏的URL后,地址栏的URL将变成如下形式:

url?param1=value&param2=value2&....

URL和参数之间以  "?"  分割,   多个参数之间以 "&" 分割


<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取GET请求参数</title>
</head>
<body>
	<%
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
	%>
	名字:<%=name%><br /> 性别:<%=gender%>
</body>
</html>

request获取POST请求参数的代码和获取GET请求参数代码相同.


如果GET方式的请求参数值里包含非西欧字符,可以借助java.net.URLDecoder类;

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取包含非西欧字符的get请求参数</title>
</head>
<body>
	<%
		String rawQyeryStr = request.getQueryString();
		out.println("原始查询字符串:" + rawQyeryStr + "<hr />");
		String queryStr = URLDecoder.decode(rawQyeryStr, "UTF-8");
		out.println("解码后的字符串:" + queryStr + "<hr />");
		String[] paramPairs = queryStr.split("&");
		for (String paramPair : paramPairs) {
			out.println("参数名,值为:" + paramPair + "<br />");
			String[] nameValue = paramPair.split("=");
			out.println(nameValue[0] + "参数的值是:" + nameValue[1] + "<hr/>");
		}
	%>

</body>
</html>


另外一种方法是在获取请求参数值之后,对请求参数值重新编码,

先将其转换成字节数组,再将字节数组重新解码成字符串

                String rawName = request.getParameter("name");
		byte[] rawBytes = rawName.getBytes("ISO-8859-1");
		String name = new String(rawBytes, "UTF-8");


2.操作request范围的属性

HttpServletRequest包含两个方法用于设置和获取request范围的属性:

  • setAttribute(String attName,Object attValue);将attValue设置成request范围的属性
  • Object getAttribute(String attName);获取request范围的属性

当forward用户请求时,请求的参数和请求属性都不会丢失.

3 执行forward或include

request可以执行forward和include,代替JSP所提供的forward和include动作指令.

HttpServletRequest类提供一个方法 :getRequestDispatcher(String path);

其中path是forward 或 include的目标路径.

该方法返回RequestDispatcher 对象,该对象提供两个方法:

  • forward(ServletRequest request,ServletResponse response);  执行forward
  • include(ServletRequest request,ServletResponse response);  执行include


getRequestDispatcher("/a.jsp").forward(request,response); 将请求forward到a.jsp页面

getRequestDispatcher("/a.jsp").include(request,response); 将a.jsp页面include本页面


使用request的getRequestDispatcher(String path)方法时,该path字符串必须以斜线开头.



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JSP学习笔记三之response对象和request对象

接着上一篇,我们接着讲JSP中的内置隐式对象。这篇博客介绍的是request和response对象。 A. request对象      request对象是javax.servlet...

JSP内置对象request的方法的使用

/* request是jsp的内置对象 与 HttpServletRequest类相关  实现了 javax.servlet.ServletRequest接口  用来处理用户提交的数据   *...

JSP 内置对象request常见用法

1、访问请求参数 传递参数 login.jsp关键 代码 说明:如果指定的参数不存在,将返回null;如果指定了参数名,但未指定参数值,将返回空的字符串"。 因为所有的req...

JSP内置对象(一)——request对象

request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。 客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据,然后通过request对象的相关方法来获取这些...
  • cq1982
  • cq1982
  • 2015年02月28日 12:53
  • 584

request对象JSP学习

1、request对象是JSP中的重要对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象获取请求参数的重要途径。 2、另外requ...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP脚本中的9个内置对象---06 request对象
举报原因:
原因补充:

(最多只允许输入30个字)