JavaServer Pages(JSP)是一種支援動態內容開發的網頁技術它可以幫助開發人員通過利用特殊的JSP標籤,其中大部分以<%開始並以%>作為結束標誌插入Java程式碼到HTML頁面。
JavaServer Pages元件是一個Java servlet的型別,旨在滿足Java Web應用程式使用者介面的一個角色。Web開發人員編寫JSP為文字檔案,結合HTML或XHTML程式碼,XML元素,並嵌入JSP動作和命令。
使用JSP可以通過網頁的形式,從資料庫或其他來源的記錄收集來自使用者的輸入,並動態地建立Web頁面。
JSP標籤可用於各種目的,如從資料庫中檢索資訊或登記的使用者偏好,存取JavaBeans元件,頁面之間傳遞控制和共用請求,網頁等之間的資訊。
JavaServer頁面往往服務於同一目的,使用通用閘道器介面(CGI)執行的方案。但相比CGI,JSP提供了幾個優點。
效能更好,因為JSP允許嵌入動態元素在HTML頁面中,而不是只有一個單獨的CGI檔案。
JSP在請求處理之前總是經過了編譯,它不同於 CGI/Perl 伺服器,需要伺服器在載入時都要解釋,並在每次請求頁面時才處理目標指令碼。
JavaServer Pages是建立在Java Servlet的API之上,所以就像Servlet,JSP也可以存取強大的企業 Java API 的所有功能,包括JDBC,JNDI,EJB,JAXP等。
JSP頁面可以結合使用servlet處理業務邏輯,通過Java servlet模板引擎所支援的模型。
最後,JSP是J2EE,企業級應用的完整平台的一個組成部分。這意味著JSP可以開發最簡單應用程式,或作為最複雜的應用程式一部分。
這個步驟包括下載Java軟體開發工具包(SDK)和安裝,並適當設定PATH環境變數。
可以從Oracle的Java網站下載SDK: Java SE 下載
另外,如果使用整合開發環境(IDE),如:Borland公司的JBuilder,Eclipse,IntelliJ IDEA,或Sun ONE Studio,編譯並執行一個簡單的程式,以確認IDE知道系統上在哪裡安裝了 Java 。
在本教學中,我們使用的是:MyEclise 8.5 試用版本,為了與本教學同步以減少出現程式碼或其它的意外的錯誤,建議在使用 MyEclipse 8.5 以同步本教學。
安裝MyEclipse開發環境比較簡單,可以從網上搜尋下載一個MyEclipse 8.5,然後安裝在一個自己喜歡的位置,在教學中安裝的位置是:D:\Program Files\MyEclipse 8.5,雙擊“myeclipse.exe”(或桌面的圖示),啟動,啟動完成後畫面如下:
第二步,啟動 MyEclipse 中的Tomcat:
成功啟動後,Tomcat 預設的Web應用程式將可以通過:http://localhost:8080/ 存取。如果一切正常,那麼它應該顯示以下結果:
這裡包括,Tomcat網站有關組態和執行Tomcat文件資訊,更多的資訊可存取:http://tomcat.apache.org
執行工程,右鍵點選工程名稱 ”HelloWord",選擇“Run As”->“MyEclipse Server Application" 或在瀏覽器中輸入:http://localhost:8080/HelloWord/ 執行結果如下圖所示:
到這裡,JSP的開發執行環境已經建立起來了。接下來可以進一步開發學習JSP的其它知識。
下面的步驟是用來說明Web伺服器是如何使用JSP建立網頁:
對於一個正常的頁面,瀏覽器傳送一個HTTP請求到全球資訊網伺服器。
網站伺服器識別HTTP請求是一個JSP頁面,並將其轉發給JSP引擎。這是通過使用URL或JSP頁面,而這個頁面使用 .jsp 字尾,而不是 .html 字尾。
JSP引擎從磁碟載入JSP頁面,並將其轉換成servlet的內容。這種轉換是很簡單的,所有的模板文字被轉換給println()語句,所有JSP元素被轉換為實現該頁面相應動態行為的Java程式碼。
JSP引擎編譯成servlet的一個可執行類並轉發原始請求到servlet引擎。
一部分Web伺服器呼叫servlet引擎載入Servlet類並執行它。在執行期間,Servlet產生HTML的格式輸出,其servlet引擎傳遞到web伺服器響應HTTP請求。
Web伺服器響應HTTP轉發靜態的HTML內容到瀏覽器。
最後的 web 瀏覽器處理HTTP響應動態生成的HTML頁面完全就像一個靜態頁面內容。
下面的圖顯示所有上述的步驟:
scriptlet可以包含任意數量的JAVA語言的語句,變數或方法宣告,或者是在頁面的指令碼語言有效表示式。
以下是Scriptlet中的語法:
<% code fragment %>
可以編寫XML程式碼相當於上述語法如下:
<jsp:scriptlet> code fragment </jsp:scriptlet>
寫的任何文字,HTML標籤或JSP元素一定在指令碼之外。以下是簡單第一個JSP的例子:
<html> <head><title>Hello World - By tw511.com</title></head> <body> Hello World!<br/> <% out.println("Your IP address is " + request.getRemoteAddr()); %> </body> </html>
現在我們來建立一個JSP檔案頁面,這個檔案名稱為:hello.jsp,讓我們儲存上面的程式碼到hello.jsp 中,整個完整的程式碼如下:
啟動Tomcat,在瀏覽器位址列中輸入:http://localhost:8080/HelloWord/hello.jsp,這將產生以下結果:
宣告一個或多個變數,或者方法可以在Java程式碼後面的JSP檔案中使用。 在JSP檔案中使用變數或方法它們之前,必須先宣告它們。
以下是JSP宣告的語法:
<%! declaration; [ declaration; ]+ ... %>
可以使用XML編寫相當於上述語法如下:
<jsp:declaration> code fragment </jsp:declaration>
下面是簡單的例子JSP宣告:
<%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %>
JSP表示式元素包含計算,轉換為字串,並插入出現在JSP檔案的指令碼語言表示式。
因為一個表示式的值被轉換為字串,可以在文字一行內使用表示式,不管它是否被標記使用在HTML,JSP檔案中。
表達元素可以包含任何Java語言規範有效的表示式,但是不能使用一個分號來結束表示式。
下面是JSP表示式的語法:
<%= expression %>
可以使用XML編寫相當於上述語法如下:
<jsp:expression> expression </jsp:expression>
這裡建立一個新的工程:jsp-base,並在index.jsp檔案中寫入以下程式碼,下面是簡單的例子JSP表示式:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP表示式 - by tw511.com</title> </head> <body> <p> 今天是:<%=(new java.util.Date()).toLocaleString()%> </p> </body> </html>
開啟瀏覽器,輸入網址:http://localhost:8080/jsp-base/index.jsp,產生以下結果:
JSP注釋標記的文字或語句都會被JSP容器忽略。當想要隱藏或“注釋掉”JSP頁面的一部分,JSP注釋是很有用的。
以下是JSP註釋語法:
<%-- This is JSP comment --%>
建立一個comment.jsp 並編寫入下面的程式碼,以測試JSP注釋:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head><title>注釋 - 範例</title></head> <body> <h2>A Test of Comments</h2> <%-- This comment will not be visible in the page source --%> </body> </html>
http://localhost:8080/jsp-base/comment.jsp
還有少數特殊的結構可以使用一些情況,插入註釋或字元,將被特殊處理。這裡有一個整理彙總:
語法 | 目的 |
---|---|
<%-- comment --%> | JSP註釋,它將被JSP引擎忽略 |
<!-- comment --> | HTML註釋,它將被瀏覽器忽略 |
<\% | 表示靜態<%的字面量 |
%\> | 表示靜態%>的字面量 |
\' | 在使用單引號在屬性中的單引號 |
\" | 雙引號在屬性使用雙引號 |
JSP指令影響的servlet類的整體結構。它通常有以下形式:
<%@ directive attribute="value" %>
有三種型別的指令標記:
指令 | 描述 |
---|---|
<%@ page ... %> | 定義頁面依賴屬性,例如指令碼語言,錯誤頁面和緩衝的要求 |
<%@ include ... %> | 包括在轉換階段的檔案 |
<%@ taglib ... %> | 宣告了一個標籤庫,包含自定義動作,用在頁面中 |
JSP動作使用XML語法結構來控制Servlet引擎的行為。可以動態地插入檔案,重用JavaBeans元件,使用者轉發到另一個頁面,或為Java外掛生成HTML。
只有一個用於動作元素的語法,因為它符合XML標準:
<jsp:action_name attribute="value" />
動作元素基本上都是預先定義函式並有以下可用的JSP操作:
語法 | 目的 |
---|---|
jsp:include | 包括頁面被一次請求的檔案 |
jsp:include | 包括頁面被一次請求的檔案 |
jsp:useBean | 查詢或範例化一個JavaBean |
jsp:setProperty | 設定一個JavaBean的屬性 |
jsp:getProperty | 插入一個JavaBean的屬性到輸出 |
jsp:forward | 轉發請求到一個新的頁面 |
jsp:plugin | 生成特定瀏覽器的程式碼,使物件或嵌入標籤Java外掛 |
jsp:element | 定義XML元素動態 |
jsp:attribute | 定義動態定義XML元素的屬性 |
jsp:body | 定義動態定義的XML元素主體 |
jsp:text | 用於編寫模板文字在JSP頁面和文件 |
我們將在單獨的章節解釋JSP動作 JSP動作
JSP支援九種自動定義的變數,這也被稱為隱式物件。這些變數是:
物件 | 描述 |
---|---|
request | 這是與請求相關聯的HttpServletRequest物件 |
response | 這是用於響應用戶端相關聯的HttpServletResponse物件 |
out | 這是用於將輸出傳送給用戶端的PrintWriter物件 |
session | 這是與請求相關聯的HttpSession物件 |
application | 這是應用程式上下文關聯的ServletContext物件 |
config | 這是與頁面關聯的ServletConfig物件 |
pageContext | 這封裝採用類似更高的效能JspWriters伺服器特定的功能 |
page | 這是一個簡單的代名詞,是用來呼叫由轉換servlet類中定義的方法 |
Exception | Exception物件允許例外的資料由JSP指定存取 |
我們將在單獨一章介紹JSP隱式物件 JSP隱式物件
JSP提供了Java的全部功能可以嵌入在Web應用程式。可以使用Java的所有API和構建塊在JSP程式設計,包括決策語句,迴圈等。
在if ... else塊開頭時就像一個普通的Scriptlet,但 Scriptlet 每一行是封閉的,包括scriptlet標記之間的HTML文字。建立一個JSP檔案為:if-else.jsp,並寫入以下程式碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%! int day = 3; %> <html> <head><title>IF...ELSE 範例</title></head> <body> <% if (day == 1 | day == 7) { %> <p> Today is weekend</p> <% } else { %> <p> Today is not weekend</p> <% } %> </body> </html>
在瀏覽器中開啟網址:http://localhost:8080/jsp-base/if-else.jsp, 產生結果如下:
現在來看以下 switch...case 塊,編寫通過使用out.println()和內小指令碼有一點不同,把下面程式碼儲存到 switch-case.jsp檔案中,程式碼詳細如下:
<%! int day = 3; %> <html> <head><title>SWITCH...CASE 範例</title></head> <body> <% switch(day) { case 0: out.println("It\'s Sunday."); break; case 1: out.println("It\'s Monday."); break; case 2: out.println("It\'s Tuesday."); break; case 3: out.println("It\'s Wednesday."); break; case 4: out.println("It\'s Thursday."); break; case 5: out.println("It\'s Friday."); break; default: out.println("It's Saturday."); } %> </body> </html>
在瀏覽器中開啟網址:http://localhost:8080/jsp-base/switch-case.jsp, 產生結果如下:
還可以使用在Java中三種基本迴圈型別塊:for, while,and do.while 塊在JSP程式設計中。
讓我們來看看下面的for迴圈範例,把下面程式碼儲存到 loop-for.jsp 檔案中,程式碼詳細如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%! int fontSize; %> <html> <head><title>FOR 迴圈範例</title></head> <body> <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %> <font color="green" size="<%= fontSize %>"> JSP Tutorial </font><br /> <%}%> </body> </html>
在瀏覽器中開啟網址:http://localhost:8080/jsp-base/loop-for.jsp, 產生結果如下:
上面的範例可以使用 while 迴圈編寫,把下面程式碼儲存到 loop-while.jsp 檔案中,程式碼詳細如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%! int fontSize; %> <html> <head><title>WHILE迴圈範例</title></head> <body> <h2>While迴圈範例:</h2> <%while ( fontSize <= 5){ %> <font color="green" size="<%= fontSize %>"> JSP Tutorial </font><br /> <%fontSize++;%> <%}%> </body> </html>
在瀏覽器中開啟網址:http://localhost:8080/jsp-base/loop-while.jsp, 產生結果如下:
JSP支援所有支援Java的邏輯和算術運算子。下表給出了所有的運算子,具有最高優先順序將排在表的頂部, 運算級別最低的放在底部。
在一個表示式中,具有更高的優先順序運算子將首先計算評估。
分類 | 操作符 | 關聯 |
---|---|---|
字尾 | () [] . (點運算子) | 左->右 |
一元 | ++ - - ! ~ | 右->左 |
乘法 | * / % | 左->右 |
加法 | + - | 左->右 |
位移 | >> >>> << | 左->右 |
關係 | > >= < <= | 左->右 |
相等 | == != | 左->右 |
位與/AND | & | 左->右 |
位XOR | ^ | 左->右 |
位OR | | | 左->右 |
邏輯AND | && | 左->右 |
邏輯OR | || | 左->右 |
關係 | ?: | 右->左 |
賦值 | = += -= *= /= %= >>= <<= &= ^= |= | 右->左 |
逗號 | , | 左->右 |
JSP表示式語言定義了以下字面量:
Boolean: true 或 false
Integer: 與Java中的一樣
Float: 與Java中的一樣
String: 單引號和雙引號; " 跳脫為 \"。' 跳脫為 \', 以及 \ 跳脫為 \\
Null: null
定義為一個 JSP 物件範圍
學習在一個JSP頁面裡面建立方法
如何在JSP頁面中使用陣列?
如何在JSP中使用Java Bean?
建立一個檔案:use-bean.jsp,其程式碼內容如下所示:
在 JSP中如何處理 Session 資料?
在JSP中如何處理 Cookies ?
如何在JSP中使用包? 這裡給出一個範例...
package mypack; public class Display { public String echoVar(String var) { return var; } }在上面的例子中,我們使用包“mypack”中的類“Counter”。在這個例子中,我們在包建立一個類“Counter”,併範例化一個範例使用“echovar”方法中顯示輸入的文字。在瀏覽器中輸入網址:http://localhost:8080/jsp-base/pack-demo.jsp ,測試輸出結果如下: