request对象JSP学习

来源:互联网 发布:紧急通知网页域名升级 编辑:程序博客网 时间:2024/05/29 12:17

作者: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字符串必须以斜线



原创粉丝点击