2.3 JSP概述
JSP(Java Server Pages)是由美國Sun Microsystems公司倡導的、許多公司參與一起建立的一種動態網頁技術標準。JSP技術是用Java語言作為腳本語言,JSP網頁為整個服務器端的Java庫單元提供了一個接口來服務于HTTP的應用程序。
在傳統的網頁HTML文件(?.htm,?.html)中加入Java程序片段(Scriptlet)和JSP標記(Tag),就構成了JSP網頁(?.jsp)。Web服務器在遇到訪問JSP網頁的請求時,首先執行其中的程序片段,然后將執行結果以HTML格式返回給客戶。程序片段可以操作數據庫、重新定向網頁以及發送e-mail等,這就是建立動態網站所需要的功能。所有程序操作都在服務器端執行,網絡上傳送給客戶端的僅是得到的結果。它對客戶瀏覽器的要求最低,可以實現無Plugin,無ActiveX,無Java Applet,甚至無Frame。
2.3.1 什么是JSP
JSP是基于Java的技術,用于創建可支持跨平臺及Web服務器的動態網頁。從構成情況上來看,JSP頁面代碼一般由普通的HTML語句和特殊的基于Java語言的嵌入標記組成,所以它具有了Web和Java功能的雙重特性。
JSP 1.0規范是1999年9月推出的,12月又推出了1.1規范。此后JSP又經歷了幾個版本,2003年發布的JSP 2.0,最新版本是JSP 2.1。本書介紹的技術都基于JSP 2.0規范。
為了讓讀者對JSP技術有一個直觀的認識,先來看一個非常簡單的JSP頁面及其運行效果。以下是helloWorld.jsp的源代碼:
JSP是一種動態網頁技術標準。可以將網頁中的動態部分和靜態的HTML相分離。用戶可以使用平常得心應手的工具并按照平常的方式來書寫HTML語句。然后,將動態部分用特殊的標記嵌入即可,這些標記常常以“<%”開始并以“%>”結束。程序運行效果如圖2-5所示。
同HTML以及ASP等語言相比,JSP雖然在表現形式上同它們的差別并不大,但是它卻提供了一種更為簡便、有效的動態網頁編寫手段,而且由于JSP程序同Java語言有著天然的聯系,所以在眾多基于Web的架構中,都可以看到JSP程序。
由于JSP程序增強了Web頁面程序的獨立性、兼容性和可重用性,所以,與傳統的ASP、PHP網絡編程語言相比,它具有以下特點:
1)JSP的執行效率比較高。由于每個基于JSP的頁面都被Java虛擬機事先解析成一個Servlet,服務器通過網絡接收到來自客戶端HTTP的請求后,Java虛擬機解析產生的Servlet將開啟一個“線程(Thread)”來提供服務,并在服務處理結束后自動銷毀這個線程,如圖2-6所示。這樣的處理方式將大大提高系統的利用率,并能有效地降低系統的負載。
2)編寫簡單。由于JSP是基于Java語言和HTML元素的一項技術,所以只要熟悉Java和HTML的程序員都可以開發JSP。
3)跨平臺。由于JSP運行在Java虛擬機之上,所以它可以借助于Java本身的跨平臺能力,在任何支持Java的平臺和操作系統上運行。
4)JSP可以嵌套在HTML或XML網頁中。這樣不僅可以降低程序員開發頁面顯示邏輯效果的工作量,更能提供一種比較輕便的方式來同其他Web程序交互。
圖2-5 helloWorld.jsp運行效果
圖2-6 Web服務器使用Servlet提供服務的示意圖
2.3.2 JSP技術原理
JSP文件的執行方式是“編譯式”,而不是“解釋式”,即在執行JSP頁面時,是把JSP文件先翻譯為Servlet形式的Java類型的字節碼文件,然后通過Java虛擬機來運行。所以從本質上來講,運行JSP文件最終還是要通過Java虛擬機。不過根據JSP技術的相關規范,JSP語言必須在某個構建于Java虛擬機之上的特殊環境中運行,這個特殊環境就是Servlet Container(通常被譯為Servlet容器)。而且,每個JSP頁面在被系統調用之前,必須先被Servlet容器解析成一個Servlet文件。
圖2-7給出了JSP的運行原理。每次Servlet容器接收到一個JSP請求時,都會遵循以下步驟:
(1)Servlet容器查詢所需要加載的JSP文件是否已經被解析成Servlet文件。如果沒有在Servlet容器里找到對應的Servlet文件,容器將根據JSP文件新創建一個Servlet文件。反之,如果在容器里有此Servlet文件,容器則比較兩者的時間,如果JSP文件的時間要晚于Servlet文件,則說明此JSP文件已被重新修改過,需要容器重新生成Servlet文件,反之容器將使用原先的Servlet文件。
(2)容器編譯好的Servlet文件被加載到Serv-let容器中,執行定義在該JSP文件里的各項操作。
(3)Servlet容器生成響應結果,并返回給客戶端。
(4)JSP文件結束運行。
從這個JSP的工作原理和運作流程上來看,JSP程序既能以Java語言的方式處理Web程序里的業務邏輯,更可以處理基于HTML協議的請求,它是集眾多功能于一身的。
圖2-7 JSP運行原理
不過,在編寫程序的過程中,不能過多地在JSP代碼里混雜提供顯示功能和提供業務邏輯的代碼,而是要把JSP程序定位到“管理顯示邏輯”的角色上。
當服務器第一次接收到對某個頁面的請求時,JSP引擎就開始進行上述的處理過程,將被請求的JSP文件編譯成Class文件。在后續對該頁面再次進行請求時,若頁面沒有進行任何改動,服務器只需直接調用Class文件執行即可。所以當某個JSP頁面第一次被請求時,會有一些延遲,而再次訪問時會感覺快了很多。如果被請求的頁面經過修改,服務器將會重新編譯這個文件,然后執行。
2.3.3 JSP和其他動態網站開發技術
早期的動態網站開發技術是基于公共網關接口(Common Gateway Interface,CGI)的。其功能主要是客戶端向服務器發送請求,Web服務器接收到請求后啟動所指定的CGI程序來完成諸如對數據庫進行訪問、存儲信息等操作,最后將處理的結果反饋給客戶端。CGI程序包括兩個主要部分:一個是程序代碼,一個是HTML代碼。由于每次修改HTML頁面代碼都必須重新編譯CGI程序,以至于最后在CGI程序調試中,調試HTML代碼的工作量可能超過調試CGI程序代碼的工作量。CGI屬于比較早期的服務器端動態技術,但由于其發展的歷史較早,目前使用此項技術所構建的網站依然不在少數。然而由于其不易學習和效率不高的特性,在ASP及JSP等技術出現之后,已逐漸淡出用戶的視線。
為克服這一弊端,其他動態網站開發技術相繼發展起來。ASP(Active Server Pages)是美國微軟公司開發的一種類似HTML、Script(腳本)與CGI的結合體的技術,可以結合HTML網頁、ASP指令和ActiveX元件建立動態、交互且高效的Web服務器應用程序。ASP允許用戶使用包括VBScript和JavaScript等在內的許多已有的腳本語言編寫ASP應用程序。ASP程序的編制比HTML更方便且更有靈活性。它是在Web服務器端運行,運行后再將運行結果以HTML格式傳送至客戶端的瀏覽器。但是ASP技術有一個比較明顯的缺陷就是它基本上只能局限于美國微軟公司的操作系統平臺之上,如IIS(Internet Information Server)和PWS(Personal Web Server)等。
PHP也是一種用于創建動態Web頁面的服務端腳本語言。同樣可以混合使用PHP和HTML編寫Web頁面。當客戶端訪問某頁面時,服務器端會首先對頁面中的PHP命令進行處理,然后把處理后的結果連同HTML內容一起傳送到客戶端的瀏覽器。另外,PHP是一種開源程序,擁有很好的跨平臺兼容性。用戶可以在Windows系統及許多版本的UNIX和Linux系統上運行PHP,而且可以將PHP作為Apache服務器的內置模塊或CGI程序運行。ASP.NET是美國微軟公司集成.NET平臺發展而來的服務器端網頁語言,使用.NET提供的類別庫與對象導向理論建構的服務器端動態網頁,不僅功能強大,緊密結合.NET平臺,而且在性能上也有相當出色的表現,近年來已經成為最熱門的動態網頁技術之一。
JSP不像CGI、ISAPI和NSAPI那樣難于編寫和維護,不像PHP那樣只能適應中小流量的網站,也不像ASP那樣受到跨平臺的限制(只能運行于美國微軟公司開發的IIS和PWS上)。JSP體現了當今最先進的網站開發思想,和其他Web開發工具相比,JSP有著以下強大的優勢:
1)程序可以跨平臺執行。JSP可以讓開發人員在任意環境中進行開發,在任意環境中進行系統部署,在任意環境中擴展應用程序。
2)多樣化和功能強大的開發工具支持。Java有許多非常優秀的開發工具,而且有許多可以免費得到,其中許多工具已經可以順利地運行于多種平臺之下。
3)強大的可伸縮性。從只有一個小的jar文件就可以運行servlet/jsp到由多臺服務器進行集群和負載均衡,到多臺Application進行事務處理,一臺服務器到無數臺服務器,Java顯示了巨大的生命力。
當然,JSP也有它的不足,Java的一些優勢也是它致命的問題所在:
1)跨平臺的功能和極度的伸縮能力極大地增加了產品的復雜性。也就是說,它在擴展時需要分成多少塊,那么Java系統中就有多少種產品,所以用戶可能會看到jre、jdk、jsdk、jswdk等,而實際上它們是密不可分的。只要將它們有效地搭配在一起,就可以產生強大的效能。當然,這同時也使應用程序變得非常復雜。
2)JSP運行是用class常駐內存來完成的,雖然提高了響應速度,但要占用內存。Java的運行速度是用class常駐內存來完成的,所以它在一些情況下所使用的內存比起用戶數量來說確實是“最低性能價格比”了。從另一方面,它還需要硬盤空間來儲存一系列的.java文件和.class文件,以及對應的版本文件。
3)JSP程序調試也不是很方便。JSP頁面首先被轉化為一個.java文件(Servlet),然后再被編譯。這樣,出錯信息實際上指向的是經過轉化的那個.java文件而不是.jsp本身。
- Clojure Programming Cookbook
- Google Flutter Mobile Development Quick Start Guide
- AngularJS入門與進階
- 精通JavaScript+jQuery:100%動態網頁設計密碼
- SQL Server 2016從入門到精通(視頻教學超值版)
- Full-Stack React Projects
- Kinect for Windows SDK Programming Guide
- 智能手機APP UI設計與應用任務教程
- PHP 7從零基礎到項目實戰
- Learning C++ by Creating Games with UE4
- HTML5游戲開發實戰
- Web開發的平民英雄:PHP+MySQL
- Android智能手機APP界面設計實戰教程
- Python高性能編程(第2版)
- 趣學數據結構