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
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=傻大个
注:当获取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字符串必须以斜线