JSP第二篇【內置對象的介紹、4種屬性範圍、應用場景】

来源:https://www.cnblogs.com/Java3y/archive/2018/02/05/8419398.html
-Advertisement-
Play Games

什麼是JSP內置對象 JSP引擎在調用JSP對應的jspServlet時, 會傳遞或創建9個與web開發相關的對象供jspServlet使用 。JSP技術的設計者為便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變數, 開發人員在JSP頁面中通過這些變數就可以快速獲得這9 ...


什麼是JSP內置對象

JSP引擎在調用JSP對應的jspServlet時,會傳遞或創建9個與web開發相關的對象供jspServlet使用。JSP技術的設計者為便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變數,開發人員在JSP頁面中通過這些變數就可以快速獲得這9大對象的引用

細心的朋友會發現,我們沒有在JSP頁面上定義過out對象,卻可以直接使用!其實out對象就是JSP內置對象之一

九個內置對象:

  • pageContext
  • page
  • config
  • request
  • response
  • session
  • application
  • exception
  • out

out對象

out對象的API

  • int getBufferSize()【得到緩存大小】
  • int getRemaining()【得到未使用緩存的大小】
  • boolean isAutoFlush()
  • void println()
  • void flush()
  • void close()
  • void clearBuffer()
  • void clear()

  • out對象用於向瀏覽器輸出數據,與之對應的是Servlet的PrintWriter對象。然而這個out對象的類型並不是PrintWriter,是JspWriter

  • 我們可以簡單理解為:JspWriter就是帶緩存的PrintWrieter

  • out對象的原理如下:

  • 只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用ServletResponse.getWriter方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中
    • 設置page指令的buffer屬性關閉了out對象的緩存功能
    • out對象的緩衝區已滿
    • 整個JSP頁面結束
  • 一般我們在JSP頁面輸出都是用表達式(<%=%>),所以out對象用得並不是很多

request

  • 內置對象request其實就是HttpServletRequest,在Servlet講解的時候已經詳細說明瞭,沒什麼好說的

response

  • 內置對象response其實就是HttpServletResponse,在Servlet講解的時候已經詳細說明瞭,沒什麼好說的

config

  • 內置對象config其實就是ServletConfig,在Servlet講解的時候已經詳細說明瞭,沒什麼好說的

session

  • 內置對象session其實就是HttpSession。,在Servlet講解的時候已經詳細說明瞭,沒什麼好說的

註意:在page指令配置如下信息,session將不可使用


    <%@page session="false" %>

application

  • 內置對象application其實就是ServletContext對象,在Servlet講解的時候已經詳細說明瞭,沒什麼好說的

page

  • 內置對象page是HttpJasPage對象,其實page對象代表的就是當前JSP頁面,是當前JSP編譯後的Servlet類的對象。也就是說:page對象相當於普通java類的this

exception

  • 內置對象exception是java.lang.Exception類的對象,exception封裝了JSP頁面拋出的異常信息。exception經常被用來處理錯誤頁面

  • 前面我們已經講過了怎麼設置錯誤頁面了,下麵我們就來簡單使用一下exception對象吧

  • 1.jsp頁面
    ```JSP

    <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>

    <%--模擬空指針異常的錯誤--%><% String sss = null; sss.length();%>

```

  • error.jsp頁面


    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
    
    <html>
    <head>
        <title>錯誤頁面</title>
    </head>
    <body>
    
    <%
        out.println("程式拋出了異常:" + exception);
    %>
    
    </body>
    </html>
  • 效果:

pageContext

pageContext是內置對象中最重要的一個對象,它代表著JSP頁面編譯後的內容(也就是JSP頁面的運行環境)!

pageContext獲取8個內置對象

  • 既然它代表了JSP頁面編譯後的內容,理所當然的:它封裝了對其他8大內置對象的引用!,也就是說,通過pageContext可以獲取到其他的8個內置對象!

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>獲取八大內置對象</title>
    </head>
    <body>
    <%
    
        System.out.println(pageContext.getSession());
        System.out.println(pageContext.getRequest());
        System.out.println(pageContext.getResponse());
    
        System.out.println(pageContext.getException());
    
        System.out.println(pageContext.getPage());
        System.out.println(pageContext.getServletConfig());
        System.out.println(pageContext.getServletContext());
        System.out.println(pageContext.getOut());
    
    %>
    
    </body>
    </html>
  • 看下效果:

