JavaWeb學習總結(十七)——JSP中的九個內置對象

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、JSP運行原理

  每個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,然后按照servlet的調用方式進行調用。
  由于JSP第一次訪問時會翻譯成servlet,所以第一次訪問通常會比較慢,但第二次訪問,JSP引擎如果發現JSP沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會受到影響。
  JSP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者為便于開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變量,開發人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用。

二、認識九個內置對象

NO.內置對象類型
1pageContextjavax.servlet.jsp.PageContext
2requestjavax.servlet.http.HttpServletRequest
3responsejavax.servlet.http.HttpServletResponse
4sessionjavax.servlet.http.HttpSession
5applicationjavax.servlet.ServletContext
6configjavax.servlet.ServletConfig
7outjavax.servlet.jsp.JspWriter
8pagejava.lang.Object
9exceptionjava.lang.Throwable

?

?

?

?

?

?

?

?

?

?  

  request,response,session,application,config這些對象在前面都已經作了詳細的介紹,這里重點介紹一下剩下的pageContext對象,out對象,page對象。

三、內置對象使用說明

3.1、page對象

  page對象表示當前一個JSP頁面,可以理解為一個對象本身,即:把一個JSP當作一個對象來看待。page對象在開發中幾乎不用,了解一下即可

3.2、out對象

  out對象用于向客戶端發送文本數據。
  out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對象非常相似。
  JSP頁面中的out對象的類型為JspWriter,JspWriter相當于一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存。
  只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用ServletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區中的內容真正寫入到Servlet引擎提供的緩沖區中:

  • 設置page指令的buffer屬性關閉了out對象的緩存功能
  • out對象的緩沖區已滿
  • 整個JSP頁面結束

out對象的工作原理圖

  

3.3、pageContext對象

  pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象(容器),可以用來保存數據。并且,這個對象還封裝了web開發中經常涉及到的一些常用操作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。

3.4、通過pageContext獲得其他對象

  • getException方法返回exception隱式對象
  • getPage方法返回page隱式對象
  • getRequest方法返回request隱式對象
  • getResponse方法返回response隱式對象
  • getServletConfig方法返回config隱式對象
  • getServletContext方法返回application隱式對象
  • getSession方法返回session隱式對象
  • getOut方法返回out隱式對象

3.5、pageContext封裝其它8大內置對象的意義

  如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那么這個java對象將可以獲取8大隱式對象,此時這個java對象就可以和瀏覽器交互了,此時這個java對象就成為了一個動態web資源了,這就是pageContext封裝其它8大內置對象的意義,把pageContext傳遞給誰,誰就能成為一個動態web資源,那么什么情況下需要把pageContext傳遞給另外一個java類呢,什么情況下需要使用這種技術呢,在比較正規的開發中,jsp頁面是不允許出現java代碼的,如果jsp頁面出現了java代碼,那么就應該想辦法把java代碼移除掉,我們可以開發一個自定義標簽來移除jsp頁面上的java代碼,首先圍繞自定義標簽寫一個java類,jsp引擎在執行自定義標簽的時候就會調用圍繞自定義標簽寫的那個java類,在調用java類的時候就會把pageContext對象傳遞給這個java類,由于pageContext對象封裝了對其它8大隱式對象的引用,因此在這個java類中就可以使用jsp頁面中的8大隱式對象(request,response,config,application,exception,Session,page,out)了,pageContext對象在jsp自定義標簽開發中特別重要。

3.6、pageContext作為域對象

  pageContext對象可以作為容器來使用,因此可以將一些數據存儲在pageContext對象中。

  pageContext對象的常用方法

1 public void setAttribute(java.lang.String name,java.lang.Object value)
2 public java.lang.Object getAttribute(java.lang.String name)
3 public void removeAttribute(java.lang.String name)
4 public java.lang.Object findAttribute(java.lang.String name)

  重點介紹一下findAttribute方法,這個方法是用來查找各個域中的屬性的,查看這個方法的API可以看到關于這個方法的描述:
  Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

  當要查找某個屬性時,findAttribute方法按照查找順序"page→request→session→application"在這四個對象中去查找,只要找到了就返回屬性值,如果四個對象都沒有找到要查找的屬性,則返回一個null。

