<p><b>JSP</b>（全稱<b>J</b>akarta <b>S</b>erver <b>P</b>ages，曾稱為<b>J</b>ava<b>S</b>erver <b>P</b>ages）是由Sun Microsystems公司主導建立的一種動態網頁技術標準。JSP部署於網路伺服器上，可以回應客戶端傳送的請求，並根據請求內容動態地生成HTML、XML或其他格式文件的Web網頁，然後返回給請求者。JSP技術以Java語言作為手稿語言，為使用者的HTTP請求提供服務，並能與伺服器上的其它Java程式共同處理複雜的業務需求。
</p><p>JSP將Java程式碼和特定變動內容嵌入到靜態的頁面中，實現以靜態頁面為模板，動態生成其中的部分內容。JSP引入了被稱為「JSP動作」的XML標籤，用來呼叫內建功能。另外，可以建立JSP標籤庫，然後像使用標準HTML或XML標籤一樣使用它們。標籤庫能增強功能和伺服器效能，而且不受跨平台問題的限制。JSP檔案在執行時會被其編譯器轉換成更原始的Servlet程式碼。JSP編譯器可以把JSP檔案編譯成用Java程式碼寫的Servlet，然後再由Java編譯器來編譯成能快速執行的二進位機器碼，也可以直接編譯成二進位碼。
</p>


<h2><span id=".E7.BB.BC.E8.BF.B0"></span><span id="综述">綜述</span></h2>
<p>JSP從2.0版本開始，增加了表達式語言（EL），以提供更快更簡單的建立新標籤的方法，並允許開發者建立Velocity式模板。如舊版本代碼「<code>Hello, &lt;%=request.getParameter("visitor")%&gt;</code>」可簡化為「<code>Hello, ${param.visitor}”</code>。
</p>
<h2><span id=".E7.89.B9.E7.82.B9"></span><span id="特点">特點</span></h2>
<ul><li>能以模板化的方式簡單、高效地添加動態網頁內容。</li>
<li>可利用JavaBean和標籤庫技術復用常用的功能代碼（設計好的組件容易實現重複利用，減少重複勞動）。標籤庫不僅帶有通用的內建標籤（JSTL)，而且支援可延伸功能的自訂標籤。</li>
<li>有良好的工具支援。</li>
<li>繼承了Java語言的相對易用性。</li>
<li>繼承了Java的跨平台優勢，實現「一次編寫，處處執行」。因為支援Java及其相關技術的開發平台多，網站開發人員可以選擇在最適合自己的系統平台上進行JSP開發；不同環境下開發的JSP專案，在所有客戶端上都能順利存取。</li>
<li>頁面中的動（控制變動內容的部分）／靜（內容不需變動的部分）區域以分散但又有序的形式組合在一起，能使人更直觀地看出頁面代碼的整體結構，也使得設計頁面效果和程式邏輯這2部分工作容易分離（外觀視圖與邏輯分離）。從而方便分配人員並行揮各自長處，實現高效地分工合作。</li>
<li>可與其它企業級Java技術相互配合。JSP可以只專門負責頁面中的資料呈現，實現分層開發。</li></ul><h2><span id=".E5.8C.85.E5.90.AB.E5.86.85.E5.AE.B9"></span><span id="包含内容">包含內容</span></h2>
<h3><span id="JSP.E6.8C.87.E4.BB.A4"></span><span id="JSP指令">JSP指令</span></h3>
<p>JSP指令控制JSP編譯器如何去生成servlet，以下是可用的指令：
</p>
<ul><li>包含指令include –包含指令通知JSP編譯器把另外一個檔案完全包含入當前檔案中。效果就好像被包含檔案的內容直接被貼上到當前檔案中一樣。這個功能和C預處理器所提供的很類似。被包含檔案的副檔名一般都是"jspf"（即JSP <b>Fragment</b>，JSP片段）:</li></ul>
<ul><li>頁面指令page –頁面指令有以下幾個選項：</li></ul>
<p><b>注意：</b>在同一個JSP檔案中只有「import」匯入頁面指令可以被多次使用。
</p>
<ul><li>標籤庫指令taglib –標籤庫指令描述了要使用的JSP標籤庫。該指令需要指定一個字首prefix（和C++的命名空間很類似）和標籤庫的描述URI:</li></ul>
<h3><span id="JSP.E8.84.9A.E6.9C.AC.E5.85.83.E7.B4.A0.E5.92.8C.E5.8F.98.E9.87.8F"></span><span id="JSP脚本元素和变量">JSP指令碼元素和變數</span></h3>
<h4><span id=".E6.A0.87.E5.87.86.E8.84.9A.E6.9C.AC.E5.8F.98.E9.87.8F"></span><span id="标准脚本变量">標準指令碼變數</span></h4>
<p>以下是永遠可用的指令碼變數：
</p>
<ul><li>out：JSPWriter，用來寫入回應流的資料</li>
<li>page：servlet自身</li>
<li>pageContext：一個PageContext實例包括和整個頁面相聯絡的資料，一個給定的HTML頁面可以在多個JSP之間傳遞。</li>
<li>request：HTTP request（請求）物件</li>
<li>response：HTTP response（回應）物件</li>
<li>session：HTTP session（伺服器端對談）物件</li></ul><h4><span id=".E8.84.9A.E6.9C.AC.E5.85.83.E7.B4.A0"></span><span id="脚本元素">指令碼元素</span></h4>
<p>有三個基本的指令碼元素，作用是使JAVA代碼可以直接插入servlet.
</p>
<ul><li>一種是聲明標籤，在JAVA SERVLET的類體中放入一個變數的定義。靜態的資料成員也可以如此定義。
<dl><dd></dd></dl></li>
<li>一種是指令碼標籤，在JAVA SERVLET的類的_jspService()方法中放入所包含的語句。
<dl><dd></dd></dl></li>
<li>一種是表達式標籤，在JAVA SERVLET的類中放入待賦值的表達式，表達式注意不能以分號結尾。
<dl><dd></dd></dl></li></ul><h3><span id="JSP.E5.8A.A8.E4.BD.9C"></span><span id="JSP动作">JSP動作</span></h3>
<p>JSP動作是一系列可以呼叫內建於網路伺服器中的功能的XML標籤。JSP提供了以下動作：
</p>
<h4><span id=".E6.A0.87.E7.AD.BE.E6.A0.B7.E4.BE.8B"></span><span id="标签样例">標籤樣例</span></h4>
<h5><span id="jsp:include">jsp:include</span></h5>