pageContext作為域對象

  • 類似於request,session,ServletContext作為域對象而言都有以下三個方法
    • setAttribute(String name,Objcet o)
    • getAttribute(String name)
    • removeAttribute(String name)
  • 當然了,pageContext也不例外,pageContext也有這三個方法

  • pageContext本質上代表的是當前JSP頁面編譯後的內容,作為域對象而言,它就代表著當前JSP頁面(也就是page)!也就是說:pageContext域對象只在page範圍內有效,超出了page範圍就無效了

  • 首先來看看在page範圍內能不能使用


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>使用page域對象</title>
    </head>
    <body>
    <%
        pageContext.setAttribute("name", "zhongfucheng");
    %>
    <%
        String value = (String) pageContext.getAttribute("name");
        System.out.println(value);
    %>
    
    </body>
    </html>
  • 效果如下:

  • 我們現在來試驗一下是不是超出了page範圍就無效了!

  • 在2.jsp中request域對象設置屬性


    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>request域對象設置屬性</title>
    </head>
    <body>
    <%
        //這是request域對象保存的內容
        request.setAttribute("name","zhongfucheng");
    %>

    <%--跳轉到1.jsp中--%>

    <jsp:forward page="1.jsp"/>
    
    </body>
    </html>
  • 企圖在1.jsp中pageContext取出request存進去的屬性

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>在page域對象獲取屬性</title>
    </head>
    <body>
    
    <%
        //企圖獲取request域對象存進的屬性
        String value = (String) pageContext.getAttribute("name");
        System.out.println(value);
    %>
    
    </body>
    </html>
  • 效果如下:


  • pageContext本質上代表著編譯後JSP的內容,pageContext還可以封裝了訪問其他域的方法

  • 上面的pageContext預設是page範圍的但pageContext對象重載了set、get、removeAttribute這三個方法
    • getAttribute(String name,int scope)
    • setAttribute(String name,Object value,int scope)
    • removeAttribute(String name,int scope)
  • 多了一個設置域範圍的一個參數,如果不指定預設就是page。當然了,pageContext把request、session、application、page這幾個域對象封裝著了靜態變數供我們使用
    • PageContext.APPLICATION_SCOPE
    • PageContext.SESSION_SCOPE
    • PageContext.REQUEST_SCOPE
    • PageContext.PAGE_SCOPE
  • 剛纔我們沒有使用重載方法的時候,使用pageContext是無法獲取到request域對象設置的屬性的。現在我們使用重載後的方法看一下能不能獲取得到


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>在page域對象獲取request域對象的屬性</title>
    </head>
    <body>
    
    <%
        //使用重載的方法獲取request域對象的屬性
        String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
        System.out.println(value);
    %>
    
    </body>
    </html>
  • 效果:


  • pageContexst還有這麼一個方法:
    • findAttribute(String name)
  • 該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。這個是EL表達式的原理!,EL表達式後面會講到!

  • 我們用此方法看能不能查找出request域對象的屬性吧!


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>使用findAttribute</title>
    </head>
    <body>
    
    <%
    
        //使用findAttribute查找2.jsp中request域對象的屬性
        String value = (String) pageContext.findAttribute("name");
        System.out.println(value);
    %>
    
    </body>
    </html>
  • 效果如下:


引入和跳轉

PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法

  • pageContext.forward(String url)
  • pageContext.include(String url)


4種屬性範圍

到目前為止,我們已經學了4種屬性範圍了。

  1. page【只在一個頁面中保存屬性,跳轉頁面無效】
  2. requet【只在一次請求中保存屬性,伺服器跳轉有效,瀏覽器跳轉無效】
  3. session【在一個會話範圍中保存屬性,無論何種跳轉均有效,關閉瀏覽器後無效】
  4. application【在整個伺服器中保存,所有用戶都可以使用】

  • 4個內置對象都支持以下的方法:
  1. setAttribute(String name, Object o )
  2. getAttribute(String name)
  3. removeAttribute(String name)

應用場景

  1. request:如果客戶向伺服器發請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬於用戶看完就沒用的
  2. session:如果客戶向伺服器發請求,產生的數據,用戶用完了等一會兒還有用,像這樣的數據就存在session域中,像購物數據,用戶需要看到自己購物信息,並且等一會兒,還要用這個購物數據結帳
  3. servletContext:如果客戶向伺服器發請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在servletContext域中,像聊天數據

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關註微信公眾號:Java3y


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 匿名函數指一類無須定義標識符的函數或子程式。Python用lambda語法定義匿名函數,只需用表達式而無需申明。lambda語法的定義如下: 有些時候,當我們在傳入函數時,不需要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是只能有一個表達式,無需寫return,返回值就是該表達式的結 ...
  • 前言:認為方法與函數同意義,由於這裡使用method,所以稱為方法 靜態方法: 使用@staticmethod來定義靜態方法。 靜態方法:類和實例都可以調用的方法,實際上跟類沒什麼關係了,對於這種不太相關的就使用靜態方法【用實例和類調用沒有區別】 class Dog(object): def __i... ...
  • 淘寶的頁面大量使用了js載入數據,所以採用selenium來進行爬取更為簡單,selenum作為一個測試工具,主要配合無視窗瀏覽器phantomjs來使用。 ...
  • 花了一個星期,總算把這一道該死的毒瘤題做完了。 這道題有很多種解法,我是用優先隊列+主席樹。 首先每一個區間的和,可以表示為兩個首碼和之差。 我們顯然可以知道,每一次找到的那個最大值必然在以一個點為最後一個點的區間之內。 所以我們可以把每一個點為最後一個點的最大值的區間求出來,先打入隊列。 然後每一 ...
  • 1、簡介 在PHP中這門語言中,因為是弱類型語言,因此使用變數時不需提前定義即可使用。 我們在使用php進行開發的時候,大多數使用雙引號、單引號進行定義字元串。既然有這兩種方式,那麼他們之間肯定是有區別的。 並且,除了單雙引號定義字元串這兩種方式外,php還增加了heredoc和nowdoc這兩種語 ...
  • 1.靜態方法通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法。靜態方法是不可以訪問實例變數或類變數的即沒有self,一個不能訪問實例變數和類變數的方法,其實相當於跟類本身已經沒什麼關係了,它與類唯一的關聯就是需要通過類名來調用這個方法 2.靜態方法的調用 在調用靜態方法的時候, ...
  • 該系列教程系個人原創,並完整發佈在個人官網 "劉江的博客和教程" 所有轉載本文者,需在頂部顯著位置註明原作者及www.liujiangblog.com官網地址。 Python及Django學習QQ群:453131687 模型的元數據,指的是“除了欄位外的所有內容”,例如排序方式、資料庫表名、人類可讀 ...
  • 點擊回顧:《Java Web每天學之Servlet的工作原理解析》;《Java Web每天學之Servlet的工作原理解析(二)》 一、HttpServletRequest對象 1、介紹HttpServletRequest對象:主要作用是用來接收客戶端發送過來的請求信息,例如:請求的參數,發送的頭信 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...