九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【ServletContext】存东西
- config 【ServletConfig】
- out
- page,不用了解
- exception,和java异常一样
常用作用域
- request:客户端向服务端发送的请求,产生的数据,用户看完就没用了,比如新闻,用户看完没用的!
- session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
- aplication:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
共享数据
pageContextDemo01.jsp
<%@ 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// 双亲委派机制:原理也是差不多Stringname1=(String)pageContext.findAttribute("name1");Stringname2=(String)pageContext.findAttribute("name2");Stringname3=(String)pageContext.findAttribute("name3");Stringname4=(String)pageContext.findAttribute("name4");Stringname5=(String)pageContext.findAttribute("name5");%><%--使用EL表达式输出 ${}--%><h1>${name1}</h1><h1>${name2}</h1><h1>${name3}</h1><h1>${name4}</h1><h1><%=name5%></h1></body></html>pagedemo02.jsp
<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body><%// 从pageContext去除,我们通过寻找的方式来// 从底层到高蹭(作用域):pageContext -> request -> session -> application// 双亲委派机制:原理也是差不多Stringname1=(String)pageContext.findAttribute("name1");Stringname2=(String)pageContext.findAttribute("name2");Stringname3=(String)pageContext.findAttribute("name3");Stringname4=(String)pageContext.findAttribute("name4");Stringname5=(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
<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body><%--PageContext类:publicstaticfinalintPAGE_SCOPE=1;publicstaticfinalintREQUEST_SCOPE=2;publicstaticfinalintSESSION_SCOPE=3;publicstaticfinalintAPPLICATION_SCOPE=4;//scope:作用域publicvoidsetAttribute(Stringname,Objectattribute,intscope){switch(scope){case1:this.mPage.put(name,attribute);break;case2:this.mRequest.put(name,attribute);break;case3:this.mSession.put(name,attribute);break;case4:this.mApp.put(name,attribute);break;default:thrownewIllegalArgumentException("Bad scope "+scope);}}--%><%pageContext.setAttribute("hello1","hello1",PageContext.SESSION_SCOPE);//session.setAttribute("hello1","hello1"); 这个等价于上一行的代码%></body></html>转发
<%pageContext.forward("/index.jsp");%>pageContextDemo03.jsp
<%@ 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
packagejava.lang;publicclassString{publicvoidtest(){System.out.println("String");}}java.lang.Test
packagejava.lang;importjava.lang.String;publicclassTest{// 从上加载,从下寻找//RT.jar//扩展类//应用publicstaticvoidmain(String[]args){Strings=newString();}}Ctrl+右键查看类
可以发现加载的类并不是我们自己写的应用类,而是加载到了本身源码包写好的类中
双亲委派机制只会加载一个类,加载的顺序从上往下加载,寻找可以加载的类加载器是从下往上寻找。