[翻譯] Sun Forum FAQ Sets – JavaServer™ Pages Technology FAQs

2007-01-22-Sun-Forum-FAQ-Sets-JavaServer-Pages-Technology-FAQs

更新說明

本篇文章為 2002 年 6 月中翻譯完成並公開分享。之後因為在 2007 年初時決定關閉該網站,所以重新整理並張貼在個人部落格中。再之後個人部落格休息了一陣子,並於今年 2023 年重新開張,所以再次重新整理。

版權及來源

中文 JSP FAQs 譯自美國昇陽公司網站所提供的 JavaServer™ Pages Technology FAQs(http://access1.sun.com/FAQSets/jspfaq.html 連結已失效。歷史存檔)。為了廣大 Java 社群能夠快速地學習交流,因此把英文的 FAQs 翻譯成中文,並且不用在任何商業用途上。如果您認為中文 JSP FAQs 已經涉及法律侵權行為,傷害到您的權利,請來信告知好讓我將其刪除。若有任何人因教學或討論等非商業行為而想要轉載中文 JSP FAQs 文章的話,亦請先來信以徵求同意。

原始網站已關閉,頁庫存檔位置:http://web.archive.org/web/20080720094326/http://access1.sun.com/FAQSets/jspfaq.html

JavaServer Pages 技術問答集

1. 最新的 JavaServer™ Pages 規格版本是幾版? 我可以在那裡找到它呢?

JSP 最新完成的規格是 2.1 版,它在 2006 年 5 月取代了 JSP 2.0 版。你可以在 http://java.sun.com/products/jsp/download.html (連結已失效)找到 JSP 2.1 版的相關訊息。

JSP 1.1 及 1.0 版可以在 http://java.sun.com/products/jsp/archive.html (連結已失效)下載。

更新:JSP 目前最新版本為 2023 年 2 月釋出的 3.1.1 版,預計 2024 年 3 月釋出 4.0 版。更多內容請參考 https://projects.eclipse.org/projects/ee4j.jsp

2. JSP 和 Java Servlet(爪哇小型伺服程式)參考實作1是什麼意思?

參考實作指的是規格書的實作版本。它的應用並不只限於 JSP 的規格,它同時也應用在許多 Sun 公司發表的規格書上。這是 Java Servlet 和 JSP 在操作上的定義和概念上的証明。它可以讓 JSP 和 Java Servlet 的發展人員用來發展和測試網站應用程式。因此每一版的 JSP 都會有一個參考實作。

官方 JSP 的參考實作是 Apache 軟體基金會(Apache Software Foundation)所製造和管理的 Tomcat ,它原本是 Jakarta 計劃的一部分。而 Jakarta 計劃的任務主要是「在開放和合作的精神下,提供架構在 Java 平台上的商業級伺服器解決方案」。

Tomcat 實作 JSP 1.1 和 Java Servlet 2.2 的版本是 3.x,Tomcat 4.x 支援到 JSP 1.2 和 Java Servlet 2.3 版,Tomcat 5.5.x 支援到 JSP 2.0 和 Java Servlet 2.4 版,而 Tomcat 6.x 支援到 JSP 2.1 和 Java Servlet 2.5 版。 你可以在 https://tomcat.apache.org/ 找到 Tomcat 的最新版本。

JSP 1.0 的官方參考實作是 JavaServer Web Development Kit(爪哇伺服器網站發展工具)1.0.1 版,你可以 https://www.oracle.com/java/technologies/java-archive-jwsdp-downloads.html 下載。而它同是也是 Java Servlet 2.1 版的參考實作。當 JSP 1.1 版的規格取代 1.0 版之後,JavaServer Web Development Kit 並沒有繼續更新。因此在使用前你應該要仔細閱讀它的發表註記(release notes)。

注意:另有一個 Java Servlet Development Kit(爪哇超小型伺服程式發展工具)是 Java Servlet 2.1 版最初的參考實作,但是它並沒有包含 JSP 技術的支援。

  1. 參考實作指的是一項規格書的實作品,例如 Tomcat 是 JSP 的實作品。通常規格書只會規定要那些功能,而實作功能的部分,就是參考實作在做的事了。例如資料庫的規格書規定要有 getString() 的方法,而實作此方法就是各個 DB Driver 所需要完成的。 ↩︎

3. 哪些工具可以用來測試以 JSP 技術為基礎的應用程式呢?

首先你必須要決定你想使用的版本,因為並不是所有的規格都支援每一項特色。一旦你做好決定後,那麼你就可以開始選擇使用那種產品或是發展工具來測試及執行你的 JSP 應用程式。現在有許多包含了 JSP 及 Java Servlet 參考實作的選擇,它們都是可供免費或商業使用的產品。關於參考實作的部分請參閱本 {link:FAQs 第二題|Java/Sun Forum FAQ Sets/JSP Technology FAQs/2}。

Orion Application Server 是提供給發展和非商業部署及配置的免費軟體,但是它並沒有開放原始碼。

關於商業上使用的產品請參閱本 {link:FAQs 第五題|Java/Sun Forum FAQ Sets/JSP Technology FAQs/5}。

4. 那些工具可以用來發展以 JSP 技術為基礎的網站應用程式呢?

有幾項 Integrated Development Environments(整合發展環境,以下簡稱 IDE)支援 JSP 和 Java Servlet 技術。下面是幾個最普遍的 IDE:

  • Eclipse(Solaris™ Operating Environment, Linux, AIX, HP-UX, Mac OS X and Win32)
  • NetBeans(Solaris™ Operating Environment, Linux, Mac OS X and Win32)
  • IntelliJ IDEA

5. 那些商業上好用工具可以配置或部署以 JSP 技術為基礎的網站應用程式呢?

在市面上有眾多的 Application Server(應用程式伺服器軟體,以下簡稱 App Server),要把它們全部列出來是不太可能的。但是我們會盡全力來維持這份清單,並且在我們獲悉有新的 App Server 時把它加入。下列是按字母排列的清單,其連結是產品銷售商的主網站。(譯註:本清單已根據原始版本並參考現況而調整,因此和原始版本有所差異)

6. 有 JSP 教學手冊(tutorials)可以使用嗎?

雖然有許多特別為發展 JSP 應用程式人員而寫的書籍,但 JSP 教學手冊在數量上比較少。昇陽 Java 網站(網站已關閉)上有名為 JavaServer™ Pages fundamentals 的教學手冊(網站已關閉),它涵括了 JSP 應用程式發展的基礎。在 JSP technology Tag Libraries(標籤函式庫,以下簡稱 Tag Lib)裡則有 Tag Lib 及 JSTL 的教學手冊(網站已關閉)。

The Java™ EE 5 Tutorial 也包含了關於 JSP 技術發展和網站組件配置的章節。(網站已關閉)

更新:其他教學手冊

7. 有任何相關的訓練課程嗎?

Sun Educational Services(昇陽教育服務,以下簡稱 SunEd)提供數名講師和網站基礎課程。這些課程是直接有關於 JSP 的技術,或者包含在 J2EE 平台網站技術課程裡的一部份。你可以參觀 Sun Training(網站已關閉)的網站並且點選你所在的國家,你將會找到在你居住區域中所有有關 Java 技術課程的細節。

更新:請改由 Oracle University 查詢。

8. 有關於 JSP 技術發展人員的認證嗎?

昇陽推出了 J2EE 平台上的 Sun Certified Web Component Developer Certification(昇陽認可的網站組件發展人員認證,簡稱 SCWD)。SCWD 是針對正在使用 JSP、Java Servlet 和自訂 Tag Lib 技術來發展網站組件及應用程式的發展人員,它涵括了 JSP 1.2 及 Java Servlet 2.3 版的規格。認證是開放給已持有 Sun Certified Programmer for the Java platform certification(昇陽認可的 Java 平台程式設計員認證,簡稱 SCJP)並通過測驗的人員。

詳細的昇陽認證可以在 http://suned.sun.com/US/certification/java/index.html (連結已失效)中找到。你可以到 Sun Training(http://www.sun.com/training/index.xml 連結已失效)去找出在你的國家裡有那些相關的昇陽認證資訊。

更新:請改由下列連結尋找相關資訊,包括 Java SE 與 Java EE 的認證資訊。

9. 有其他技術資源可供使用嗎?

昇陽公司不斷地發表新的 JSP 相關技術內容,其網站有一份 JSP 技術的完整部分。

JSP 應用發展的資源在網際網路中大量存在。每一個 App Server 製造商都提供了相當好的技術資源:不只是在他們的產品部份,同時也有一般 JSP 技術的資源。如果你有特殊的 App Server 問題,你可以在 JSP 論壇(網站已關閉)發表問題前先去參觀一下你的 App Server 製造商的網站。

TheServerSide.com 是一個極佳的 J2EE 技術社群,那兒同時也有一個可以討論有關 JSP 技術問題的討論區。

JavaWorld(已成為 InfoWorld 的一部分)刊物不停地出品大量有關 JSP 和其他 Java 技術方面的文章。

Qusay H. Mahmoud 在使用 JSP 和 XML 技術發展網站應用程式的部分發表了一系列 極佳的文章,這些文章已被 Sun’s Java Developer Connection[SM] 網站出版。它有下列幾個部分:

10. 我如何能得到技術支援?

Java technology-based Forums 是尋求技術援助的好地方,這裡以 Java 各個技術領域裡的專門知識討論而形成了一個巨大的社群。如果你有特定 J2EE 產品的問題,並且你無法從論壇裡得到幫助的話,那麼最好的方法應該是去參觀產品製造商的網站。昇陽本身在許多不同層面上提供極佳的深入支援,要獲得更多有關於這方面或消費產品的資訊,請參觀 Sun Developer Services 網站。

11. 使用 JSP 技術來編寫網頁的設計原則是什麼?

  1. JSP 標籤是有大小寫區分的差別。
  2. 標籤內的屬性值必須要用單引號或是雙引號括起來。
  3. 文件中的任何空白字元都是可忽略的。
  4. 空白不允許出現在等號和屬性值中間。
  5. 字元 “\\” 可以在標籤中做為脫逸字元(escape character)來使用。
  6. JSP 網頁中的 URL 遵循 Java Servlet 的協定而成為兩種。以 “/” 開始的叫做 context-relative(前後文相關)路徑,它是網路應用程式提供給 JSP 頁面的。(譯註:位在 http://localhost/test/ 底下的網路應用程式中, “/go.jsp” 會指向 http://localhost/test/go.jsp)
  7. 如果 URL 不是以 “/” 字元起始的話則稱為 page-relative(頁面相關),那麼它指的是與現在 JSP 網頁的相對路徑。

12. JSP 所提供的隱含物件 (implicit objects) 是什麼?

JSP 網頁提供了以 Java Servlet API 為基礎而建構的隱含物件,這些物件可以用標準變數來存取,同時在你的 JSP 網頁上可以自動地使用它們而不同撰寫額外的程式碼。

在 JSP 網頁中可用的隱含物件如下:

  • request 物件
    此物件是實作 javax.servlet.http.HttpServletRequest 介面的實體,它代表用戶端的 HTTP 要求。它的視野是 request。
  • response 物件
    此物件是實作 javax.servlet.http.HttpServletResponse 介面的實體,它代表 HTTP 回應。它符合規定地設置 HTTP 狀態碼及 JSP 網頁的標頭,並且被送達到客戶端一次。它的視野是 page。
  • pageContext 物件
    它是由 JSP 翻譯器所生成的網頁實作實體,視野是 page,並且型態是 javax.Servlet.jsp.PageContext
  • session 物件
    它是 javax.servlet.http.HttpSession 的實體,代表 HTTP 連線時期。它的視野是 session。
  • application 物件
    它是 javax.servlet.ServletContext 的實體,代表網站應用程式。它的時野是 application。
  • out 物件
    它是 javax.servlet.jsp.JspWriter 的實體,是從 JSP 頁面輸出文字到瀏覽器的物件。其緩衝區大小可經由頁面指令中的緩衝區屬性來取得。
  • config 物件
    此物件的型態是 javax.servlet.ServletConfig,是做為 JSP 網頁的設定物件。視野為 page。
  • page 物件
    它是為建置此 JSP 網頁的 servlet 物件的參照。型態是 java.lang.Object,視野為 page。
  • exception 物件
    這是在 JSP 錯誤網頁中提供給設計人員使用的物件。

譯註:上述物件的型態大部分是介面,通常都是由 JSP container 實作出這些介面,並且用實作的類別來宣告物件出來,好讓我們可以在 JSP 中直接使用這些物件。

13. JSP 框架中的 Page beans、Session beans 和 Application beans 是什麼意思?

Page Beans

Page beans 是一個和 JSP 網頁一起形成頁面內容的模組。它和使用它的 JSP 頁面緊密地整合在一起。如果同樣的內容需要以不同的形式呈現的話,那麼它們也可以在其他網頁上使用。通常 page beans 會為每一個欲被 JSP 網頁顯示的動態內容來定義 getter 方法。這些 getters 會回傳基本型態,或是回傳 JSP 網頁會負責顯示的其他複雜物件型態。

Session Beans

Session beans 屬於應用程式中的使用者連線時期物件。它和網頁內容的呈現並沒有太多的關係;相反地,它是為了保持對資源以及其他資料的參考,而這些資料可以允許使用者連線去維護並儲存其狀態。JSP 技術的 session beans 並不是直接相關於網頁發展產品,它應該看起來像是企業中介軟體或是企業中介軟體的代理人,而本身並不是企業中介軟體。

Application Beans

這是比 session beans 有更廣視野的 bean,可以為網站應用程式維持所有使用者的狀態。它通常比 session beans 更少使用,但對減少記憶體使用量和加強效能上更為有用,尤其是當許多使用者要求存取相同資料,而重新取得資料是要花費很多時間或金錢時。 Application beans 對唯讀資料來說是最好的使用方式。而用它們來掌握讀寫資料的過程亦是解決協力問題或同步瓶頸的訣竅之一。

譯註:以上只是極簡單的概念介紹,有些地方很饒舌可是又沒有說的很清楚。想要更多了解的人應該要去網站上搜尋資料以弄懂它們更細部的架構和內容。

14. JSP 技術裡頁面元素的 XML(可延伸標記語言)語法是什麼?

JSP 1.1 版規格為 JSP 網頁提供了以 XML 為基礎的等價語法,可用來取代原先指令及 scripting 元素的語法。以 XML為基礎的語法在某些前後文中是很方便的,尤其是用 XML 文件來生成 JSP 網頁的時候。

Directives

  • JSP Syntax:<%@ directiveName ATTRIBUTES %>
  • XML-based syntax:<jsp:directive:directiveName ATTRIBUTES />

Scripting Elements: Declarations

  • JSP Syntax:<%! declaration code %>
  • XML-based syntax:<jsp:declaration>declaration code</jsp:declaration>

Scripting Elements: Scriplets

  • JSP Syntax:<% scriptlet code %>
  • XML-based syntax:<jsp:scriptlet>scriptlet code</jsp:scriptlet>

Scripting Elements: Expressions

  • JSP Syntax:<%= expression code %>
  • XML-based syntax:<jsp:expression>expression code</jsp:expression>

15. 什麼是自訂標籤(custom tag)?

自訂標籤是使用者定義的 JSP 頁面元素。當一個包含自訂標籤的 JSP 網頁被轉譯成 Java Servlet 時,標籤會被轉換且對應到標籤處理器上的操作定義(呼叫方法)。而當由 JSP 網頁轉換成的 servlet 被執行時,servlet 引擎會呼叫這些操作定義。

以下是自訂標籤的功用:

  1. 可從呼叫頁面傳遞屬性來達到自訂化。
  2. 可存取 JSP 網頁上可用的所有物件。
  3. 可修改由呼叫頁面所產生的回應內容。
  4. 標籤可以互相交換訊息。你可以產生及初始化一個 JavaBeans™(爪哇豆)組件,然後在標籤內新增指向它的變數,並且接著在另一個標籤內使用它。
  5. 可互為巢狀,這允許在 JSP 網頁中彼此複雜的交互影響。
  6. 以容易使用的語法來同時封裝簡單和複雜的行為,並且大幅地簡化了 JSP 頁面的可讀性。

16. 什麼是標籤程式庫(tag library)和標籤處理器(tag handler)?

在 JSP 裡,動作(action)是可以產生及存取物件和影響輸出串流的元素。除了標準動作(stardard actions)之外,JSP 1.1 版規格還支援了稱為自訂動作(custom action)的可重複使用模組。自訂動作藉由在 JSP 頁面中使用自訂標籤(custom tag)來呼叫,而自訂標籤的集合就是標籤程式庫。可由自訂動作所完成的工作包含以下的例子:表單處理、存取資料庫和其他像是電子郵件、目錄及流程控制之類的企業服務。在還沒有自訂動作可以使用之前(在尚未規範自訂動作的標準之前),我們需要 JavaBeans 和 scriplet 結合成主要的結構才能完成像這樣的處理。

標籤程式庫有兩種型態的組件:

  • 標籤程式庫敘述器(tag library descriptor)檔案
  • 標籤處理器(tag handlers)

標籤程式庫敘述器(以下簡稱 TLD)檔案:

TLD 是描述標籤程式庫的 XML 文件,裡面包含了整個資料庫和其中每一個標籤的資訊。TLD 檔案會被 JSP container(JSP 容器)用來檢驗標籤,以及會被 JSP 頁面發展工具來使用。

標籤處理器:

標籤處理器是一個在內含標籤的 JSP 網頁執行時,會由 JSP container 去呼叫來評估自訂標籤的物件。在評估標籤的過程中,JSP 頁面的實作類別會從頁面中的不同部份去呼叫標籤處理器的方法。

當遇到自訂標籤的起始標籤時,JSP 頁面實作類別會呼叫方法來初始化適合的處理器並執行處理器中的 doStartTag 方法。當遇到自訂標籤的結尾標籤時會執行處理器的 doEndTag 方法。當標籤處理器需要和標籤內的主體互動時,則會在這之間呼叫其他額外的方法。為了要提供標籤處理器的完整功能,你必須要實作在處理標籤的不同時期裡內會呼叫的方法。

標籤處理器有允許它去與 JSP 頁面溝通的 API,而 API 的進入點是 PageContext 物件。透過它,標籤處理器能夠使用所有其他可從 JSP 頁面上存取的隱含物件(request, session, application)。隱含物件可以擁有屬性,而存取屬性則是使用 setAttribute / getAttribute 方法。如果標籤是巢狀的話,那麼標籤處理器也可以存取與框住它的處理器(呼叫 parent,譯註:getParent / setParent 方法)。標籤處理器必須實作 TagBodyTag 介面。你也可以繼承 TagSupportBodyTagSupport 類別,它們已經實作了前述的介面,因此你只需覆寫你想要的方法就可以自訂自己的處理器了。

17. 我如何在 JSP 頁面中設定 cookie?

在 JSP 網頁中設定 cookie 的方法與在 servlet 中的方法相似。下面的 scriptlet可以在用戶端設定 Hicookie cookie。

<%
Cookie Hicookie = new Cookie("aName", "aValue");
response.addCookie(Hicookie);
%>

通常 cookie 會在 JSP 網頁的開頭設定,這樣它就會在一開始時就被送出,就如同 HTTP 標頭部份一樣。

18. 我如何在 JSP 頁面中刪除 cookie?

像上一題例子中的 Hicookie 可以用下列的 scriptlet 來刪除。

<%
Cookie killHiCookie = new Cookie("Hicookie", null);
killHiCookie.setMaxAge(0);
killHiCookie.setPath("/");
response.addCookie(killHiCookie);
%>

19. 我如何能避免在瀏覽器中對 JSP 頁面使用快取功能?

你需要去設定適當的 HTTP 標頭屬性,來避免由 JSP 網頁所輸出的動態內容被瀏覽器存放到快取區中。你需要在把資料送到瀏覽器之前將下列的敘述放到頁面開頭:

<%
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma", "no-cache");
response.setDateHeader ("Expires", "Sun,26 Apl 2001 09:00:00 GMT");
//Date in the past
%>

在 IE 5.0 之中,關掉網頁快取會因為緩衝區而產生一些問題。而同時為 Mozilla 和 Internet Explorer 瀏覽器去檢查 history 設定會是比較好的做法。

20. 我能包含(include)靜態檔案到 JSP 頁面裡嗎?

有兩種方法去包含其他檔案或資源到 JSP 網頁中:include 指令和 include 行為(使用 <jsp:include>)。

include 指令(JSP 語法)

<%@ include file=<filename> %>

例如:

<%@ include file="header.html" %>
<%@ include file="banner.html" %>
<%@ include file="tableData.jsp" %>

當頁面在翻譯時期(translation time,或者說翻譯過程)被剖析時,這個指令會告訴 JSP 引擎將指定檔案的程式碼直接加進 JSP 頁面裡。這樣會把 JSP 裡的 include 指令換成檔案原始碼,也就是包含檔案到 JSP 中。翻譯時期指的是將 JSP 網頁翻譯成 Java servlet。當我們第一次要求讀取已修改過或是新撰寫的 JSP 網頁時,JSP container 會做這些翻譯的工作。如果使用 include 指令將資源包含到 JSP 裡,而後來我們又修改資源裡的內容,那麼 JSP container 將不會重新翻譯 JSP 頁面。因此重新讀取 JSP 頁面時,我們將無法看到資源被修改過後的變化。

include 行為(JSP 語法)

<jsp:include page="{relativeURL | <%= expression%>}" flush="true" />
// 或
<jsp:include page="{relativeURL | <%= expression %>}" flush="true" >
    <jsp:param name="paraName" value="{paraValue|<%= expression %>}"/>
</jsp:include>

例如:

<jsp:include page="scripts/login.jsp" />
<jsp:include page="copyright.html" />
<jsp:include page="servlet/MyServlet" />

<jsp:include page="scripts/login.jsp">
    <jsp:param name="username" value="jsmith" />
</jsp:include>

include 行為會在請求時期(request time)生效,也就是請求讀取 JSP 網頁時。與 include 指令不同的是,include 行為使用相對 URL 去指向資源位址,而資源的 URL 要在 include 行為的 page 屬性中設定。資源是能輸出資料到 HttpResponse 串流的任何東西,因此它可以是 JSP 頁面、HTML 檔案,甚至是 servlet。而唯一限制則是資源必須和 JSP 頁面一樣,要能在同一個網站應用程式之下使用。

當呼叫 include 行為時,資源的輸出會加進回應串流(request stream)裡,而回應串流會傳回給提出網頁要求的客戶端。因此如果資源是另一個 JSP 網頁或是一個 Servlet 的話,那麼它會被呼叫,所產生的輸出會加入回應串流。而如果資源是一個 HTML 檔案,那麼會加入回應串流裡的就只單純地是它的檔案內容。

重要的是要注意如果資源內容有改變的話,那麼這些改變將會在下一次讀取包含它的 JSP 頁面時看到。

如果頁面輸出會先放到緩衝區裡(意思是你已用 page 指令宣告了緩衝區的大小),而且 include 行為的 flush 屬性值是 true 的話,那麼在包含資源之前緩衝區先被填滿(flushed)。如果其值為 false 則緩衝區不會被填滿。

在 JSP 1.1 中,flush 屬性的值必須為 true。而在 JSP 1.2 版的規格裡,它的值可以是 truefalse,預設則是 true。雖然在規格書裡已定義了預設值,但是 flush 屬性是強制性的(譯註:JSP 1.1 中,flush 是強制地被設成 true)。

param 行為(<jsp:param>)可以與 include 行為一起使用來傳遞參數給資源。這些參數會加進 request 物件裡,而 request 物件在資源中是永遠可以存取的。只要資源知道參數的名字,那麼它就可以取得參數的值。

21. 我能用 JSP 技術來建立動態 GIF 圖片嗎?

如果 GIFs 圖片很少的話,你可以用 switch 敘述來決定要動態地顯示那一個 gif 檔案。

例子一:

<img src="<% switch (gifNo) { // 這一行原程式碼有錯誤,此處已更正
  case 0: %>zero.gif<%;
    break;
  case 1: %>one.gif<%;
    break;
  default: %>default.gif<%;
} %>" >

利用這個程式碼片斷,GIFs 可以在 JSP 網頁中動態地使用。上述的程式中的 gifNo 是用來決定要顯示那一個 GIF 影像。gifNo 可以從 request 中取得。在例子一裡,GIF 檔案名方直接地寫入 JSP 檔案中。處理這個問題較優雅的方法是在執行時期時重新取得檔案。

例子二:

<jsp:useBean id="imageBean" class="package.ImageBean" scope="page" />
<%
String imageNo = request.getParameter("ImageNo");
byte[] jpegArray = imageBean.getJPEG(Integer.parseInt(imageNo));
response.setContentType("image/jpeg");
ServletOutputStream op = response.getOutputStream();
op.write(jpegArray, 0, jpegArray.length);
%>

在這個例子中的 imageBean 含有 JPEG/GIF 影像的陣列內容。它們會在執行時期時依事件的不同而變化。例如,如果 GIF 影像需要依照使用者的語言或風格偏好而改變時,那麼適當的影像會載入到 bean 裡並且顯示出來。影像要經由 request 所傳遞的 ImageNo 參數來決定,而正確的 JPEG/GIF 影像可從陣列中取得並且會成為 request 的一部分來送到客戶端。

譯註:在例子一中,檔案名稱寫死在 JSP 頁面之中,因此如果類似的頁面一多的話將會造成不好維護的情況。並且 HTML code、JSP scriptlet 和檔案名混在一起也有難以閱讀的情況發生,尤其是影像檔案愈來愈多,整個程式碼愈來愈長時。因此例子一算是較「生硬」地寫法。反觀例子二,使用 Java bean 來完成。這樣我們只需要在 Java bean 的方法裡下功夫就行了,其他的眾多 JSP 網頁可以直接傳遞參數給 Java bean 來取得自己所需的影像檔,而不用理會 Java bean 裡的方法是如何實作的,也不用管影像檔放在那裡,甚至也不用知道檔名為何,Java bean 自己會依參數來選好檔案加到網頁裡。

22. 如何在 JSP 頁面中取得客戶端的位址?

你可以經由 request 物件的下列方法來取得客戶端的位址:

getRemoteAddr():取得提出要求的客戶端 IP 位址。
傳回值:String – 遠端 IP 位址

getRemoteHost():取得提出要求的客戶端完整合法名字。
傳回值:String – 遠端主機位址

這些方法可以在 JSP 網頁中用來輸出客戶端的主機名稱和 IP 位址。

例如:

<%
out.print( request.getRemoteAddr() );
out.print( request.getRemoteHost() );
%>

23. 有示範把 JSP 頁面當做網站組件來使用的應用程式樣本(sample application)嗎?

Java™ Pet Store 應用程式是一個完整的線上商店,它是寫給 Java Blue Prints for J2EE architecture(https://blueprints.dev.java.net/petstore/ 網站已關閉)的應用程式樣本,你可以在線上以及已發行的書籍 Designing Enterprise Applications with the Java 2 Platform, Enterprise Edition 中找到它的蹤跡。

Pet Strore 的所有呈現邏輯是用 Java servlet 和幾個會展現出檢視內容的 JSP 頁面來實作,位在底層的商業邏輯則交由 Enterprise JavaBeans™(簡稱 EJB)去完成。呈現邏輯非常的複雜,並且示範了一些在 JSP 網頁上相當進階的使用方法。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

2 + 9 =

返回頂端