2.6.6 request对象 2. 操作request范围的属性

2. 操作request范围的属性

HttpServletRequest还包含如下两个方法,用于设置和获取request范围的属性。

设置获取request作用域的属性 描述
setAttribute(String attName, Object attValue) attValue设置成request范围的属性。
Object getAttribute(String attName) 获取request范围的属性

forward请求是 请求参数 请求属性不会丢失

forward用户请求时,请求的参数和请求属性都不会丢失。

draw.jsp

看如下JSP页面,这个JSP页面是个简单的表单页,用于提交用户请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> 取钱的表单页 </title>
</head>
<body>
<!-- 取钱的表单 -->
<form method="post" action="first.jsp">
取钱:<input type="text" name="balance">
<input type="submit" value="提交">
</form>
</body>
</html>

first.jsp

该页面向first.jsp页面请求后,balance参数将被提交到first.jsp页面,下面是first.jsp页面的实现代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<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对象
List<String> info = new ArrayList<String>();
info.add("1111111");
info.add("2222222");
info.add("3333333");
// 将info对象放入request范围内
request.setAttribute("info" , info);
%>
<!-- 实现转发 -->
<jsp:forward page="second.jsp"/>
<%}%>
</body>
</html>

first.jsp页面首先获取请求的取钱数,然后对请求的钱数进行判断。如果请求的钱数小于500,则允许直接取钱;否则将请求转发到second.jsp。转发之前,创建了一个List对象,并将该对象设置成request范围的info属性。

second.jsp

接下来在second.jsp页面中,不仅获取了请求的balance参数,而且还会获取request范围的info属性。second.jsp页面的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<title> request处理 </title>
</head>
<body>
<%
// 取出请求参数
String bal = request.getParameter("balance");
double qian = Double.parseDouble(bal);
// 取出request范围内的info属性
List<String> info = (List<String>)request.getAttribute("info");
for (String tmp : info)
{
out.println(tmp + "<br/>");
}
out.println("取钱" + qian + "块");
out.println("账户减少" + qian);
%>
</body>
</html>

如果页面请求的钱数大于500,请求将被转发到second.jsp页面处理,而且在second.jsp页面中可以获取到balance请求参数值,也可获取到request范围的info属性,这表明:forward用户请求时,请求参数和request范围的属性都不会丢失,即forward后还是原来的请求,并未再次向服务器发送请求

如果请求取钱的钱数为654,则页面的执行效果如图2.28所示。