java 之 jsp詳解
jsp所需環境
eclipse JSP/Servlet 環境
jsp處理
以下步驟表明了 Web 伺服器是如何使用JSP來建立網頁的:
-
就像其他普通的網頁一樣,您的瀏覽器傳送一個 HTTP 請求給伺服器。
-
Web 伺服器識別出這是一個對 JSP 網頁的請求,並且將該請求傳遞給 JSP 引擎。通過使用 URL或者 .jsp 檔案來完成。
-
JSP 引擎從磁碟中載入 JSP 檔案,然後將它們轉化為 Servlet。這種轉化只是簡單地將所有模板文字改用 println() 語句,並且將所有的 JSP 元素轉化成 Java 程式碼。
-
JSP 引擎將 Servlet 編譯成可執行類,並且將原始請求傳遞給 Servlet 引擎。
-
Web 伺服器的某元件將會呼叫 Servlet 引擎,然後載入並執行 Servlet 類。在執行過程中,Servlet 產生 HTML 格式的輸出並將其內嵌於 HTTP response 中上交給 Web 伺服器。
-
Web 伺服器以靜態 HTML 網頁的形式將 HTTP response 返回到您的瀏覽器中。
-
最終,Web 瀏覽器處理 HTTP response 中動態產生的HTML網頁,就好像在處理靜態網頁一樣。
以上提及到的步驟可以用下圖來表示:
一般情況下,JSP 引擎會檢查 JSP 檔案對應的 Servlet 是否已經存在,並且檢查 JSP 檔案的修改日期是否早於 Servlet。如果 JSP 檔案的修改日期早於對應的 Servlet,那麼容器就可以確定 JSP 檔案沒有被修改過並且 Servlet 有效。這使得整個流程與其他指令碼語言(比如 PHP)相比要高效快捷一些。
總的來說,JSP 網頁就是用另一種方式來編寫 Servlet 而不用成為 Java 程式設計高手。除了解釋階段外,JSP 網頁幾乎可以被當成一個普通的 Servlet 來對待。
jsp的生命週期
jsp的生命週期就是從建立到銷燬和servlet的生命週期相似
以下是JSP生命週期中所走過的幾個階段:
-
編譯階段:
的servlet容器編譯servlet的原始檔,生成的servlet類
-
當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個檔案。如果這個檔案沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP檔案。
編譯的過程包括三個步驟:
- 解析JSP檔案。
- 將JSP檔案轉為servlet的。
- 編譯的servlet。
- 初始化階段:
載入與JSP對應的servlet的類,建立其例項,並呼叫它的初始化方法
-
- 容器載入JSP檔案後,它會在為請求提供任何服務前呼叫jspInit()方法如果您需要執行自定義的JSP初始化任務,複寫jspInit()方法就行了,就像下面這樣:
-
public void jspInit(){ //初始化程式碼 }
-
- 執行階段:
呼叫與JSP對應的servlet的例項的服務方法
-
-
這一階段描述了JSP生命週期中一切與請求相關的互動行為,直到被銷燬。
當JSP網頁完成初始化後,JSP引擎將會呼叫_jspService()方法。
_jspService()方法需要一個HttpServletRequest的物件和一個HttpServletResponse的物件作為它的引數,就像下面這樣:
-
void _jspService(HttpServletRequest請求, HttpServletResponse響應) { //服務端處理程式碼 }
- _jspService()方法在每個請求中被呼叫一次並且負責產生與之相對應的響應,並且它還負責產生所有7個HTTP方法的迴應,比如GET,POST,DELETE等等。
-
-
-
- 銷燬階段:
呼叫與JSP對應的servlet的例項的銷燬方法,然後銷燬的servlet例項
-
JSP生命週期的銷燬階段描述了當一個JSP網頁從容器中被移除時所發生的一切。
jspDestroy()方法在JSP中等價於小服務程式中的銷燬方法。當您需要執行任何清理工作時複寫jspDestroy()方法,比如釋放資料庫連線或者關閉資料夾等等。
jspDestroy()方法的格式如下:
-
public void jspDestroy() { //清理程式碼 }
-
事例程式碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>life.jsp</title> </head> <body> <%! private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被銷燬了"+destroyVar+"次"); } %> <% serviceVar++; System.out.println("_jspService(): JSP共響應了"+serviceVar+"次請求"); String content1="初始化次數 : "+initVar; String content2="響應客戶請求次數 : "+serviceVar; String content3="銷燬次數 : "+destroyVar; %> <h1>jsp 測試例項</h1> <p><%=content1 %></p> <p><%=content2 %></p> <p><%=content3 %></p> </body> </html>
jsp語法
指令碼語法格式:
<% java 程式碼 %>
或者
<jsp:scriptlet> 程式碼片段 </jsp:scriptlet>
中文編碼問題
將字符集改為UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
jsp宣告
一個宣告語句可以宣告一個或多個變數、方法,供後面的Java程式碼使用。在JSP檔案中,您必須先宣告這些變數和方法然後才能使用它們。
JSP宣告的語法格式:
<%! declaration; [ declaration; ]+ ... %>
或者
<jsp:declaration> 程式碼片段 </jsp:declaration>
事例:
<%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %>
JSP表示式
一個JSP表示式中包含的指令碼語言表示式,先被轉化成String,然後插入到表示式出現的地方。
由於表示式的值會被轉化成String,所以您可以在一個文字行中使用表示式而不用去管它是否是HTML標籤。
表示式元素中可以包含任何符合Java語言規範的表示式,但是不能使用分號來結束表示式。
JSP表示式的語法格式:
<%= 表示式 %>
事例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>index</title> </head> <body> <p> 今天的日期是: <%= (new java.util.Date()).toLocaleString()%> </p> </body> </html>
JSP註釋
JSP指令
jsp行為
JSP行為標籤使用XML語法結構來控制servlet引擎。它能夠動態插入一個檔案,重用JavaBean元件,引導使用者去另一個頁面,為Java外掛產生相關的HTML等等。
行為標籤只有一種語法格式,它嚴格遵守XML標準:
<jsp:action_name attribute="value" />
jsp九個隱含的物件
jsp運算子優先順序
JSP 字面量
JSP語言定義了以下幾個字面量:
- 布林值(boolean):true 和 false;
- 整型(int):與 Java 中的一樣;
- 浮點型(float):與 Java 中的一樣;
- 字串(string):以單引號或雙引號開始和結束;
- Null:null。