<h5><span id="jsp:forward">jsp:forward</span></h5>

<p>在本例中，請求被傳遞到"subpage.jsp"，而且請求的處理權不會再返回前者。
</p>
<h5><span id="jsp:useBean">jsp:useBean</span></h5>

<p>scope屬性可以是request, page, session or application，它有以下用意：
</p>
<ul><li>request— 該屬性在請求的生命周期內有效，一旦請求被所有的JSP頁處理完後，那麼該屬性就不可參照。</li>
<li>page— 該屬性只是當前頁中有效。</li>
<li>session— 該屬性在使用者對談的生命周期內有效。</li>
<li>application— 該屬性在各種情況下都有效，並且永遠不會被變為不可參照，和全域變數global variable相同。</li></ul><p>上述例子將會用一個建立一個類別的實例，並且把該實例儲存在屬性中，該屬性將在該請求的生命周期內有效。它可以在所有被包含或者從首頁面（最先接收請求的頁面）轉向到的JSP頁之間共享。
</p>
<h3><span id="JSP.E6.A0.87.E7.AD.BE.E5.BA.93"></span><span id="JSP标签库">JSP標籤庫</span></h3>
<p>除了JSP預定義動作之外，開發者還可以使用JSP標籤擴充API添加他們自訂的<i>動作</i>。開發者寫一種實現一個標籤的介面和一個標籤庫的XML描述檔案的JAVA類，這就能指定標籤和實現標籤的JAVA類
請看如下JSP：
</p>

