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点:
- 每个有name属性的表单域对应一个请求参数
- 如果有多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值
- 表单域的name属性指定请求参数名,valuie指定参数值
- 如果某个表单域设置了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¶m2=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字符串必须以斜线开头.