JSP學習-01
JSP(全稱Java Server Pages)
JSP 技術是以 Java 語言作為腳本語言的,JSP 網頁為整個服務器端的 Java 庫單元提供了一個接口來服務於HTTP的應用程序。
JSP文件後綴名為 *.jsp 。標簽通常以<%開頭以%>結束。
JSP開發的WEB應用可以跨平臺使用,既可以運行在 Linux 上也能運行在 Windows 上。本質上就是 Java servlet.主要用於實現Java web應用程序的用戶界面部分。網頁開發者們通過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來編寫JSP。
JSP通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然後動態地創建網頁。
JSP標簽有多種功能,比如訪問數據庫、記錄用戶選擇信息、訪問JavaBeans組件等,還可以在不同的網頁中傳遞控制信息和共享信息。
JSP程序與CGI程序有著相似的功能,但和CGI程序相比,JSP程序的優勢
- 性能更加優越,因為JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI文件。
- 服務器調用的是已經編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標腳本。
- JSP 基於Java Servlet API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等。
- JSP頁面可以與處理業務邏輯的 Servlet 一起使用,這種模式被Java servlet 模板引擎所支持。
JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味著JSP可以用最簡單的方式來實現最復雜的應用。
JSP的優勢
以下列出了使用JSP帶來的其他好處:
- 與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易於移植到非MS平臺上。
- 與純 Servlet 相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。
- 與SSI相比:SSI無法使用表單數據、無法進行數據庫鏈接。
- 與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供復雜的服務,比如訪問數據庫和圖像處理等等。
- 與靜態HTML相比:靜態HTML不包含動態信息。
JSP 結構
網絡服務器需要一個 JSP 引擎,也就是一個容器來處理 JSP 頁面。容器負責截獲對 JSP 頁面的請求。
JSP 容器與 Web 服務器協同合作,為JSP的正常運行提供必要的運行環境和其他服務,並且能夠正確識別專屬於 JSP 網頁的特殊元素。
下圖顯示了 JSP 容器和 JSP 文件在 Web 應用中所處的位置。
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 有效。這使得整個流程與其他腳本語言相比要高效快捷一些。總的來說,JSP 網頁就是用另一種方式來編寫 Servlet 而不用成為 Java 編程高手。除了解釋階段外,JSP 網頁幾乎可以被當成一個普通的 Servlet 來對待。
JSP 生命周期
理解JSP底層功能的關鍵就是去理解它們所遵守的生命周期。
JSP生命周期就是從創建到銷毀的整個過程,類似於servlet生命周期,區別在於JSP生命周期還包括將JSP文件編譯成servlet。
如下是JSP的生命階段
編譯階段:
Servlet容器編譯Servlet源文件 生成Servlet類。
初始階段:
加載與JSP對應的servlet 創建其實例並調用它的初始化方法。
執行階段:
調用與JSP對應的Servlet實例服務方法。
銷毀階段:
調用與JSP對應的Servlet實例的銷毀方法。然後銷毀Servlet實例。
JSP的生命周期和Servlet的很相識
當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個文件。如果這個文件沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP文件。
解析JSP文件
將JSP文件轉移為Servlet
編譯Servlet
JSP初始化
容器載入JSP文件後,它會在為請求提供任何服務前調用jspInit()方法
public void jspInit(){
//初始代碼 }
一般來講程序只初始化一次,servlet也是如此
JSP執行
當JSP網頁完成初始化後,JSP引擎將會調用_jspService()方法。_jspService()方法需要一個HttpServletRequest對象和一個HttpServletResponse對象作為它的參數
public void _jspService(HttpServletRequest request, HttpServletResponse response) { // 服務端處理代碼 }
_jspService()方法在每個request中被調用一次並且負責產生與之相對應的response,並且它還負責產生所有7個HTTP方法的回應,比如GET、POST、DELETE等等。
JSP銷毀
JSP生命周期的銷毀階段描述了當一個JSP網頁從容器中被移除時所發生的一切。
jspDestroy()方法在JSP中等價於servlet中的銷毀方法。當需要執行任何清理工作時復寫jspDestroy()方法,比如釋放數據庫連接或者關閉文件夾等等。
public void jspDestroy() { // 清理代碼 }
JSP 語法
JSP開發中的基礎語法。
腳本程序的語法格式:
<% 代碼片段 %>//
或者是
<jsp:scriptlet>
代碼片段
</jsp:scriptlet>
任何文本、HTML標簽、JSP元素必須寫在腳本程序的外面。
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
中文編碼問題
如果要在頁面正常顯示中文,我們需要在 JSP 文件頭部添加以下代碼:<>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
JSP聲明
JSP聲明的語法格式:
<%!.....%> //聲明時要加"!",屬於類成員,最先加載,可寫於任何位置;不加則是腳本的局部變量,必須調用前寫。
<%!String hello="hello,Word!"%>//變量聲明
<%=hello%>//變量的調用
<%! private int count=0;
pujblic int counter(){//函數的聲明
return count++;
}
%>
JSP表達式
一個JSP表達式中包含的腳本語言表達式,先被轉化成String,然後插入到表達式出現的地方。
由於表達式的值會被轉化成String,所以您可以在一個文本行中使用表達式而不用去管它是否是HTML標簽。
表達式元素中可以包含任何符合Java語言規範的表達式,但是不能使用分號來結束表達式。
JSP表達式的語法格式:
<%= 表達式 %>
JSP註釋
JSP註釋主要有兩個作用:為代碼作註釋以及將某段代碼註釋掉。
JSP註釋的語法格式:<%-- 該部分註釋在網頁中不會被顯示--%>
語法 | 描述 |
---|---|
<%-- 註釋 --%> | JSP註釋,註釋內容不會被發送至瀏覽器甚至不會被編譯 |
<!-- 註釋 --> | HTML註釋,通過瀏覽器查看網頁源代碼時可以看見註釋內容 |
<\% | 代表靜態 <%常量 |
%\> | 代表靜態 %> 常量 |
\‘ | 在屬性中使用的單引號 |
\" | 在屬性中使用的雙引號 |
JSP指令
JSP指令用來設置與整個JSP頁面相關的屬性。
JSP指令語法格式:
<%@ directive attribute="value" %>
這裏有三種指令標簽:
指令 | 描述 |
---|---|
<%@ page ... %> | 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入標簽庫的定義,可以是自定義標簽 |
Page指令
Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。
Page指令的語法格式:
<%@ page attribute="value" %>
或者
<jsp:directive.page attribute="value" />
下表列出與Page指令相關的屬性:
屬性 | 描述 |
---|---|
buffer | 指定out對象使用緩沖區的大小 |
autoFlush | 控制out對象的 緩存區 |
contentType | 指定當前JSP頁面的MIME類型和字符編碼 |
errorPage | 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面 |
isErrorPage | 指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面 |
extends | 指定servlet從哪一個類繼承 |
import | 導入要使用的Java類 |
info | 定義JSP頁面的描述信息 |
isThreadSafe | 指定對JSP頁面的訪問是否為線程安全 |
language | 定義JSP頁面所用的腳本語言,默認是Java |
session | 指定JSP頁面是否使用session |
isELIgnored | 指定是否執行EL表達式 |
isScriptingEnabled | 確定腳本元素能否被使用 |
Include指令
JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。
Include指令的語法格式如下:
<%@ include file="文件相對 url 地址" %>
include 指令中的文件名實際上是一個相對的 URL 地址。
如果您沒有給文件關聯一個路徑,JSP編譯器默認在當前路徑下尋找。
等價的XML語法:
<jsp:directive.include file="文件相對 url 地址" />
Taglib指令
JSP API允許用戶自定義標簽,一個自定義標簽庫就是自定義標簽的集合。
Taglib指令引入一個自定義標簽集合的定義,包括庫路徑、自定義標簽。
Taglib指令的語法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri屬性確定標簽庫的位置,prefix屬性指定標簽庫的前綴。
等價的XML語法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
JSP學習-01