范例:使用pageContext的findAttribute方法查找屬性值

 1 <%@page contentType="text/html;charset=UTF-8"%>
 2 <%@page import="java.util.*"%>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <head>
 5     <title>pageContext的findAttribute方法查找屬性值</title>
 6 </head>
 7 <%
 8     pageContext.setAttribute("name1", "孤傲蒼狼");
 9     request.setAttribute("name2", "白虎神皇");
10     session.setAttribute("name3", "玄天邪帝");
11     application.setAttribute("name4", "滅世魔尊");
12 %>
13 <%
14     //使用pageContext的findAttribute方法查找屬性,由于取得的值為Object類型,因此必須使用String強制向下轉型,轉換成String類型
15     //查找name1屬性,按照順序"page→request→session→application"在這四個對象中去查找
16     String refName1 = (String)pageContext.findAttribute("name1");
17     String refName2 = (String)pageContext.findAttribute("name2");
18     String refName3 = (String)pageContext.findAttribute("name3");
19     String refName4 = (String)pageContext.findAttribute("name4");
20     String refName5 = (String)pageContext.findAttribute("name5");//查找一個不存在的屬性
21 %>
22 <h1>pageContext.findAttribute方法查找到的屬性值:</h1>
23 <h3>pageContext對象的name1屬性:<%=refName1%></h3>
24 <h3>request對象的name2屬性:<%=refName2%></h3>
25 <h3>session對象的name3屬性:<%=refName3%></h3>
26 <h3>application對象的name4屬性:<%=refName4%></h3>
27 <h3>查找不存在的name5屬性:<%=refName5%></h3>
28 <hr/>
29 <h1>使用EL表達式進行輸出:</h1>
30 <h3>pageContext對象的name1屬性:${name1}</h3>
31 <h3>request對象的name2屬性:${name2}</h3>
32 <h3>session對象的name3屬性:${name3}</h3>
33 <h3>application對象的name4屬性:${name4}</h3>
34 <h3>不存在的name5屬性:${name5}</h3>

運行結果:

  

  EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符為關鍵字,分別從page、request、 session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。

pageContext對象中封裝了訪問其它域的方法

1 public java.lang.Object getAttribute(java.lang.String name,int scope)
2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
3 public void removeAttribute(java.lang.String name,int scope)

代表各個域的常量

1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE

范例:pageContext訪問其它域

 1 <%@page contentType="text/html;charset=UTF-8"%>
 2 <%@page import="java.util.*"%>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <head>
 5     <title>pageContext訪問其它域</title>
 6 </head>
 7 <%
 8     //此時相當于往session對象中存放了一個name屬性,等價于 session.setAttribute("name","孤傲蒼狼");
 9     pageContext.setAttribute("name","孤傲蒼狼",PageContext.SESSION_SCOPE);
10 %>
11 <%
12     //取得session對象的屬性,使用pageContext對象獲取
13     String refName1 = (String)pageContext.getAttribute("name",PageContext.SESSION_SCOPE);  
14     //由于取得的值為Object類型,因此必須使用String強制向下轉型,轉換成String類型
15      String refName2 = (String)session.getAttribute("name");  
16 %>
17 <h1>取出存放在session對象中的屬性值:</h1>
18 <p>第一種做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session對象中值</p>
19 <h3>姓名:<%=refName1%></h3>
20 <p>第二種做法:使用session.getAttribute("attributeName");去取出session對象中值</p>
21 <h3>姓名:<%=refName2%></h3>

  

3.7、PageContext引入和跳轉到其他資源

  PageContext類中定義了一個forward方法(用來跳轉頁面)和兩個include方法(用來引入頁面)來分別簡化和替代RequestDispatcher.forward方法和include方法。
  方法接收的資源如果以“/”開頭, “/”代表當前web應用。

范例:使用pageContext的forward方法跳轉到其他頁面

 1 <%@page contentType="text/html;charset=UTF-8"%>
 2 <%@page import="java.util.*"%>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <head>
 5     <title>使用pageContext的forward方法跳轉頁面</title>
 6 </head>
 7 <%
 8     //使用pageContext的forward方法跳轉到pageContextDemo05.jsp頁面,/代表了當前的web應用
 9     pageContext.forward("/pageContextDemo05.jsp");
