文章

jsp的域深入

首先,jsp有9大内置对象:9个内置对象就不用说,大家或多或少都使用过,但是,这些内置对象有其对应的作用范围,即作用域:发现作用域主要有4个:page,session,request,application:现在,我们就这4个域进行研究:首先第一步,写一个form表单,用于将数据传递到第二个页面:第二步,在第二个页面中,把获取的数据传入这个域所代表的对象中;第三部,进行page域的测试;第四部,进..._jsp将页面输入的数据放入安全域中

jsp的域深入

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/76151118
  • 发布时间:2017-07-26 16:05:33
  • 阅读量:438
  • 分类:java专栏收录该内容, 订阅专栏
  • 标签:#session, #jsp, #application, #request, #pageContext

摘要

文章浏览阅读438次。首先,jsp有9大内置对象:9个内置对象就不用说,大家或多或少都使用过,但是,这些内置对象有其对应的作用范围,即作用域:发现作用域主要有4个:page,session,request,application:现在,我们就这4个域进行研究:首先第一步,写一个form表单,用于将数据传递到第二个页面:第二步,在第二个页面中,把获取的数据传入这个域所代表的对象中;第三部,进行page域的测试;第四部,进…_jsp将页面输入的数据放入安全域中


首先,jsp有9大内置对象:

image

9个内置对象就不用说,大家或多或少都使用过,但是,这些内置对象有其对应的作用范围,即作用域:

image

发现作用域主要有4个:page,session,request,application:

image

image

image

image

现在,我们就这4个域进行研究:

首先第一步,写一个form表单,用于将数据传递到第二个页面:

第二步,在第二个页面中,把获取的数据传入这个域所代表的对象中;

第三部,进行page域的测试;

第四部,进行session域的测试;

第五步,进行request域的测试;

第六步,进行application域的测试。

第一步,先写一个form表单,用于获取数据:

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
35
36
37
38
39
40
41
42
43
44
45
<form method="post" action="JSP/second.jsp">
    	<table>
    		<tr>
    			<td>
    				<b>用户名:</b>
    			</td>
    			<td>
    				<input type="text" name = "user">
    			</td>
    		</tr>
    		<tr>
    			<td>
    				<b>密    码:</b>
    			</td>
    			<td>
    				<input type="password" name = "pswd">
    			</td>
    		</tr>
    		<tr>
    			<td>
    				<b>性    别:</b>
    			</td>
    			<td>
    				男<input type="radio" name = "sex" value="男" checked="checked">
    				女<input type="radio" name = "sex" value="女">
    			</td>
    		</tr>
    		<tr>
    			<td>
    				<b>年    龄:</b>
    			</td>
    			<td>
    				<input type="text" name = "age">
    			</td>
    		</tr>
    		<tr>
    			<td>
    				<input type="reset" value = "重置">
    			</td>
    			<td>
    				<input type="submit" value="提交">
    			</td>
    		</tr>
    	</table>
    </form>

效果如下:

image

第二步,在第二个页面中,把获取的值进行传入:

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
<%
String nameString = null;
String pswdString = null;
String sexString = null;
String ageString = null;
String nmString = request.getParameter("user");
String pdString = request.getParameter("pswd");
String sString = request.getParameter("sex");
String aString = request.getParameter("age");
nameString = new String(nmString.getBytes("ISO-8859-1"),"UTF-8");
pswdString = new String(pdString.getBytes("ISO-8859-1"),"UTF-8");
sexString = new String(sString.getBytes("ISO-8859-1"),"UTF-8");
ageString = new String(aString.getBytes("ISO-8859-1"),"UTF-8");	
session.setAttribute("name", nameString);
session.setAttribute("pswd", pswdString);
session.setAttribute("sex", sexString);
session.setAttribute("age", ageString);
request.setAttribute("name", nameString);
request.setAttribute("pswd", pswdString);
request.setAttribute("sex", sexString);
request.setAttribute("age", ageString);
pageContext.setAttribute("name", nameString);
pageContext.setAttribute("pswd", pswdString);
pageContext.setAttribute("sex", sexString);
pageContext.setAttribute("age", ageString);
application.setAttribute("name", nameString);
application.setAttribute("pswd", pswdString);
application.setAttribute("sex", sexString);
application.setAttribute("age", ageString);
%>

效果如下:

image

