JSP内置对象及作用域&双亲委派机制

九大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application 【ServletContext】存东西
  • config 【ServletConfig】
  • out
  • page,不用了解
  • exception,和java异常一样

常用作用域

  • request:客户端向服务端发送的请求,产生的数据,用户看完就没用了,比如新闻,用户看完没用的!
  • session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
  • aplication:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

共享数据

pageContextDemo01.jsp

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>

<%
  pageContext.setAttribute("name1","张三1"); //保存的数据只在一个页面有效
  request.setAttribute("name2","张三2"); //保存到数据只在一次请求中有效,请求转发会携带这个数据
  session.setAttribute("name3","张三3"); //session中保存的数据,只在一次会话中有效,打开浏览器到浏览器关闭,数据就会消失
  application.setAttribute("name4","张三4"); //application中保存的数据,只在一个服务器中有效,打开服务器到服务器关闭,数据就会消失
%>

<%--脚本片段中的怠慢,会被原封不动的生成到.JS.java
要求:这里面的代码:必须保证Java语法的正确性
--%>

<%
  // 从pageContext去除,我们通过寻找的方式来
  // 从底层到高蹭(作用域):pageContext -> request -> session -> application
  // 双亲委派机制:原理也是差不多
  String name1 = (String) pageContext.findAttribute("name1");
  String name2 = (String) pageContext.findAttribute("name2");
  String name3 = (String) pageContext.findAttribute("name3");
  String name4 = (String) pageContext.findAttribute("name4");
  String name5 = (String) pageContext.findAttribute("name5");
%>

<%--使用EL表达式输出  ${} --%>
  <h1> ${name1}</h1>
  <h1> ${name2}</h1>
  <h1> ${name3}</h1>
  <h1> ${name4}</h1>
  <h1><%=name5%></h1>

</body>
</html>

pagedemo02.jsp

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>


<%
    // 从pageContext去除,我们通过寻找的方式来
    // 从底层到高蹭(作用域):pageContext -> request -> session -> application
    // 双亲委派机制:原理也是差不多
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");
%>

<%--使用EL表达式输出  ${} --%>
<h1> ${name1}</h1>
<h1> ${name2}</h1>
<h1> ${name3}</h1>
<h1> ${name4}</h1>
<h1><%=name5%></h1>

</body>
</html>

可以发现访问pagedemo02的时候只可以获取session和application的内容

PageContext

作用域

pagedemo03.jsp

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--
    PageContext类:
    public static final int PAGE_SCOPE = 1;
    public static final int REQUEST_SCOPE = 2;
    public static final int SESSION_SCOPE = 3;
    public static final int APPLICATION_SCOPE = 4;
    //scope:作用域
public void setAttribute(String name, Object attribute, int scope) {
        switch (scope) {
            case 1:
                this.mPage.put(name, attribute);
                break;
            case 2:
                this.mRequest.put(name, attribute);
                break;
            case 3:
                this.mSession.put(name, attribute);
                break;
            case 4:
                this.mApp.put(name, attribute);
                break;
            default:
                throw new IllegalArgumentException("Bad scope " + scope);
        }

    }

--%>


<%
    pageContext.setAttribute("hello1","hello1",PageContext.SESSION_SCOPE);
    //session.setAttribute("hello1","hello1"); 这个等价于上一行的代码
%>

</body>
</html>

转发

java 复制代码
<%
  pageContext.forward("/index.jsp");
%>

pageContextDemo03.jsp

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
  pageContext.forward("/index.jsp");
//request.getRequestDispatcher("/index.jsp").forward(request,response); 等价于上面那行
%>


</body>
</html>

双亲委派机制

原理

java.lang.String

java 复制代码
package java.lang;

public class String {
    public void test(){
        System.out.println("String");
    }
}

java.lang.Test

java 复制代码
package java.lang;
import java.lang.String;

public class Test {

//    从上加载,从下寻找
    //RT.jar
    //扩展类
    //应用

    public static void main(String[] args) {
        String s = new String();

    }
}

Ctrl+右键查看类

可以发现加载的类并不是我们自己写的应用类,而是加载到了本身源码包写好的类中

双亲委派机制只会加载一个类,加载的顺序从上往下加载,寻找可以加载的类加载器是从下往上寻找。

相关推荐
骄马之死3 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
sbjdhjd3 小时前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
乐兮创想 小林4 小时前
企业官网移动端性能优化实战:从 Core Web Vitals 到图片/CDN/响应式的工程清单
前端·性能优化·网站建设·北京网站建设公司
小红卒4 小时前
mysql之udf提权
数据库·mysql·网络安全
前端一小卒4 小时前
不手写代码的第 30 天,我才明白前端这个岗位还剩什么
前端·javascript·ai编程
Ajie'Blog4 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
郑洁文5 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
老毛肚5 小时前
jeecgboot vue TS & 模板化 04
前端·javascript·vue.js
螺丝钉code5 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
AI_零食6 小时前
鸿蒙PC Electron跨平台应用开发:24时区时间表应用详解
前端·华为·electron·开源·harmonyos·鸿蒙