10     //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
11     //使用RequestDispatcher的forward方法實現的跳轉方式
12     //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
13 %>

運行結果如下:
  

1 pageContext.forward("/pageContextDemo05.jsp");

  這種寫法是用來簡化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);這種寫法的。在實際開發中,使用pageContext.forward(relativeUrlPath)方法跳轉頁面用得不多,主要是因為要在Jsp頁面中嵌套java代碼,所以這種做法簡單了解一下即可,在開發中,要想從一個Jsp頁面采用服務器端跳轉的方式跳轉到另一個Jsp頁面,那么一般會使用<jsp:forward>標簽,<jsp:forward>標簽用于把請求轉發給另外一個資源。

范例:使用pageContext的include方法引入資源

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <head>
 4     <title>使用pageContext的include方法引入資源</title>
 5 </head>
 6 <%
 7     pageContext.include("/jspfragments/head.jsp");
 8 %>
 9     使用pageContext的include方法引入資源
10 <%
11     pageContext.include("/jspfragments/foot.jsp");
12 %>
13 <hr/>
14 <%--
15 <jsp:include page="/jspfragments/head.jsp"/>
16 使用jsp:include標簽引入資源
17 <jsp:include page="/jspfragments/foot.jsp"/>
18 --%>

運行結果:

  

  ?在實際開發中,使用pageContext的include方法引入頁面這種做法也很少用,一般都使用jsp:include標簽引入資源,因此這種做法了解一下即可。

轉載于:https://my.oschina.net/u/204616/blog/548940

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274964.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#網絡編程(異步傳輸字符串) - Part.3[轉自JimmyZhang博客]

源碼下載&#xff1a;http://www.tracefact.net/SourceCode/Network-Part3.rar C#網絡編程(異步傳輸字符串) - Part.3 這篇文章我們將前進一大步&#xff0c;使用異步的方式來對服務端編程&#xff0c;以使它成為一個真正意義上的服務器&#xff1a;可以為多個客戶端的多次請求…

chrome黑暗模式_黑暗模式:如何克服黑暗面

chrome黑暗模式This article has been written by Redmadrobot Design Lab. Translated and reposted with permission by Alconost Inc., professional translation and localization company.本文由 Redmadrobot設計實驗室 撰寫 。 經過 專業翻譯和本地化公司 Alconost Inc.的…

Deco 智能代碼體驗版正式上線啦,快來體驗設計稿一鍵生成代碼~

Deco 是什么&#xff1f;—Deco 智能代碼項目是我們團隊在「前端智能化」方向上的探索&#xff0c;其聚焦設計稿一鍵生成多端代碼這一切入點&#xff0c;實現將 Sketch/Photoshop 等設計稿進行解析并直接生成多端代碼&#xff08;Taro/React/Vue&#xff09;的能力。Deco 可以使…

jQuery 五角星評分

五角星打分 我用的是搜狗輸入法上帶的特殊符號打出來的 空五角星&#xff1a;☆ 實五角星&#xff1a;★ 1.html 1 <ul class"comment"> 2 <li>☆</li> 3 <li>☆</li> 4 <li>☆</li> 5 …

平面設計和網頁設計的規則_從平面設計到用戶界面:這是您應該知道的最重要的規則

平面設計和網頁設計的規則Maybe you’re here because you think UI Design is the future of Graphic Design. Maybe what motivates you is the money. Or maybe you just woke up one day and someone at work told you “So, you are a designer, right? Well, we need an…

即將到來的 ECMAScript 2022 新特性

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。ECMAScript 規范每…

代碼備忘錄

1.用指針&#xff0c;函數調用實現交換兩個變量值 #include<stdio.h> int exchange(int *a,int *b){ int temp; temp*a; *a*b; *btemp;return 0;} int main(){ int i9,j2; int *p1,*p2; p1&i; p2&j; exchange(p1,p2); printf("p1%d,p2%d\n",*p1,*p2);…

mysql實戰38 | 都說InnoDB好,那還要不要使用Memory引擎?

我在上一篇文章末尾留給你的問題是&#xff1a;兩個 group by 語句都用了 order by null&#xff0c;為什么使用內存臨時表得到的語句結果里&#xff0c;0 這個值在最后一行&#xff1b;而使用磁盤臨時表得到的結果里&#xff0c;0 這個值在第一行&#xff1f;今天我們就來看看…