第三部,进行page域测试,发现,page域就是当前页面的作用范围:

所以,在当前页面对传入的值进行提取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
String namepageContextString = (String)pageContext.getAttribute("name");
String namesessionString = (String)session.getAttribute("name");
String namerequestString = (String)request.getAttribute("name");
String nameapplicationString = (String)application.getAttribute("name");
String pswdpageContextString = (String)pageContext.getAttribute("pswd");
String pswdsessionString = (String)session.getAttribute("pswd");
String pswdrequestString = (String)request.getAttribute("pswd");
String pswdapplicationString = (String)application.getAttribute("pswd");
String sexpageContextString = (String)pageContext.getAttribute("sex");
String sexsessionString = (String)session.getAttribute("sex");
String sexrequestString = (String)request.getAttribute("sex");
String sexapplicationString = (String)application.getAttribute("sex");
String agepageContextString = (String)pageContext.getAttribute("age");
String agesessionString = (String)session.getAttribute("age");
String agerequestString = (String)request.getAttribute("age");
String ageapplicationString = (String)application.getAttribute("age");
%>

效果如下:

image

发现所有的域对象都可以获取到值,说明,4大域在单个的页面内全部有效。

第四步,进行session测试,跳转到一个新的jsp页面,直接提取4大域对象的值:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>fourjsp page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  <%
  	String namepageContextString = (String)pageContext.getAttribute("name");
  	String namesessionString = (String)session.getAttribute("name");
  	String namerequestString = (String)request.getAttribute("name");
  	String nameapplicationString = (String)application.getAttribute("name");
  	String pswdpageContextString = (String)pageContext.getAttribute("pswd");
  	String pswdsessionString = (String)session.getAttribute("pswd");
  	String pswdrequestString = (String)request.getAttribute("pswd");
  	String pswdapplicationString = (String)application.getAttribute("pswd");
  	String sexpageContextString = (String)pageContext.getAttribute("sex");
  	String sexsessionString = (String)session.getAttribute("sex");
  	String sexrequestString = (String)request.getAttribute("sex");
  	String sexapplicationString = (String)application.getAttribute("sex");
  	String agepageContextString = (String)pageContext.getAttribute("age");
  	String agesessionString = (String)session.getAttribute("age");
  	String agerequestString = (String)request.getAttribute("age");
  	String ageapplicationString = (String)application.getAttribute("age");
   %>
    客户信息:<br>
    pageContext:<br>
    姓名:<%=namepageContextString %><br>
    密码:<%=pswdpageContextString %><br>
    性别:<%=sexpageContextString %><br>
    年龄:<%=agepageContextString %><br>
    session:<br>
    姓名:<%=namesessionString %><br>
    密码:<%=pswdsessionString %><br>
    性别:<%=sexsessionString %><br>
    年龄:<%=agesessionString %><br>
    request:<br>
    姓名:<%=namerequestString %><br>
    密码:<%=pswdrequestString %><br>
    性别:<%=sexrequestString %><br>
    年龄:<%=agerequestString %><br>
    application:<br>
    姓名:<%=nameapplicationString %><br>
    密码:<%=pswdapplicationString %><br>
    性别:<%=sexapplicationString %><br>
    年龄:<%=ageapplicationString %><br>
  </body>
</html>

效果如下:

image

发现page域对象和request域对象无法获取到值,说明,通过链接打开新的页面,导致request和page域失效,即page和request域的作用范围暂时是单个页面。

第五步,进行request域测试,在第二个页面中加入以下代码:

1
<jsp:forward page="/JSP/four.jsp"></jsp:forward>

然后,回到第一个信息输入页面:

进行数据输入:

image

点击提交:

image

发现page失效,但是request没有失效,而且,url是第二个页面的url,但是显示的页面是第四个页面,

在看看加入的代码,是一个jsp的动作转发:

image

所以,发现request域的范围>page,但是小于session和application域:

接下来我们测试session,发现session域的范围是一次会话,所以,我们关闭浏览器,直接输入第四个页面的url:

image

发现session的域对象失效,但是application域对象仍然有效,

到了这里,可以认为

page——-单个页面

request——–请求范围———url未变

session——–一次会话——–浏览器未关闭

application———一个项目周期———-服务器未关闭

到了这里,4大域的范围就全部清楚了。

本文由作者按照 CC BY 4.0 进行授权