1. 程式人生 > >Jsp規範_JSP語法概念、運行機制和隱含對象

Jsp規範_JSP語法概念、運行機制和隱含對象

runt 似的 time method 會有 程序員 並保存 apache 處理

  • 什麽是Jsp

  可以理解為最初目的就是為分離視圖和處理程序,jsp也可以部署,但一般而言不需要,容器會自動識別!

  • JSP的在容器中的生命周期

  轉化階段:當有一個jsp請求到來時,容器會檢查該jsp的編寫是否符合語法規範,然後使用容器內部邏輯轉換成對應的Servlet文件並保存在指定的文件目錄下,最後容器執行編  譯工作。註意的是:jsp檢查出錯的話會把錯誤信息發送給客戶端,這和servlet很不同,servlet只會500告知內部錯誤。

  執行階段:容器加載轉換並編譯成功後的servlet文件,執行servlet中的相關方法即達到了動態頁面的效果。而且容器第一次會解析jsp為servlet並編譯,但是客戶再次請求時容器  會先判斷是否有對應的servlet,因為jsp的編譯對程序員是透明的,因此當程序員修改jsp後容器在轉化會檢查jsp有否更新!

  編譯後的servlet一般會xx.jsp名更改為xx_jsp的servlet,該類實現的是org.apache.jasper.runtime.HttpJspBase。jsp轉換的代碼主要在對應的servlet的void_jspService方法中,類  似於原生servlet的service方法。該方法體內聲明了九個內置對象,PageContext/HttpSession/ServletContext/ServletConfig/JspWriter/Page,基本與servlet中依賴的對象對應,不  同的是servlet可以由程序員部署。其實使用jsp很多方面是比servlet方便的。不在贅述,後面隱含對象中總結。

  其生命周期是jspInit()---void_jspService()---jspDestroy(),初始化其實也可以在描述符中部署。

  • jsp語法概念

  jsp由元素和模版數據組成,模版數據即html代碼,元素則是由容器處理的部分,即指令元素、腳本元素、動作元素。

  1. 指令元素

  為整個jsp的轉換階段提供相關信息,如import了那些類,聲明使用的腳本語言(默認當然是java)等。一般的指令有page,即<%@ page import=“”%>,該指令由15個屬性構成  完整定義;include,<%@include file=""%>用來包含頁面中的靜態資源,可以是jsp,css,html等;taglib,如<%@ taglib uri="xx.tld/xx.tag" prefix=“yy”%>用來定位某個標簽文件或  標簽庫。

  2.腳本元素

聲明

  用來聲明在其他腳本元素中可以使用的變量方法,從根本上說就是jsp解析遇到該聲明時,就會把其內容放到對應servlet的成員變量位置,或者是編寫為該servlet類的一個過程被  void_jspService()使用。規範中這樣寫:<%! int state = 1; %>/ <%! public void method(){....}%>,記住元素中的代碼會照搬,不要忘記“;”。當然也是可以把一些變量放在腳  本段的。

  • 腳本段

  用來產生輸出或者是為表達式做準備,因為腳本段中的java代碼可以out.write(),該腳本元素中的java代碼會原封不動地復制到對應的servlet的void_jspService()方法體中。而  夾雜在其中的html代碼也會依照出現順序使用print(好像是)方法原樣輸出。所以本質上就是容器自動輸出頁面中的模版數據進響應緩沖中。規範中這樣寫:<% if(){}..%>

  • 表達式

  表達式是把該腳本元素中的變量或方法返回值(表達式)原樣復制並作為print()方法的參數,換句話說就是調用servlet的輸出把變量放進響應體緩沖中。規範寫法       <%= bean.attribute%>

  3.動作元素

  動作元素可以看作一系列的java代碼,也看作以上標簽的綜合化,規範定義了20個動作,以後用到再去查,不會影響到對jsp的整體認識。只要記住<jsp:useBean>,     <jsp:setProperty>,<jsp:getProperty>簡化了數據模型的註入、傳遞和訪問。

  • 註釋

  分為html註釋和jsp註釋 java註釋,jsp註釋還可以分為輸出和不輸出註釋,輸出註釋不會在瀏覽器渲染,但是響應體中會有註釋的內容。

  • 隱含對象

  上面已經說過,void_jspService()方法中有九個對象的聲明,比如session、config/context還有重要的req/res,其實他們都和servlet組件可以通過容器獲取到的相關對象對   應,比如out對應於writer。這裏只需要牢記,九個內置對象被放進service方法中,而jsp中對內置對象的使用當然會被支持,因此他們可以直接被復制到對應的servlet的   void_jspService方法中。jsp的本質和servlet是類似的。只不過是提供了另一種定義完好的所謂jsp語法形式的外衣。

  

Jsp規範_JSP語法概念、運行機制和隱含對象