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

发布于:2022-12-22 ⋅ 阅读:(142) ⋅ 点赞:(0)

我们回忆如下所示: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

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

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

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

<%

    
    pageContext.setAttribute("name1","蕾峰编程总公司");
    request.setAttribute("name2","蕾峰编程分公司2号");
    session.setAttribute("name3","蕾峰编程分公司3号");
    application.setAttribute("name4","蕾峰编程分公司4号");
%>

</body>
</html>

我们进行分析如下:

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

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

 request.getParameter("");

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

 application.getResourceAsStream("");

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

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

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

<%
  //从pageContext取出,我们通过寻找的方式来
    Object name1 = pageContext.findAttribute("name1");

    pageContext.findAttribute("name2");
    pageContext.findAttribute("name3");
    pageContext.findAttribute("name4");
%>

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

代码如下所示:

<%
  //从pageContext取出,我们通过寻找的方式来
    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表达式进行输出  ${},ctrl+D为自动补全--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>

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

我们将name5的取出方式使用另一种如下所示:<h3><%=name5%></h3>

运行之后如下所示:

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

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

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

 

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--脚本片段中的代码,会被原封不动生成到.JSP.java
要求:这里面的代码:必须保证java语法的正确性
--%>
<%
    //从pageContext取出,我们通过寻找的方式来
    //从底层到高层(作用域):
    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表达式进行输出  ${},ctrl+D为自动补全--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
</body>
</html>

我们运行如下所示:

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

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

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

 我们进入源码如下所示:

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

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);
        }

    }

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

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

我们进入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;

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

我们进行设置如下所示:

<%
    pageContext.setAttribute("hello1","hello1",PageContext.SESSION_SCOPE);
    //
    session.setAttribute("hello1","hello1");
%>

这两个是相同的。

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

<%
    //从pageContext取出,我们通过寻找的方式来
    //从底层到高层(作用域):先从page->request->session->application,再找不到则会报null。
    //JVM:双亲委派机制:寻找一个类,先从所导的包里找,后从类加载器里找,后去rt.jar包里找,都找不到,则返回class not found。
    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");   //不存在
%>

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

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

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

 

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

 String s = new String();

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

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

import java.lang.String;

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

我们的测试类如下所示:

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

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    pageContext.forward("/index.jsp");  
%>

</body>
</html>

我们去实现到我们转发到我们所设计的index.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);  //servlet后台这样子去写
%>

</body>
</html>

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

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

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

<%
    pageContext.setAttribute("name1","蕾峰编程总公司");  //保存的数据只在一个页面中有效
    request.setAttribute("name2","蕾峰编程分公司2号");  //保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","蕾峰编程分公司3号");  //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","蕾峰编程分公司4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%--脚本片段中的代码,会被原封不动生成到.JSP.java
要求:这里面的代码:必须保证java语法的正确性
--%>
<%
  //从pageContext取出,我们通过寻找的方式来
    //从底层到高层(作用域):
    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");   //不存在
    pageContext.forward("/pageDemo02.jsp");
%>
<%--使用EL表达式进行输出  ${},ctrl+D为自动补全--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
</body>
</html>

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

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

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

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

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

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

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

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

本文含有隐藏内容,请 开通VIP 后查看