九大内置对象
- 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+右键查看类

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

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