JSP

JSP是由昇陽電腦公司主導建立的一種動態網頁技術標準。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版本開始，增加了表示式語言，以提供更快更簡單的建立新標籤的方法，並允許開發者建立Velocity式模板。如舊版本程式碼“codice_1”可簡化為“codice_2。包含內容.JSP指令.JSP指令控制JSP編譯器如何去生成servlet，以下是可用的指令：注意：在同一個JSP檔案中只有“import”匯入頁面指令可以被多次使用。JSP指令碼元素和變數.標準指令碼變數.以下是永遠可用的指令碼變數：指令碼元素.有三個基本的指令碼元素，作用是使JAVA程式碼可以直接插入servlet.JSP動作.JSP動作是一系列可以呼叫內建於網路伺服器中的功能的XML標籤。JSP提供了以下動作：標籤樣例.jsp:include.name:jsp:forward.在本例中，請求被傳遞到"subpage.jsp"，而且請求的處理權不會再返回前者。jsp:useBean.scope屬性可以是request, page, session or application，它有以下用意：上述例子將會用一個建立一個類的例項，並且把該例項儲存在屬性中，該屬性將在該請求的生命週期內有效。它可以在所有被包含或者從主頁面轉向到的JSP頁之間共享。JSP標籤庫.除了JSP預定義動作之外，開發者還可以使用JSP標籤擴充套件API新增他們自定義的"動作"。開發者寫一種實現一個標籤的介面和一個標籤庫的XML描述檔案的JAVA類，這就能指定標籤和實現標籤的JAVA類請看如下JSP：JSP編譯器將會載入mytaglib.tld這個XML檔案，然後可以看到標籤"myaction"由JAVA類"MyActionTag"實現。當該標籤首次在檔案中使用時，將會建立一個MyActionTag的例項。然後，當出現開始標籤時，將會呼叫doStartTag()方法，根據開始標籤的結果，來決定如何處理標籤的主體。主體是指開始標籤和結束標籤之間的文字。這個doStartTag()方法將會返回如下之一：注意：如果標籤擴充套件了BodyTagSupport類，當主體被執行時會在呼叫doEndTag()之前呼叫doAfterBody()方法。該方法用於實現迴圈結構。當結束標籤出現時，它會呼叫doEndTag()方法，該方法會返回如下兩做之一：上述myaction標籤tag會有一個類似下面例子的用於實現的類：public class MyActionTag extends TagSupport {//Releases all instance variables.//called for the start tag//called at the end tag本地化.JSP的本地化是透過和JAVA應用程式相同的方式完成的，即使用資源包。模型-檢視-控制器 模式.為了把表現層是為了便於團隊分工。MVC本身是一種由來已久的設計思想，基於JSP的技術只是實現MVC架構的流行方案之一。Struts和Spring框架等好幾種流行的網站建設框架都是基於MVC模式設計的。JSP和Servlets.從架構上說，JSP可以被看作是從Servlets高階提煉而作為JAVA Servlet 2.1 API的擴充套件而應用。Servlets和JSP最早都是由昇陽電腦開發的。從JSP1.2版本以來，JSP處於JCP開發模式下。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：輸入JSP最後生成的JAVA SERVLETpackage jsp_servlet;import java.util.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import com.foo.bar; //imported as a result ofimport ...class _myserlvet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {//inserted as a//result ofint serverInstanceVariable = 1;public void _jspService( javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response )throws javax.servlet.ServletException,java.io.IOExceptionjavax.servlet.ServletConfig config = ...;//get the servlet configObject page = this;PageContext pageContext = ...;//get the page context for this requestjavax.servlet.jsp.JspWriter out = pageContext.getOut();HttpSession session = request.getSession( true );try {out.print( "\r\n" );out.print( "\r\n" );//fromint localStackBasedVariable = 1;out.print( "\r\n" );out.print( " " );//note, toStringOrBlank() converts the expression into a string or if// the expression is null, it uses the empty string.//fromout.print( toStringOrBlank( "expanded inline data " + 1 ) );out.print( " \r\n" );} catch ( Exception _exception ) {//clean up and redirect to error page in