四个范围代码详解

Hello,大家好!今天给大家带来Java四个范围的内容及其特性,之前也有涉及到四个范围中的请求范围(request范围),但是我没有详细研究过这个范围的特性,下面我来给大家详细介绍。

一、四个范围名称

将四个范围从小到大排序:
1.页面范围(范围对象:pageContext)
2.请求范围(范围对象:request)
3.会话范围(范围对象:session)
4.应用程序范围(范围对象:application)
注意:我们这里使用的四个范围对象名是不成文的规定,他们是根据JSP编译源码中四个内置对象名而得的,如下图:
路径
jsp编译类
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.群聊范围:应用程序范围:需要所有人都知道。

点击获取源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值