<html> <head> <title>第一個 JSP 程序</title> </head> <body> <% out.println("Hello World!"); %> </body> </html>
如下步驟代表了 Web 服務器是如何使用JSP來建立網頁的:html
就像其餘普通的網頁同樣,您的瀏覽器發送一個 HTTP 請求給服務器。java
Web 服務器識別出這是一個對 JSP 網頁的請求,而且將該請求傳遞給 JSP 引擎。經過使用 URL或者 .jsp 文件來完成。web
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與Servlet關係:JSP 網頁就是用另外一種方式來編寫 Servlet 而不用成爲 Java 編程高手。除了解釋階段外,JSP 網頁幾乎能夠被當成一個普通的 Servlet 來對待。app
理解JSP底層功能的關鍵就是去理解它們所遵照的生命週期。JSP生命週期就是從建立到銷燬的整個過程,相似於servlet生命週期,區別在於JSP生命週期還包括將JSP文件編譯成servlet。jsp
如下是JSP生命週期中所走過的幾個階段:
當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否須要編譯這個文件。若是這個文件沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP文件。
編譯的過程包括三個步驟:
容器載入JSP文件後,它會在爲請求提供任何服務前調用jspInit()方法。若是您須要執行自定義的JSP初始化任務,複寫jspInit()方法就好了,就像下面這樣:
public void jspInit(){ // 初始化代碼 }
通常來說程序只初始化一次,servlet也是如此。一般狀況下您能夠在jspInit()方法中初始化數據庫鏈接、打開文件和建立查詢表。
這一階段描述了JSP生命週期中一切與請求相關的交互行爲,直到被銷燬。
SP生命週期的銷燬階段描述了當一個JSP網頁從容器中移除時所發生的一切
JSP指令用來設置整個JSP頁面相關的屬性,如網頁的編碼方式和腳本語言。
語法格式以下:
<%@ directive attribute="value" %>
指令能夠有不少個屬性,它們以鍵值對的形式存在,並用逗號隔開。
JSP中的三種指令標籤:
指令 | 描述 |
---|---|
<%@ page ... %> | 定義網頁依賴屬性,好比腳本語言、error頁面、緩存需求等等 |
<%@ include ... %> | 包含其餘文件 |
<%@ taglib ... %> | 引入標籤庫的定義 |
與JSP指令元素不一樣的是,JSP動做元素在請求處理階段起做用。JSP動做元素是用XML語法寫成的。利用JSP動做能夠動態地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、爲Java插件生成HTML代碼。動做元素只有一種語法,它符合XML標準:
<jsp:action_name attribute="value" />
動做元素基本上都是預約義的函數,JSP規範定義了一系列的標準動做,它用JSP做爲前綴,可用的標準動做元素以下:
語法 | 描述 |
---|---|
jsp:include | 在頁面被請求的時候引入一個文件。 |
jsp:useBean | 尋找或者實例化一個JavaBean。 |
jsp:setProperty | 設置JavaBean的屬性。 |
jsp:getProperty | 輸出某個JavaBean的屬性。 |
jsp:forward | 把請求轉到一個新的頁面。 |
jsp:plugin | 根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記。 |
jsp:element | 定義動態XML元素 |
jsp:attribute | 設置動態定義的XML元素屬性。 |
jsp:body | 設置動態定義的XML元素內容。 |
jsp:text | 在JSP頁面和文檔中使用寫入文本的模板 |
這個例子使用了setIntHeader()方法來設置刷新頭,模擬一個數字時鐘:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <html> <head> <title>自動刷新實例</title> </head> <body> <h2>自動刷新實</h2> <% // 設置每隔5秒刷新一次 response.setIntHeader("Refresh", 5); // 獲取當前時間 Calendar calendar = new GregorianCalendar(); String am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if(calendar.get(Calendar.AM_PM) == 0) am_pm = "AM"; else am_pm = "PM"; String CT = hour+":"+ minute +":"+ second +" "+ am_pm; out.println("當前時間爲: " + CT + "\n"); %> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <html> <html> <head> <title>訪問量統計</title> </head> <body> <% Integer hitsCount = (Integer)application.getAttribute("hitCounter"); if( hitsCount ==null || hitsCount == 0 ){ /* 第一次訪問 */ out.println("歡迎訪問菜鳥教程!"); hitsCount = 1; }else{ /* 返回訪問值 */ out.println("歡迎再次訪問菜鳥教程!"); hitsCount += 1; } application.setAttribute("hitCounter", hitsCount); %> <p>頁面訪問量爲: <%= hitsCount%></p> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <html> <html> <head> <title>頁面重定向</title> </head> <body> <h1>頁面重定向</h1> <% // 重定向到新地址 String site = new String("http://www.runoob.com"); response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location", site); %> </body> </html>