作者:u014470581-----感谢原创,感谢作者!!
1、request对象是JSP中的重要对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象获取请求参数的重要途径。
2、另外request代表本次请求范围,所以还可以用于操作request范围的属性。
获取请求头/请求参数
1、web应用是请求/响应架构的应用,浏览器发出请求时通常会附带一些请求头,还可能包含一些请求参数发给服务器,服务端负责解析请求头/请求参数的就是JSP或Servlet,而JSP、Servlet取得请求参数的途径就是request。
2、request是HttpServletRequest接口的实例,它提供了如下方法:
String getParanmeter(String paramName):获取paramName请求参数的值
Map getParameterMap();获取所有请求参数名和参数值所组成的Map对象
Enumeration getParameterMap():获取所有请求参数名组成的Enumeration对象
String[] getParameterValues(String name);paramName请求参数的值,当请求参数有多个值时,该方法将返回对个值所组成的数组
3、HttpServletRequest提供如下方法来访问 请求头
String getHeader(String name );根据指定请求头的值
java.util.Enumeration<String> getHeaderNames(): 获得所有请求头的值
java.util.Enumeration<String> getHeaders(String name)获得指定请求头的多个值
int getIntHeader(String name):获取指定请求头的值,并将该值转为整数
<%@page contentType="text/html;charset=GBK" language="java" errorPage=""
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>11requestTest 收集参数的表单页</title>
</head>
<body>
<%out.println("this is a request test"); %>
<form id="form1" method="post" action="12request.jsp">
用户名:<br/>
<input type="text" name="name" ><hr/>
性别:<br/>
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female"><hr/>
喜欢的颜色:<br/>
红:<input type="checkbox" name="color" value="red">
绿:<input type="checkbox" name="color" value="green">
蓝:<input type="checkbox" name="color" value="blue"><hr/>
来自的国家<br/>
<select name="country">
<option value="中国">中国</option>
<option value="美国">美国</option>
<option value="俄罗斯">俄罗斯</option>
</select><hr/><br/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
在该页面中输入相应信息后,单击提交按钮,表单域所代表的请求参数将通过request对象的getParameter()方法取得
4、并不是每个表单域都会生成请求参数的,而是有name属性的表单域才生成请求参数。
关于表单域和请求参数的关系遵循如下4点:
①每个有name属性的表单域对应一个请求参数
②如果有多个表单域有相同的name属性,则 多个表单域只生成一个请求参数,只是该参数有多个值
③表单域的name属性 指定请求参数名,value指定请求参数值
④如果某个表单域设置了disable=“disabled”属性,则 该表单域不再生成请求参数
12request.jsp 代码如下
<%@page contentType="text/html;charset=GBK" language="java" errorPage="" %>
<%@page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHEML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-transitional1.dtd">
<html>
<head>
<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("gb2312");
String name = request.getParameter("name");
String gender = request.getParameter("gender");
String[] color = request.getParameterValues("color");
String national = request.getParameter("country");
%>
你的名字:<%=name %><hr/>
你的性别:<%=gender %><hr/>
你喜欢的颜色:<% for(String c:color){
out.println(c+" ");
}
%><hr/>
你的国家是:<%=national %>
</body>
</html>
页面显示:
host--->localhost:8080
connection--->keep-alive
content-length--->83
cache-control--->max-age=0
accept--->text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
origin--->http://localhost:8080
user-agent--->Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 TheWorld 6
content-type--->application/x-www-form-urlencoded
referer--->http://localhost:8080/20160427jspLearn/html/11requestTest.jsp
accept-encoding--->gzip,deflate,sdch
accept-language--->zh-CN,zh;q=0.8
cookie--->JSESSIONID=B3B27A382435E26B7F2307D56A67E419; COOKIE_SUPPORT=true; SCREEN_NAME=314d4a654258713359436b3d; GUEST_LANGUAGE_ID=zh_CN
你的名字:chdsjahkjl
你的性别:female
你喜欢的颜色:red green blue
你的国家是:中国
5、客户端发送请求有两种方式
①GET方式的请求:直接在浏览器地址栏输入访问地址发送的请求或提交表单发送请求,该表单对应的form元素没有设置method属性,或设置method属性为get,这几种请求都是GET方式的请求。GET方式的请求会将请求参数的名和值转换成字符串,并附加在原URL之后,因此可以在地址栏中看到请求参数名和值。且GET请求传送的数据小,一般不能大于2KB
② POST方式的请求:这种方式通常使用提交表单(由form HTML元素表示)的方式来发送,且需要设置from元素的method属性为post。post方式传送的数据较大,通常认为POST请求参数的大小不受限制,但往往取决于服务器的限制。而且POST方式传送的请求数据参数以及对应的值在HTML HEADER中传输,用户不能在地址栏里看到请求参数的值,安全性相对较高。
6.如果需要传递的参数是普通字符串,而且仅需传递少量参数,可以选择使用GET方式发送请求参数,GET方式发送的请求参数被附加到地址栏的URL之后,地址栏的URL将变成如下形式:
url?param1=value1¶m2=value2&...paramN=valueN:
URL和参数之间可以“?”分割,而多个参数之间以“&”分割。
<%@page contentType="text/html;charset=GBK" language="java" errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>
获取GET参数
</title>
</head>
<body>
<%String name=request.getParameter("name");
String gender=request.getParameter("gender");
%>
你的姓名:<%=name %><br/>
你的性别:<%=gender %><hr/>
</body>
</html>
7、request获取POST请求参数的代码和获取GET请求参数代码完全一样。向该页面发送请求时直接在地址栏里添加一些GET方式的请求参数。
8、如果请求参数中包含非西欧字符,获取这些参数比较复杂
<%@page contentType="text/html;charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional //EN
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>获取包含非西欧字符的GET请求参数</title>
</head>
<body>
<%
String rawQueryStr = request.getQueryString();
out.println("原始查询字符串为:" + rawQueryStr + "<hr/>");
String queryStr = java.net.URLDecoder.decode(rawQueryStr,"gbk");
out.println("解码后的查询字符串为:" + queryStr + "<hr/>");
String[] paramerters = queryStr.split("&");
for(String paramPair : paramerters){
out.println("每个请求参数名、值对为:" + paramPair + "<br/>");
String[] nameValue = paramPair.split("=");
out.println(nameValue[0] + "参数的值是:" + nameValue[1] + "<hr/>");
}
%>
</body>
</html>
页面显示结果
原始查询字符串为:name=%C9%B5%B4%F3%B8%F6&gender=female&color=red&country=%D6%D0%B9%FA
解码后的查询字符串为:name=傻大个&gender=female&color=red&country=中国
每个请求参数名、值对为:name=傻大个
name参数的值是:傻大个
每个请求参数名、值对为:gender=female
gender参数的值是:female
每个请求参数名、值对为:color=red
color参数的值是:red
每个请求参数名、值对为:country=中国
country参数的值是:中国
注:当获取GET请求里中文参数值得关键代码,为了获取GET请求里的中文参数值,必须借助于java.net.URLDecoder类 (URLDecoder URLEncoder)
// 另一种方法解析中文乱码
String rawname = request.getParameter("name");
out.println(rawname + "<br/>");
byte[] rawBytes = rawname.getBytes("ISO-8859-1");
String name = new String(rawBytes,"gb2312");
out.println(name + "<hr/>");
%>
9、操作request范围属性
HttpServletRequest还包括以下两个方法,用于设置获取request范围的属性
setAttribute(String attName,Object attValue) 将attValue设置成request范围的属性
Object getAttribute(String atName); 获取request范围的属性
当forward用户请求时,请求的参数和请求的属性不会丢失。
<%@page contentType="text/html;charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional.dtd">
<html>
<head>
<title>取钱表单页面</title>
</head>
<body>
<form method="post" action="16first.jsp">
取钱:<input type="text" name="balance">
<input type="submit" value="提交">
</form>
</body>
</html>
<%@page contentType="text/html; charset=GBK" language="java" errorPage=""%>
<%@page import= "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition.dtd"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>request 处理</title>
</head>
<body>
<%
String bal = request.getParameter("balance");
double qian = Double.parseDouble(bal);
if(qian < 500){
out.println("给你" + qian
+ "块");
out.println("账户减少" + qian);
}else{
List<String> info = new ArrayList<String>();
info.add("1111111");
info.add("2222222");
info.add("3333333");
request.setAttribute("info",info);
%>
<!-- 实现转发 -->
<jsp:forward page="17second.jsp"/>
<%}%>
</body>
</html>
<%@page contentType="text/html;charset=GBK" language="java" errorPage=""%>
<%@page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>request 处理</title>
</head>
<body>
<%
String bal = request.getParameter("balance");
double qian = Double.parseDouble(bal);
List<String> info = (List<String>) request.getAttribute("info");
for(String tmp:info){
out.println(tmp + "<br/>");
}
out.println("取钱" + qian + "块");
out.println("账户减少:" + qian);
%>
</body>
</html>
点击提交后页面显示结果
1111111
2222222
3333333
取钱500.0块 账户减少:500.0
当页面请求的钱数大于500,请求将被转发到17second.jsp页面处理,而且在 17second.jsp页面中可以获得balance请求参数值,也可以获得request范围的info属性,表明:forward用户请求时,请求参数和request范围的属性都不会丢失。即forward动作还原原来的请求,并未再次向服务器发送请求。
10、执行forward或include
request还有一个功能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令。 上面的forward是通过JSP提供的动作指令进行的,实际上request对象也可以执行forward。
HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是希望forward或者include的目的路径,该方法返回RequestDispatcher
该对象提供下面两个方法:
forward(ServletRequest request,ServletResponse response): 执行forward
include(ServletRequest resquest,ServletResponse response):执行include
注: 使用request 的getRequestDispatcher(String path)方法时,该方法path字符串必须以斜线