• JSP内置对象及作用域(三)


    我们回忆如下所示:Session是对应一个浏览器,从这个浏览器访问的页面session相同。而ServletContext对应这一个服务器,不同浏览器访问都是对应着同一个ServletContext。

    我们会把重要的文件放到WEB-INF文件夹下,因为这些文件是不可见的。同时把img,css,js,plugins等一些静态文件放到webapps文件夹下的static文件。

    1.1  九大内置对象

    (1)PageContext(页面的上下文)  (存东西)

    (2)Request    (存东西)

    (3)Response

    (4)Session   (存东西)

    (5)Application(ServletContext)存东西

    (6)config(ServletConfig)

    (7)out

    (8)page,不用了解

    (9)exception

    我们进行编写如下代码:这是可以存东西的四大对象:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%-- 内置对象--%>
    4. <%
    5. pageContext.setAttribute("name1","蕾峰编程总公司");
    6. request.setAttribute("name2","蕾峰编程分公司2号");
    7. session.setAttribute("name3","蕾峰编程分公司3号");
    8. application.setAttribute("name4","蕾峰编程分公司4号");
    9. %>

    我们进行分析如下:

    PageContext里面有个include方法,也能用这个方法来包含页面。forward方法也可以用来请求转发。getPage()得到当前的页面。

     通过request.getParameter("");来获取参数。

     request.getParameter("");

    通过application.getResourceAsStream("");来获取流资源

     application.getResourceAsStream("");

    我们也可以通过相同的方式进行取:

    1. <%
    2. pageContext.setAttribute("name1","蕾峰编程总公司");
    3. request.setAttribute("name2","蕾峰编程分公司2号");
    4. session.setAttribute("name3","蕾峰编程分公司3号");
    5. application.setAttribute("name4","蕾峰编程分公司4号");
    6. %>
    7. <%--脚本片段中的代码,会被原封不动生成到.JSP.java
    8. 要求:这里面的代码:必须保证java语法的正确性
    9. --%>
    10. <%
    11. //从pageContext取出
    12. pageContext.getAttribute("name1");
    13. request.getAttribute("name2");
    14. %>

    我们进行寻找设置的时候,如下所示:

    1. <%
    2. //从pageContext取出,我们通过寻找的方式来
    3. Object name1 = pageContext.findAttribute("name1");
    4. pageContext.findAttribute("name2");
    5. pageContext.findAttribute("name3");
    6. pageContext.findAttribute("name4");
    7. %>

    我们设置对象的时候,我们发现为Object,我们输入进去为Sting,我们将其改变为String,然后进行强制转换:

    代码如下所示:

    1. <%
    2. //从pageContext取出,我们通过寻找的方式来
    3. String name1= (String) pageContext.findAttribute("name1");
    4. String name2 = (String) pageContext.findAttribute("name2");
    5. String name3 = (String) pageContext.findAttribute("name3");
    6. String name4 = (String) pageContext.findAttribute("name4");
    7. String name5 = (String) pageContext.findAttribute("name5"); //不存在
    8. %>

    我们找到后需要进行输出:
    代码如下所示:

    1. <%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%>
    2. 取出的值为:

    3. ${name1}

    4. ${name2}

    5. ${name3}

    6. ${name4}

    7. ${name5}

    我们知道name5不存在,我们通过这种方式进行取的时候运行如下所示:

    我们将name5的取出方式使用另一种如下所示:

    <%=name5%>

    运行之后如下所示:

     我们再进行查看该四大存的对象:

    1. <%
    2. pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效
    3. request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
    4. session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    5. application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    6. %>

    我们利用画图来进行了解:

     

     我们创建一个新的jsp,(pageDemo02.jsp)看是否可以取到这些东西:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%--脚本片段中的代码,会被原封不动生成到.JSP.java
    4. 要求:这里面的代码:必须保证java语法的正确性
    5. --%>
    6. <%
    7. //从pageContext取出,我们通过寻找的方式来
    8. //从底层到高层(作用域):
    9. String name1= (String) pageContext.findAttribute("name1");
    10. String name2 = (String) pageContext.findAttribute("name2");
    11. String name3 = (String) pageContext.findAttribute("name3");
    12. String name4 = (String) pageContext.findAttribute("name4");
    13. String name5 = (String) pageContext.findAttribute("name5"); //不存在
    14. %>
    15. <%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%>
    16. 取出的值为:

    17. ${name1}

    18. ${name2}

    19. ${name3}

    20. ${name4}

    21. <%=name5%>

    我们运行如下所示:

    我们发现我们再 pageContext和request里面存储的无法获取到。而session和application里面的可以获取到。这是和作用域有关系的。因为会话没有关浏览器会话还在线,所以为每个用户创建session访问到了3.而4号是针对服务器,服务器没有关,所以可以访问到4号。

    与此同时我们发现pageContext.findAttribute("name1");我们是通过这种方式进行寻找的,那是否可以通过这种方式进行设置:pageContext.setAttribute

    我们新建pageDemo03进行判断他的设置的作用:

     我们进入源码如下所示:

     我们点击进去之后,如下所示:

    1. public void setAttribute(String name, Object attribute, int scope) {
    2. switch (scope) {
    3. case 1:
    4. this.mPage.put(name, attribute);
    5. break;
    6. case 2:
    7. this.mRequest.put(name, attribute);
    8. break;
    9. case 3:
    10. this.mSession.put(name, attribute);
    11. break;
    12. case 4:
    13. this.mApp.put(name, attribute);
    14. break;
    15. default:
    16. throw new IllegalArgumentException("Bad scope " + scope);
    17. }
    18. }

    我们了解到scope为作用域。我们进行存储如下:

    pageContext.setAttribute("hello1","hello1",PageContext);

    我们进入PageContext的源码进行查看:

    1. public static final int PAGE_SCOPE = 1;
    2. public static final int REQUEST_SCOPE = 2;
    3. public static final int SESSION_SCOPE = 3;
    4. public static final int APPLICATION_SCOPE = 4;

    我们发现有四个常量,为他的作用域的设置:

    我们进行设置如下所示:

    1. <%
    2. pageContext.setAttribute("hello1","hello1",PageContext.SESSION_SCOPE);
    3. //
    4. session.setAttribute("hello1","hello1");
    5. %>

    这两个是相同的。

    我们查看我们取寻找代码的设计:

    1. <%
    2. //从pageContext取出,我们通过寻找的方式来
    3. //从底层到高层(作用域):先从page->request->session->application,再找不到则会报null。
    4. //JVM:双亲委派机制:寻找一个类,先从所导的包里找,后从类加载器里找,后去rt.jar包里找,都找不到,则返回class not found。
    5. String name1= (String) pageContext.findAttribute("name1");
    6. String name2 = (String) pageContext.findAttribute("name2");
    7. String name3 = (String) pageContext.findAttribute("name3");
    8. String name4 = (String) pageContext.findAttribute("name4");
    9. String name5 = (String) pageContext.findAttribute("name5"); //不存在
    10. %>

    其中双亲委派机制如下所示:

    我们设立:java.lang,之后设立String类:

    我们设置test类的时候如下所示:

     

    我们new一个对象,如下所示:

     String s = new String();

     我们进入String类,我们发现该类并不是我们所设置的类:

     而是java自带的java.lang包。我们进行强制导入的时候,如下所示:
     

    import java.lang.String;

    我们进入该类的源码的时候,我们发现仍然是java自带的java.lang。

    我们的测试类如下所示:

    1. package java.lang;
    2. import java.lang.String;
    3. public class Test {
    4. public static void main(String []args){
    5. //当前我们所写的这个程序。程序里面有个string,他不会给string,而会给他的扩展类,
    6. // 扩展类没有string,而是继续往上走,到rt.jar包。rt.jar包里面有String,用的是这个String,而不是底层应用的String.
    7. String s = new String();
    8. }
    9. }

     我们继续进行下来pageContext.forward的应用:
    我们所设计的代码如下所示:命名为pageContextDemo03.jsp
     

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%
    4. pageContext.forward("/index.jsp");
    5. %>

    我们去实现到我们转发到我们所设计的index.jsp,

    我们点击运行如下所示:

    我们设计如下代码:
     

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%
    4. pageContext.forward("/index.jsp"); //前端跳转用这个就可以跳转
    5. //以上代码的原型为如下所示:
    6. request.getRequestDispatcher("/index.jsp").forward(request,response); //servlet后台这样子去写
    7. %>

     我们将pageContext.forward运用如下所示:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%-- 内置对象--%>
    4. <%
    5. pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效
    6. request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
    7. session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    8. application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    9. %>
    10. <%--脚本片段中的代码,会被原封不动生成到.JSP.java
    11. 要求:这里面的代码:必须保证java语法的正确性
    12. --%>
    13. <%
    14. //从pageContext取出,我们通过寻找的方式来
    15. //从底层到高层(作用域):
    16. String name1= (String) pageContext.findAttribute("name1");
    17. String name2 = (String) pageContext.findAttribute("name2");
    18. String name3 = (String) pageContext.findAttribute("name3");
    19. String name4 = (String) pageContext.findAttribute("name4");
    20. String name5 = (String) pageContext.findAttribute("name5"); //不存在
    21. pageContext.forward("/pageDemo02.jsp");
    22. %>
    23. <%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%>
    24. 取出的值为:

    25. ${name1}

    26. ${name2}

    27. ${name3}

    28. ${name4}

    29. <%=name5%>

     我们进行转发后,进入网址:http://localhost:9571/javaweb_jsp_war_exploded/PageContextDemo01.jsp

    url不变,但是我们所看到的页面是转发的pageDemo02.jsp的页面。

    但是我们访问pageDemo02的时候,页面仍然没有蕾峰编程分公司2号,因为请求还没有转发过来。

    我们进行查看四大作用域:

    1. pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效
    2. request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
    3. session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    4. application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器

     request:客户端向服务器发送请求,产生的数据用户看完就没用了,比如:新闻,用户看完没用的。

    session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车,我们进行浏览的时候还可以往购物车里面加,不需要往数据库里面放。

    application:客户端向服务器发送请求,产生的数据一个用户用完了,其他用户还可能使用,比如:聊天数据,

  • 相关阅读:
    了不起的爸爸
    面试官:什么是JIT、逃逸分析、锁消除、栈上分配和标量替换?
    各位同志,Android studio打不开,提示什么动态链接库
    [附源码]Python计算机毕业设计SSM临港新片区招商引资项目管理系统的设计与实现(程序+LW)
    [HDLBits] Exams/2014 q3fsm
    ES6 入门教程 23 Class 的继承 23.1 简介
    6.6 Elasticsearch(六)京淘项目改造
    大型网站系统架构演化实例_9.分布式服务
    【NodeJs-5天学习】第三天实战篇④ ——QQ机器人,实现自动回复、重要提醒
    Hadoop大数据实战笔记
  • 原文地址:https://blog.csdn.net/weixin_59448049/article/details/126788823