<p>JSP編譯器將會載入mytaglib.tld這個XML檔案，然後可以看到標籤<i>myaction</i>由JAVA類<i>MyActionTag</i>實現。當該標籤首次在檔案中使用時，將會建立一個MyActionTag的實例。然後（而且當每次該標籤被使用時），當出現開始標籤時，將會呼叫doStartTag()方法，根據開始標籤的結果，來決定如何處理標籤的主體。主體是指開始標籤和結束標籤之間的文字。這個doStartTag()方法將會返回如下之一：
</p>
<ul><li>SKIP_BODY - 標籤之間不做處理。</li>
<li>EVAL_BODY_INCLUDE - 對標籤之內主體進行賦值。</li>
<li>EVAL_BODY_TAG - 對標籤之內主體進行賦值並把結果輸出到流（儲存在標籤的主體內容屬性中）。</li></ul><dl><dd><b>注意：</b>如果標籤擴充了BodyTagSupport類，當主體被執行時會在呼叫doEndTag()之前呼叫doAfterBody()方法。該方法用於實現迴圈結構。</dd></dl><p>當結束標籤出現時，它會呼叫doEndTag()方法，該方法會返回如下兩做之一：
</p>
<ul><li>EVAL_PAGE - 表示JSP檔案的剩餘部份將會被執行。this indicates that the rest of the JSP file should be processed.</li>
<li>SKIP_PAGE - 表示將不會再有更多執行操作。當前JSP頁交出控制權。就象在轉發動作中的作用一樣。</li></ul><p>上述myaction標籤tag會有一個類似下面例子的用於實現的類：
</p>

<h2><span id=".E6.9C.AC.E5.9C.B0.E5.8C.96"></span><span id="本地化">在地化</span></h2>
<p>JSP的在地化是通過和JAVA應用程式相同的方式完成的，即使用資源包。
</p>
<h2><span id=".E6.A8.A1.E5.9E.8B-.E8.A7.86.E5.9B.BE-.E6.8E.A7.E5.88.B6.E5.99.A8_.E6.A8.A1.E5.BC.8F"></span><span id="模型-视图-控制器_模式">模型-視圖-控制器 模式</span></h2>
<p>為了把表現層（presentation）從請求處理（request processing）和資料儲存（data storage）中分離開來（這樣更利於開發、查錯和功能擴充），昇陽公司推薦在JSP檔案中使用一種稱作模型-視圖-控制器（MVC）的架構模式。按照此設計，當使用者存取網站上的特定網址時，使用者的處理請求會先由網站伺服器取得到，然後先交由網站的控制器程式作初步處理。使用者的存取請求可能多種多樣，比如查詢資訊或進行資料計算都是常見的網站業務。控制器程式會初步判斷使用者請求的種類，然後把使用者請求轉發給與特定業務對應的Servlet程式或者另一個獨立的JSP檔案進行業務處理。當請求處理完後，再通過一個專門負責輸出資訊的JSP頁以清晰、美觀的方式向使用者的瀏覽器輸出結果。簡而言之，先由控制器攔截使用者請求並做初步判斷，再由業務處理程式存取資料（從資料庫中存取）和處理業務，最後由視圖組件生成結果頁面並行送結果給使用者。其中JSP一般用作展示輸出結果，可以用於展示經Servlet查詢或處理後的結果；也可以用一個JSP檔案處理業務邏輯，再用另一個JSP檔案展示結果。按功能做這樣的檔案拆分（而非由一個臃腫的JSP頁面包攬所有功能）是為了便於團隊分工。MVC本身是一種由來已久的設計思想，基於JSP的技術只是實現MVC架構的流行方案之一。Struts和Spring框架等好幾種流行的網站建設框架都是基於MVC模式設計的。
</p>
<h2><span id="JSP.E5.92.8CServlets"></span><span id="JSP和Servlets">JSP和Servlets</span></h2>
<p>從架構上說，JSP可以被看作是從Servlets進階提煉而作為JAVA Servlet 2.1 API的擴充而應用。Servlets和JSP最早都是由Sun Microsystems（太陽公司）開發的。從JSP1.2版本以來，JSP處於Java Community Process（有人譯為：Java社群組織）開發模式下。JSR-53規定了JSP 1.2和Servlet 2.4的規範，JSR-152規定了JSP 2.0的規範。2006年5月，JSP 2.1的規範作為Java EE 5的一部份，在JSR-245中發布。
</p><p>靜態資料在輸入檔案中的內容和輸出給HTTP回應的內容完全一致。此時，該JSP輸入檔案會是一個沒有內嵌JAVA或動作的HTML頁面。而且，客戶端每次請求都會得到相同的回應內容。
</p>
<h3><span id=".E6.A0.B7.E4.BE.8B"></span><span id="样例">樣例</span></h3>
<p>不管JSP編譯器是生成SERVLET的JAVA原始碼，或者是直接發布二進位碼，了解一下JSP編譯器是如何把檔案轉換成一個JAVA SERVLET，都是很有幫助的。例如，看一下如下輸入JSP和它最後生成的JAVA SERVLET：
</p><p><b>Input JSP</b>
</p>

<p><b>Resulting servlet</b>
</p>

<h2><span id=".E5.8F.82.E8.A7.81"></span><span id="参见">參見</span></h2>
<ul><li>JSTL</li>
<li>Java企業版</li>
<li>JavaServer Faces</li>
<li>Java Servlet</li>
<li>SSJS</li>
<li>WAR (file format)</li>
<li>EAR (file format)</li>
<li>JAR (file format)</li>
<li>Tomcat伺服器</li></ul><h2><span id=".E5.8F.82.E8.80.83.E8.B5.84.E6.96.99"></span><span id="参考资料">參考資料</span></h2>
<h3><span id=".E6.96.87.E5.86.85.E5.BC.95.E7.94.A8"></span><span id="文内引用">文內參照</span></h3>

<h3><span id=".E4.B9.A6.E7.9B.AE"></span><span id="书目">書目</span></h3>
<ul><li><cite id="CITEREFChung2013" class="citation book">Kin-man Chung. JavaServer Pages Specification <span>(pdf)</span> 2.3. 甲骨文公司. 2013 <span> [2018年3月16日]</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fzh.wikipedia.org%3AJSP&amp;rft.au=Kin-man+Chung&amp;rft.btitle=JavaServer+Pages+Specification&amp;rft.date=2013&amp;rft.edition=2.3&amp;rft.genre=book&amp;rft.pub=%E7%94%B2%E9%AA%A8%E6%96%87%E5%85%AC%E5%8F%B8&amp;rft_id=http%3A%2F%2Fdownload.oracle.com%2Fotn-pub%2Fjcp%2Fjsp-2_3-mrel2-eval-spec%2FJSP2.3MR.pdf%3FAuthParam%3D1521190349_afb5d530a382ea96a037b5029e4bbab8&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"><span> </span></span></li>
<li><cite class="citation book">Hans Bergsten. JavaServer Pages 3. Sebastopol, California: O'Reilly. 2003 <span> [<span>2006-07-20</span>]</span>. <span title="國際標準書號">ISBN</span> 0-596-00563-6. （原始內容存檔於2019-10-17）.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fzh.wikipedia.org%3AJSP&amp;rft.au=Hans+Bergsten&amp;rft.btitle=JavaServer+Pages&amp;rft.date=2003&amp;rft.edition=3&amp;rft.genre=book&amp;rft.isbn=0-596-00563-6&amp;rft.place=Sebastopol%2C+California&amp;rft.pub=O%27Reilly&amp;rft_id=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0596005636&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"><span> </span></span></li></ul><p><br></p>
<h2><span id=".E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5"></span><span id="外部链接">外部連結</span></h2>
<ul><li>Sun's JSP product description（頁面存檔備份，存於網際網路檔案館）</li>
<li>JSR 245（頁面存檔備份，存於網際網路檔案館） (JSP 2.1)</li>
<li>JSR 152（頁面存檔備份，存於網際網路檔案館） (JSP 2.0)</li>
<li>JSR 53（頁面存檔備份，存於網際網路檔案館） (JSP 1.2)</li></ul><!-- 
NewPP limit report
Parsed by mw1378
Cached time: 20230505225900
Cache expiry: 3662
Reduced expiry: true
Complications: [vary‐revision‐sha1, show‐toc]
CPU time usage: 0.731 seconds
Real time usage: 1.199 seconds
Preprocessor visited node count: 2177/1000000
Post‐expand include size: 294269/2097152 bytes
Template argument size: 2835/2097152 bytes
Highest expansion depth: 23/100
Expensive parser function count: 31/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 20837/5000000 bytes
Lua time usage: 0.269/10.000 seconds
Lua memory usage: 7555361/52428800 bytes
Number of Wikibase entities loaded: 1/400
--><!--
Transclusion expansion time report (%,ms,calls,template)
100.00%  870.171      1 -total
 18.79%  163.488      1 Template:Infobox_file_format
 18.36%  159.783      1 Template:Infobox
 11.76%  102.354      1 Template:Official_URL
 11.41%   99.266      1 Template:NoteTA
 11.20%   97.448      5 Template:Navbox
  7.57%   65.856      1 Template:Java_(Sun)
  6.94%   60.365      3 Template:URL
  6.09%   53.023      3 Template:Ifempty
  5.94%   51.653      3 Template:Ambox
