Hello,大家好!今天给大家带来Java四个范围的内容及其特性,之前也有涉及到四个范围中的请求范围(request范围),但是我没有详细研究过这个范围的特性,下面我来给大家详细介绍。
一、四个范围名称
将四个范围从小到大排序:
1.页面范围(范围对象:pageContext)
2.请求范围(范围对象:request)
3.会话范围(范围对象:session)
4.应用程序范围(范围对象:application)
注意:我们这里使用的四个范围对象名是不成文的规定,他们是根据JSP编译源码中四个内置对象名而得的,如下图:
二、代码展示
1、第一个 servlet1
package com.ruide.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("我是servlet1");
request.setAttribute("reqkey","reqvalue");
System.out.println(request.getAttribute("reqkey"));
//会话范围是根据request对象获取的
HttpSession session=request.getSession();
session.setAttribute("sekey","sevalue");
System.out.println(session.getAttribute("sekey"));
//获取应用程序 application,因为jsp内置对象就叫application
ServletContext application=session.getServletContext();
application.setAttribute("apkey", "apvalue");
System.out.println(application.getAttribute("apkey"));
request.getRequestDispatcher("servlet2").forward(request, response);
/*RequestDispatcher disp=request.getRequestDispatcher("servlet2");
disp.forward(request,response);*/
}
}
2、第二个 servlet2
package com.ruide.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("我是servlet2");
System.out.println(request.getAttribute("reqkey"));
//会话范围是根据request对象获取的
HttpSession session=request.getSession();
System.out.println(session.getAttribute("sekey"));
//获取应用程序 application,因为jsp内置对象就叫application
ServletContext application=session.getServletContext();
System.out.println(application.getAttribute("apkey"));
request.getRequestDispatcher("servlet3").forward(request,response);
}
}
3、第三个 servlet3
package com.ruide.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("我是servlet3");
System.out.println(request.getAttribute("reqkey"));
//会话范围是根据request对象获取的
HttpSession session=request.getSession();
System.out.println(session.getAttribute("sekey"));
//获取应用程序 application,因为jsp内置对象就叫application
ServletContext application=session.getServletContext();
System.out.println(application.getAttribute("apkey"));
response.sendRedirect("index1.jsp");//请求断开
}
}
4、重定向到index1.jsp
<%@ 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>My JSP 'index1.jsp' starting 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>
应用程序范围中的值:<%=application.getAttribute("apkey") %><br/>
请求范围中的值:<%=request.getAttribute("reqkey") %><br/>
会话范围中的值:<%=session.getAttribute("sekey") %><br/>
<% pageContext.setAttribute("pc","Hello World"); %>
页面范围中的值:<%=pageContext.getAttribute("pc")%>
</body>
</html>
三、运行结果及其结论
1、第一个运行结果:
第一个结论:连续请求转发时候过滤器只执行一次,重定向时浏览器又发送一次请求,所以过滤器又执行了一次。
2、第二个运行结果:
第二个结论:页面范围只限制在页面中取值
3、第三个运行结果:
第三个结论:会话范围的生命周期,就是浏览器打开到浏览器关闭。
4、第四个运行结果:
第四个结论:应用程序范围的生命周期,就是服务器打开到服务器关闭(打开期间所有资源共享)。
五、学以致用
1.登录范围:会话范围-私有范围:只需要让当前用户知道。
2.群聊范围:应用程序范围:需要所有人都知道。