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

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字符串必须以斜线开头.



猜你喜欢

转载自blog.csdn.net/sjbzl/article/details/53993739