-->
**JSP**（全稱 **J**akarta **S**erver **P**ages，曾稱為 **J**ava**S**erver **P**ages）是由 Sun Microsystems 公司主導建立的一種動態網頁技術標準。JSP 部署於網路伺服器上，可以回應客戶端傳送的請求，並根據請求內容動態地生成 HTML、XML 或其他格式文件的 Web 網頁，然後返回給請求者。JSP 技術以 Java 語言作為手稿語言，為使用者的 HTTP 請求提供服務，並能與伺服器上的其它 Java 程式共同處理複雜的業務需求。

JSP 將 Java 程式碼和特定變動內容嵌入到靜態的頁面中，實現以靜態頁面為模板，動態生成其中的部分內容。JSP 引入了被稱為「JSP 動作」的 XML 標籤，用來呼叫內建功能。另外，可以建立 JSP 標籤庫，然後像使用標準 HTML 或 XML 標籤一樣使用它們。標籤庫能增強功能和伺服器效能，而且不受跨平台問題的限制。JSP 檔案在執行時會被其編譯器轉換成更原始的 Servlet 程式碼。JSP 編譯器可以把 JSP 檔案編譯成用 Java 程式碼寫的 Servlet，然後再由 Java 編譯器來編譯成能快速執行的二進位機器碼，也可以直接編譯成二進位碼。

## 綜述

JSP 從 2.0 版本開始，增加了表達式語言（EL），以提供更快更簡單的建立新標籤的方法，並允許開發者建立 Velocity 式模板。如舊版本代碼「`Hello, <%=request.getParameter("visitor")%>`」可簡化為「`Hello, ${param.visitor}”`。

## 特點

* 能以模板化的方式簡單、高效地添加動態網頁內容。
* 可利用 JavaBean 和標籤庫技術復用常用的功能代碼（設計好的組件容易實現重複利用，減少重複勞動）。標籤庫不僅帶有通用的內建標籤（JSTL)，而且支援可延伸功能的自訂標籤。
* 有良好的工具支援。
* 繼承了 Java 語言的相對易用性。
* 繼承了 Java 的跨平台優勢，實現「一次編寫，處處執行」。因為支援 Java 及其相關技術的開發平台多，網站開發人員可以選擇在最適合自己的系統平台上進行 JSP 開發；不同環境下開發的 JSP 專案，在所有客戶端上都能順利存取。
* 頁面中的動（控制變動內容的部分）／靜（內容不需變動的部分）區域以分散但又有序的形式組合在一起，能使人更直觀地看出頁面代碼的整體結構，也使得設計頁面效果和程式邏輯這 2 部分工作容易分離（外觀視圖與邏輯分離）。從而方便分配人員並行揮各自長處，實現高效地分工合作。
* 可與其它企業級 Java 技術相互配合。JSP 可以只專門負責頁面中的資料呈現，實現分層開發。

## 包含內容

### JSP 指令

JSP 指令控制 JSP 編譯器如何去生成 servlet，以下是可用的指令：

* 包含指令 include –包含指令通知 JSP 編譯器把另外一個檔案完全包含入當前檔案中。效果就好像被包含檔案的內容直接被貼上到當前檔案中一樣。這個功能和 C 預處理器所提供的很類似。被包含檔案的副檔名一般都是 "jspf"（即 JSP **Fragment**，JSP 片段）:

* 頁面指令 page –頁面指令有以下幾個選項：

**注意：**在同一個 JSP 檔案中只有「import」匯入頁面指令可以被多次使用。

* 標籤庫指令 taglib –標籤庫指令描述了要使用的 JSP 標籤庫。該指令需要指定一個字首 prefix（和 C++ 的命名空間很類似）和標籤庫的描述 URI:

### JSP 指令碼元素和變數

#### 標準指令碼變數

以下是永遠可用的指令碼變數：

* out：JSPWriter，用來寫入回應流的資料
* page：servlet 自身
* pageContext：一個 PageContext 實例包括和整個頁面相聯絡的資料，一個給定的 HTML 頁面可以在多個 JSP 之間傳遞。
* request：HTTP request（請求）物件
* response：HTTP response（回應）物件
* session：HTTP session（伺服器端對談）物件

#### 指令碼元素

有三個基本的指令碼元素，作用是使 JAVA 代碼可以直接插入 servlet.

* 一種是聲明標籤，在 JAVA SERVLET 的類體中放入一個變數的定義。靜態的資料成員也可以如此定義。

　
:
* 一種是指令碼標籤，在 JAVA SERVLET 的類的 \_jspService () 方法中放入所包含的語句。

　
:
* 一種是表達式標籤，在 JAVA SERVLET 的類中放入待賦值的表達式，表達式注意不能以分號結尾。

　
:

### JSP 動作

JSP 動作是一系列可以呼叫內建於網路伺服器中的功能的 XML 標籤。JSP 提供了以下動作：

#### 標籤樣例

##### jsp:include

##### jsp:forward

在本例中，請求被傳遞到 "subpage.jsp"，而且請求的處理權不會再返回前者。

##### jsp:useBean

scope 屬性可以是 request, page, session or application，它有以下用意：

* request— 該屬性在請求的生命周期內有效，一旦請求被所有的 JSP 頁處理完後，那麼該屬性就不可參照。
* page— 該屬性只是當前頁中有效。
* session— 該屬性在使用者對談的生命周期內有效。
* application— 該屬性在各種情況下都有效，並且永遠不會被變為不可參照，和全域變數 global variable 相同。

上述例子將會用一個建立一個類別的實例，並且把該實例儲存在屬性中，該屬性將在該請求的生命周期內有效。它可以在所有被包含或者從首頁面（最先接收請求的頁面）轉向到的 JSP 頁之間共享。

### JSP 標籤庫

除了 JSP 預定義動作之外，開發者還可以使用 JSP 標籤擴充 API 添加他們自訂的_動作_。開發者寫一種實現一個標籤的介面和一個標籤庫的 XML 描述檔案的 JAVA 類，這就能指定標籤和實現標籤的 JAVA 類
請看如下 JSP：

JSP 編譯器將會載入 mytaglib.tld 這個 XML 檔案，然後可以看到標籤 _myaction_ 由 JAVA 類 _MyActionTag_ 實現。當該標籤首次在檔案中使用時，將會建立一個 MyActionTag 的實例。然後（而且當每次該標籤被使用時），當出現開始標籤時，將會呼叫 doStartTag () 方法，根據開始標籤的結果，來決定如何處理標籤的主體。主體是指開始標籤和結束標籤之間的文字。這個 doStartTag () 方法將會返回如下之一：

* SKIP\_BODY - 標籤之間不做處理。
* EVAL\_BODY\_INCLUDE - 對標籤之內主體進行賦值。
* EVAL\_BODY\_TAG - 對標籤之內主體進行賦值並把結果輸出到流（儲存在標籤的主體內容屬性中）。

　
: **注意：**如果標籤擴充了 BodyTagSupport 類，當主體被執行時會在呼叫 doEndTag () 之前呼叫 doAfterBody () 方法。該方法用於實現迴圈結構。

當結束標籤出現時，它會呼叫 doEndTag () 方法，該方法會返回如下兩做之一：

* EVAL\_PAGE - 表示 JSP 檔案的剩餘部份將會被執行。this indicates that the rest of the JSP file should be processed.
* SKIP\_PAGE - 表示將不會再有更多執行操作。當前 JSP 頁交出控制權。就象在轉發動作中的作用一樣。