設計類的五個原則_內容設計的5個原則

設計類的五個原則重點 (Top highlight)There are many heuristics and principles for creating good content. Some are created from a UX perspective, others from a content marketing point of view. They range from very long to very concise ones. I reviewed a larg…

Umi 4 RC 發布

大家好&#xff0c;我是若川。感謝大家一年以來的支持和陪伴。這一年疫情反復&#xff0c;年底應該有由于疫情不能回家的小伙伴。在這里先祝福大家&#xff0c;新年快樂。本打算今天不發文&#xff0c;但看到這篇覺得不錯&#xff0c;就發一下。大家好&#xff0c;Umi 4 經過幾…

讓你沉迷的五種設計

讓你沉迷的五種設計 好游戲總是能令人沉迷其中無法自拔&#xff0c;外媒cracked經過分析&#xff0c;發現有五種設計方法必不可少&#xff1b; 1.斯金納箱原理&#xff1a;這是行為心理學派在實驗室內研究動物學習能力的箱形實驗裝置&#xff0c;游戲開發也得益于此&#xff0c…

Java學習路線詳解

有很多的[Java請添加鏈接描述](http://www.hfxms.com.cn/java/)程序員&#xff0c;在初期學習時&#xff0c;通常會對如何學習而感到迷茫。[合肥學碼思請添加鏈接描述](http://www.hfxms.com.cn/)小編就為大家分析如何學好Java編程&#xff0c;相信能幫助那些正在處于迷茫狀態的…

figma下載_在Figma中將約束與布局網格一起使用

figma下載While doing research for the book “Designing in Figma”, I discovered a powerful way to lay out objects using a combination of Layout Grid and Constraints. The interface of Figma does not indicate a connection between the two, so it can be discov…

換一種方式表達

http://player.youku.com/player.php/sid/XMjY2MTE5NDU2/v.swf 轉載于:https://www.cnblogs.com/JCSU/archive/2012/03/17/2403324.html

新的一年,碎片化學習前端,我推薦這幾個公眾號~

大家好&#xff0c;我是若川。假期余額不足&#xff0c;無法充值。快樂的時光總是短暫的。馬上又開始一年的學習和“奮斗”。前端技術日新月異&#xff0c;發展迅速&#xff0c;作為一個與時俱進的前端工程師&#xff0c;需要不斷的學習。這里強烈推薦幾個前端開發工程師必備的…

Java單元測試之JUnit4詳解

2019獨角獸企業重金招聘Python工程師標準>>> Java單元測試之JUnit4詳解 與JUnit3不同&#xff0c;JUnit4通過注解的方式來識別測試方法。目前支持的主要注解有&#xff1a; BeforeClass 全局只會執行一次&#xff0c;而且是第一個運行Before 在測試方法運行之前運行…

我在黑暗中看到你眼中的月光_你好黑暗,我的老朋友

我在黑暗中看到你眼中的月光(Originally published on https://web.dev/prefers-color-scheme/.)(最初發布于https://web.dev/prefers-color-scheme/ 。) 介紹 (Introduction) &#x1f4da; I have done a lot of background research on the history and theory of dark mod…

ant 實現批量打包android應用

很多的應用中需要加上應用推廣的統計&#xff0c;如果一個一個的去生成不同渠道包的應用&#xff0c;效率低不說&#xff0c;還有可能不小心弄錯了分發渠道&#xff0c;使用ant可以批量生成應用。一、添加渠道包信息為了統計渠道信息&#xff0c;就不得不在程序的某個地方加入渠…

Element Plus 正式版發布啦!

大家好&#xff0c;我是若川。祝大家新年快樂&#xff0c;開工大吉。公眾號回復「紅包」可以領取源碼共讀紅包封面。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時…

大型網站技術架構(一)大型網站架構演化

2019獨角獸企業重金招聘Python工程師標準>>> 看完了有一本書&#xff0c;就應該有所收獲&#xff0c;有所總結&#xff0c;最近把《大型網站技術架構》一書給看完了&#xff0c;給人的印象實在深刻&#xff0c;再加上之前也搞過書本上講的反向代理和負載均衡以及ses…