需要上課的人員:
需要理解JSP、EL與JSTL的人員。
前言
上一篇有簡單的說過Servlet如何寫一堆簡單的Code來產生一個簡單的網頁,因為這樣子實在是太費事了,所以後來才會有JSP這種比較方便的產生網頁的方式。
JSP
JSP與PHP其實很接近,都是在HTML中插入JSP的語法,並在其中書寫JAVA的程式碼,範例如下圖:
其中用<% %>包起來的部份,是屬於JSP特有的部份,可以看到有JAVA的程式碼在其中。
JSP的運作
JSP雖然是網頁的一種,但實際上它會先被轉換為JAVA檔後,再被編譯成class檔,放置的地方會根據Web Container而有所不同,例如tomcat是被放置在tomcat/work這個資料夾,下圖是範例。
error.jsp網頁會被更名為errorjsp.java後,再被編譯成error_jsp.class檔,所以你也可以打開相應的JAVA檔,看它到底幫我們加了什麼。
JSP的語法
JSP的語法可以簡單的分為五大類:
-
<% %> →宣告要書寫JAVA語法使用。
在程式幫我們將JSP轉為JAVA檔時,這一段的程式碼會原封不動的轉到.java檔案中。
-
<%@ %> →特殊處理
這個部份有很多的用法,例如page、taglib、include等,之後再詳述。
-
<%-- --%> → 註解
常常有人搞不懂HTML的註解<!-- -->與這個JSP的註解到底差別在那裡;就我們剛剛談過的,JSP會先被轉為.java檔,再轉為class檔後,最後再輸出,而JAVA的compiler看得懂<%-- --%>,但是看不懂<!-- -->,所以一樣是註解,<%-- --%>會在JAVA的compiler轉為class檔時被過濾,但是<!-- -->不會,所以我們可以在前台的網頁的原始碼看到<!-- -->的註解,但是看不到<%-- --%>的註解
-
<%! %> → 宣告變數使用。
不需要特別解釋。
-
<%= %> →輸出變更到網頁上使用。
如果是<% %>的JSP語法,要輸出到網頁時,還需要利用out.print的方式來輸出,利用這種方式,可以不需要使用out.print的方式來輸出變數。
JSP的<%@ %>
JSP中的<%@ %>算是比較特殊的一個,因為它跟JAVA的語法沒有什麼關係,完全是為了宣告而發展出來的,所以它的性質比較接近JAVA中的package、import這一類型。
而<%@ %>這個標籤會在@後接一些關鍵字,分別是:
-
page
-
Include
-
taglib
-
jsp:include
而每一個標籤,會有可以使用的屬性,像page裡可以有
-
contentType
-
errorPage
之類的屬性,筆者把常用的標籤截圖如下:
相關的資料可以在維基百科中看到所有屬性的定義,這邊不討論。
JSP中預設的變數
在<% %>中寫JAVA的程式時,會發現有一些西不需要先宣告即可以使用,例如:request、response等,這是因為JSP中預設了這幾個變數,所以使用者可以直接使用,而且也因為這些變數名稱被使用了,所以它也是關鍵字;JSP中預設的變數有這幾樣:
-
request
-
response
-
out
-
session
-
application
-
config
-
pageContext
-
page
-
Exception
上方這些變數都是JSP中幫我們宣告完畢,所以我們可以直接拿來使用。
在工作中最常用到的JSP語法
這樣簡單的談完JSP後,在這邊告訴大家,在這五種JSP宣告中,有那幾種是筆者最常用到(這個才是重點吧),答案是:<%-- --%>註解這一種。
而第二個常用的JSP宣告是<%@ %>,雖說是常用,但通常只是用第JSP頁面上的第一行,宣告一下UTF-8編碼而已,再加上最常用的是註解的標籤,所以實際上筆者在寫JSP頁面時,幾乎沒有用到JSP語法了;這是為什麼呢?因為JSP的宣告,以程式面來說,仍然是很麻煩的,下方以一個例子來說:
<input type=”text” name=”username” value=”<% out.print(username);%>” />
或是
<input type=”text” name=”username” value=”<%=username%>” />
這一類的寫法,是可以再精簡的,JAVA為了更精簡這一類的寫法,發展了一套Expression Language(簡稱EL)。
Expression Language
Expression Language(簡稱EL)是JAVA為了再精簡JSP語法,而發展的一套用在JSP網頁中的語法,它的用法很簡單,就是用${ },這樣的符號來包裝起來,這樣JSP就能解讀它是EL而進行程式的處理,所以上方的JSP範例會變成:
<input type=”text” name=”username” value=”${usrname}” />
EL的好處
EL的做用概括來說,就是包含了<% %>與<%= %>這二種JSP,只不過它不像<% %>這種標籤一樣,能夠寫多行的JAVA code,它比較偏向<%= %>的標籤,但是又比它強大,因為EL套用了JAVA Reflection(映射)機制,所以可以透過簡單的語法,來取得相對應的物件,以下方的程式碼為例:
假設有一個employee物件,並執行了request.setAttribue("employee",employee),這時候要在網頁中取得它的name時,只需要寫成${employee.name}即可,它會去取得相對應的值;並且在執行時會以try catch的機制處理,所以不用怕會造成網頁的Crash。
EL的隱含變數
跟JSP一樣,EL有一些預設的變數是可以直接使用旳,記述如下:
-
pageContext
-
pageScope
-
requestScope
-
sessionScope
-
applicationScope
-
param
-
paramValues
-
header
-
headerValues
-
cookie
-
initParam
共11種,不過這是為了滿足讀者的求知慾而列下來的,實際上在寫程式時,最常使用的,還是像剛剛的例子${employee.name}一樣,直接取得request中的attribute中的物件及其對應的值。
不過EL雖然很方便,但是因為它不能寫多行的程式,所以沒辦法滿足開發人員的需求,所以又有人研發了一套JSP Standard Tag Library,即標籤語法,來簡化JSP中的寫法,並能處理大量的程式碼。
JSP Standard Tag Library(JSTL)
JSP Standard Tag Library簡稱為JSTL,跟 HTML與XML很類似,是一種標籤式的語言,下方是一種使用JSTL的例子:
其中的<c:if … > </c:if>就是JSTL。
JSTL的宣告與原理
JSTL要使用在JSP之前,必須在JSP裡面進行宣告,宣告的方法如下:
透過JSP的<%@ taglib … %>來進行宣告,此時會帶入二個屬性:
-
prefix:這個屬性可以自行定義,影響的範圍是本頁JSP。利用宣告prefix來決定標籤的開頭。
-
uri:這個屬性是以http為開頭,但它並不是實際上可以呼叫的網址,比較屬於JAVA中的package,用來區分每一個JSTL使用,但是它也不是沒有意義的,這個我們在下方會做說明。
宣告完之後,就能在JSP中使用JTSL語法。
JSTL必須搭配一個XML檔,通常以tld為副檔名,這個XML需要放在固定的路徑下,如果是JAR檔的話,會被放在META-INF裡,如下圖:
如果是自訂的tld檔,需要放在WEB-INF/tags裡,如下圖:
而在tld這個XML裡,會定義一個uri如下圖:
這個uri就是我們在JSP的taglib中宣告的uri,所以我們剛剛看到的:
可以看到這兩個uri長得一模一樣。
而tld檔裡也定義了它可以使用什麼,例如以<c:if …> </c:if>這個JSTL為例,我們可以在這個tld檔找到如下的資訊:
首先是它的name為if,它有一個屬性叫test,而且是必須要有的(required),可以參數內容可以接受EL(rtexprvalue),這一類的資料,都能在tld檔中找到。
而在tld檔中,也同時宣告了這個tag需要那一個JAVA程式去接收,以上方的<c:if>為例,它最後處理的程式為:
換句話說,它還是回到JAVA的程式去處理了。
JSP、EL、JSTL與工作
基本上為了簡化JAVA在Server程式上的撰寫,所以從Servlet進化到JSP,再延伸出EL與JSTL,但真的在工作上常用到的,大部份是EL與JSTL,反而JSP比較不常使用,因為所有的JSP程式,都可以被JSTL取代,而且使用這些標籤語法,會使JSP網頁看起來比較乾淨(不一定比較好閱讀,尤其對新人來說),所以以筆者個人來說,基本上在寫JSP網頁時,根本不會去宣告<% %>這一類的JSP語法,大不了是使用<%-- --%>這種JSP的註解而己,也因為不使用JSP了,所以EL與JSTL反而更顯重要。
而JSTL在Eclipse中,可以利用「Alt」+「/」 這種快速鍵來顯示相對應的建議,下圖是在JSP頁面中的display tag裡,按Alt + / 的快速鍵顯示的內容:
它會幫我們把tld檔中有宣告的屬性及描述顯示出來,讓我們可以快速查詢可以使用的屬性。
留言列表