上述 myaction 標籤 tag 會有一個類似下面例子的用於實現的類：

## 在地化

JSP 的在地化是通過和 JAVA 應用程式相同的方式完成的，即使用資源包。

## 模型 - 視圖 - 控制器 模式

為了把表現層（presentation）從請求處理（request processing）和資料儲存（data storage）中分離開來（這樣更利於開發、查錯和功能擴充），昇陽公司推薦在 JSP 檔案中使用一種稱作模型 - 視圖 - 控制器（MVC）的架構模式。按照此設計，當使用者存取網站上的特定網址時，使用者的處理請求會先由網站伺服器取得到，然後先交由網站的控制器程式作初步處理。使用者的存取請求可能多種多樣，比如查詢資訊或進行資料計算都是常見的網站業務。控制器程式會初步判斷使用者請求的種類，然後把使用者請求轉發給與特定業務對應的 Servlet 程式或者另一個獨立的 JSP 檔案進行業務處理。當請求處理完後，再通過一個專門負責輸出資訊的 JSP 頁以清晰、美觀的方式向使用者的瀏覽器輸出結果。簡而言之，先由控制器攔截使用者請求並做初步判斷，再由業務處理程式存取資料（從資料庫中存取）和處理業務，最後由視圖組件生成結果頁面並行送結果給使用者。其中 JSP 一般用作展示輸出結果，可以用於展示經 Servlet 查詢或處理後的結果；也可以用一個 JSP 檔案處理業務邏輯，再用另一個 JSP 檔案展示結果。按功能做這樣的檔案拆分（而非由一個臃腫的 JSP 頁面包攬所有功能）是為了便於團隊分工。MVC 本身是一種由來已久的設計思想，基於 JSP 的技術只是實現 MVC 架構的流行方案之一。Struts 和 Spring 框架等好幾種流行的網站建設框架都是基於 MVC 模式設計的。

## JSP 和 Servlets

從架構上說，JSP 可以被看作是從 Servlets 進階提煉而作為 JAVA Servlet 2.1 API 的擴充而應用。Servlets 和 JSP 最早都是由 Sun Microsystems（太陽公司）開發的。從 JSP1.2 版本以來，JSP 處於 Java Community Process（有人譯為：Java 社群組織）開發模式下。JSR-53 規定了 JSP 1.2 和 Servlet 2.4 的規範，JSR-152 規定了 JSP 2.0 的規範。2006 年 5 月，JSP 2.1 的規範作為 Java EE 5 的一部份，在 JSR-245 中發布。

靜態資料在輸入檔案中的內容和輸出給 HTTP 回應的內容完全一致。此時，該 JSP 輸入檔案會是一個沒有內嵌 JAVA 或動作的 HTML 頁面。而且，客戶端每次請求都會得到相同的回應內容。

### 樣例

不管 JSP 編譯器是生成 SERVLET 的 JAVA 原始碼，或者是直接發布二進位碼，了解一下 JSP 編譯器是如何把檔案轉換成一個 JAVA SERVLET，都是很有幫助的。例如，看一下如下輸入 JSP 和它最後生成的 JAVA SERVLET：

**Input JSP**

**Resulting servlet**

## 參見

* JSTL
* Java 企業版
* JavaServer Faces
* Java Servlet
* SSJS
* WAR (file format)
* EAR (file format)
* JAR (file format)
* Tomcat 伺服器

## 參考資料

### 文內參照

### 書目

* Kin-man Chung. JavaServer Pages Specification (pdf) 2.3. 甲骨文公司. 2013 [2018 年 3 月 16 日].
* Hans Bergsten. JavaServer Pages 3. Sebastopol, California: O'Reilly. 2003 [2006-07-20]. ISBN0-596-00563-6. （原始內容存檔於 2019-10-17）.

 

## 外部連結

* Sun's JSP product description（頁面存檔備份，存於網際網路檔案館）
* JSR 245（頁面存檔備份，存於網際網路檔案館） (JSP 2.1)
* JSR 152（頁面存檔備份，存於網際網路檔案館） (JSP 2.0)
* JSR 53（頁面存檔備份，存於網際網路檔案館） (JSP 1.2)
.jsp