close

需要上課的人員:

需要理解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的語法可以簡單的分為五大類:

  1. <% %> →宣告要書寫JAVA語法使用。

在程式幫我們將JSP轉為JAVA檔時,這一段的程式碼會原封不動的轉到.java檔案中。

  1. <%@ %> →特殊處理

這個部份有很多的用法,例如page、taglib、include等,之後再詳述。

  1. <%--  --%> → 註解

常常有人搞不懂HTML的註解<!-- -->與這個JSP的註解到底差別在那裡;就我們剛剛談過的,JSP會先被轉為.java檔,再轉為class檔後,最後再輸出,而JAVA的compiler看得懂<%-- --%>,但是看不懂<!-- -->,所以一樣是註解,<%-- --%>會在JAVA的compiler轉為class檔時被過濾,但是<!-- -->不會,所以我們可以在前台的網頁的原始碼看到<!-- -->的註解,但是看不到<%-- --%>的註解

  1. <%! %> → 宣告變數使用。

不需要特別解釋。

  1. <%= %> →輸出變更到網頁上使用。

如果是<% %>的JSP語法,要輸出到網頁時,還需要利用out.print的方式來輸出,利用這種方式,可以不需要使用out.print的方式來輸出變數。

JSP的<%@ %>

JSP中的<%@ %>算是比較特殊的一個,因為它跟JAVA的語法沒有什麼關係,完全是為了宣告而發展出來的,所以它的性質比較接近JAVA中的package、import這一類型。

而<%@ %>這個標籤會在@後接一些關鍵字,分別是:

  1. page

  2. Include

  3. taglib

  4. jsp:include

而每一個標籤,會有可以使用的屬性,像page裡可以有

  1. contentType

  2. errorPage

之類的屬性,筆者把常用的標籤截圖如下:

相關的資料可以在維基百科中看到所有屬性的定義,這邊不討論。

JSP中預設的變數

在<% %>中寫JAVA的程式時,會發現有一些西不需要先宣告即可以使用,例如:request、response等,這是因為JSP中預設了這幾個變數,所以使用者可以直接使用,而且也因為這些變數名稱被使用了,所以它也是關鍵字;JSP中預設的變數有這幾樣:

  1. request

  2. response

  3. out

  4. session

  5. application

  6. config

  7. pageContext

  8. page

  9. 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有一些預設的變數是可以直接使用旳,記述如下:

  1. pageContext

  2. pageScope

  3. requestScope

  4. sessionScope

  5. applicationScope

  6. param

  7. paramValues

  8. header

  9. headerValues

  10. cookie

  11. 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 … %>來進行宣告,此時會帶入二個屬性:

  1. prefix:這個屬性可以自行定義,影響的範圍是本頁JSP。利用宣告prefix來決定標籤的開頭。

  2. 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檔中有宣告的屬性及描述顯示出來,讓我們可以快速查詢可以使用的屬性。

arrow
arrow
    創作者介紹
    創作者 JAVA Programmer 的頭像
    JAVA Programmer

    台灣的Web工程師

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()