JSP中提供了四个域属性空间:page(页面作用域)、request(请求作用域)、session会话作用域、application(应用程序作用域)。
1、page域:
page域作用范围:当前页面,即只在一个jsp页面中有效。当页面跳转时,属性就失效了。
page和pageContext区别:
page:对象是当前页面转换后的Servlet类的实例,是Object对象,在JSP页面中,很少使用page对象。
pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面的上下文,可以访问该页面中的共享数据,能够调用、存取其他隐含对象。
例子:
编辑index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//设置page域属性
pageContext.setAttribute("user", "zhangsan");
%>
<%
//获取page域属性
//主要这里getAttribute()返回的是Object对象,需要强转
String user = (String)pageContext.getAttribute("user");
out.print("user = " + user);
%>
</body>
</html>
index.jsp运行结果:
编辑index2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//尝试获取index.jsp中的user属性值,如果为null则无法获取
String user = (String)pageContext.getAttribute("user");
out.print("user = " + user);
%>
</body>
</html>
2、request(请求作用域):
request:http发出请求到服务器返回响应的全过程,在这个过程中使用forward方式跳转多个jsp,在这些页面里都可以使用该域中的变量。一旦客户端刷新浏览器,重新发起请求,则之前的请求参数和属性都将失效。
例子:
编辑index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index page<br>
<%
//设置page域属性
request.setAttribute("user", "zhangsan");
request.getRequestDispatcher("index2.jsp").forward(request, response);
%>
</body>
</html>
编辑index2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index2 page<br>
<%
//尝试获取index.jsp中的user属性值,如果为null则无法获取
String user = (String)request.getAttribute("user");
out.print("user = " + user);
%>
</body>
</html>
运行结果:
当我们在服务器响应结束后,之间访问index2.jsp是结果为空
3、session(会话作用域)
session:当前会话中,即浏览器打开到浏览器关闭的整个过程(默认时间为30分钟,可以设置,也可使用invalidate()方法强制结束)。
例子
编辑index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index page<br>
<%
//设置page域属性
session.setAttribute("user", "zhangsan");
%>
</body>
</html>
编辑index2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index2 page<br>
<%
//尝试获取index.jsp中的user属性值,如果为null则无法获取
String user = (String)session.getAttribute("user");
out.print("user = " + user);
%>
</body>
</html>
首先我们直接访问index.jsp
然后我们直接访问index2.jsp
当我们将index.jsp改为
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index page<br>
<%
//设置page域属性
session.setAttribute("user", "zhangsan");
session.invalidate();
%>
</body>
</html>
再次访问index.jsp,之后再访问index2.jsp结果如下
4、application(应用程序作用域)
application:服务器一开始执行服务,到服务器关闭为止。它的有效范围是整个应用。 这里的整个应用是指应用启动到应用结束之间(服务器为关闭时)。当服务器关闭时,才会被清空。
例子
编写index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index page<br>
<%
//设置page域属性
application.setAttribute("user", "zhangsan");
%>
</body>
</html>
编写index2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index2 page<br>
<%
//尝试获取index.jsp中的user属性值,如果为null则无法获取
String user = (String)application.getAttribute("user");
out.print("user = " + user);
%>
</body>
</html>
先访问index.jsp,在访问index2.jsp
重启服务器,访问index2.jsp
此时application域中user属性已被清空。