- JSP從零開始學(視頻教學版)
- 劉鑫編著
- 1827字
- 2021-03-12 12:31:59
3.3 JSP指令
上一節介紹了JSP表達式的用法以及示例,讀者已經可以應用前面章節的知識編寫簡單的JSP動態網頁了,但要編寫出功能強大、復雜的JSP頁面還需要學習更多的內容。本節介紹JSP的另一元素:指令。JSP指令包括:page指令、include指令、taglib指令。
3.3.1 與頁面屬性相關的page指令
page指令用來設置JSP頁面的屬性和相關功能,基本語法形式有兩種,如下:
<%@ page attribute1="value1" […attribute2="value n"]%>
或者
<jsp:directive.page attribute1="value1" […attribute2="value n"] />
提示
第2種形式的表達現在很少使用,大多使用第1種表達形式。
page指令有多種屬性,但使用最多的是language、import、pageEncoding這3個,其中language是必須設置的,目前JSP頁面使用Java語言,所以其默認值是java。Import用來聲明需要導入的包,pageEncoding屬性設置頁面的編碼。在所有的屬性中除import可以聲明多個外,其他的屬性都只能出現一次。page其他的屬性見表3.1。
表3.1 page指令的常用屬性


3.3.2 引入文件的include指令
include指令是在JSP頁面生成Servlet時引入需要包含的頁文件,可以是HTML文件也可以是JSP文件,還可以是其他文件(例如js文件)。include指令的作用是在標簽插入的位置插入靜態的文件內容,使其與JSP文件組合成新的JSP頁面,然后由JSP引擎翻譯成Servlet文件。這樣做有兩個優點:
頁面的代碼可以復用,因為被引入的文件是靜態文件,所以在其他的JSP頁面中要是需要也可以導入;
JSP頁面的代碼結構顯得清晰易懂,維護也比較簡單。
include指令的基本語法如下:
<%@include file="URL"%>
file屬性是指向要包含的文件,一定要注意引入的路徑是否正確,一旦路徑出錯在編譯的時候將不能通過。
include指令經常用來包含網站中經常出現的相同頁面。例如,一般網站為每個頁面都設置導航欄,把它放在頁面的頂端或者左邊,這部分的代碼在每個頁面都重復。那么就可以用include來解決這類問題,它能夠為開發者省去這些重復的動作。下面的例子將對include指令進行演示。
【例3.3】演示include指令。
index.jsp是首頁,其源代碼如下:
----------------- index1.jsp ---------------- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> 01 <head> 02 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 03 <title>JSP include指令演示</title> 04 </head> 05 <body> 06 <%@include file="john.html" %> 07 <br/> 08 <div align="center">JSP include指令演示</div> 09 <%@include file="copyRight.jsp" %> 10 </body> 11 </html>
John.html是內嵌頁面,用來顯示內容,其源代碼如下:
----------------- john.html ---------------- 01 <table align="center" border="1" width="600"> 02 <tr> 03 <td align="center" height="18" width="100%"> 04 <span>This is top page.</span> 05 </td> 06 </tr> 07 </table>
copyRight.jsp是顯示版權信息的頁面,其源代碼如下:
----------------- copyRight.jsp ---------------- 01 <%@ page language="java" import="java.util.*, java.text.SimpleDateFormat" 02 pageEncoding="UTF-8"%> 03 <% 04 Date d = new Date(); 05 SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); 06 String t = sdf.format(d); 07 String copyRightsMess = "John 版權所有 2010-"+t; 08 %> 09 <br/> 10 <div align="center" ><%=copyRightsMess%></div>
本例頁面效果如圖3.4所示。

圖3.4 index.jsp頁面的運行結果
提示
include指令在JSP頁面被轉換成Servlet時才將文件導入,這與<jsp:include>動作不同。
3.3.3 與標簽相關的taglib指令
taglib指令(又名標簽指令)是JSP新增的一個指令,用戶可以自定義新的標簽在頁面中執行。taglib指令的語法如下:
<%taglib uri="tagliburl" prefix="tagPre" %>
其中uri屬性用來表示自定義標簽庫的存放位置。prefix屬性是為了區分不同標簽庫的標簽名,在頁面中引用標簽也是以prefix開頭的。
現在比較流行的JSTL、EL標簽,看下它們如何在JSP中使用。下面的例子是用JSTL標簽輸出1~10。
提示
JSTL標簽庫會在后續的章節詳細說明,這里先演示它的基本用法。
【例3.4】演示taglib指令。
----------------- index.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%> 03 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 04 <html> 05 <head> 06 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 07 <title>JSP taglib指令演示</title> 08 </head> 09 <body> 10 <table> 11 <tr> 12 <td>輸出值</td> 13 </tr> 14 <c:forEach begin="1" end="10" var="num"> 15 <tr> 16 <td><c:out value="${num}"></c:out></td> 17 </tr> 18 </c:forEach> 19 </table> 20 </body> 21 </html>
從上述代碼可以看出,JSTL標簽使得JSP頁面十分的簡潔,它不需要定義或初始化對象、方法。但凡事都不能只看表面,應該注重本質,標簽的制定在頁面顯示是如此的簡單,但在編制時是個復雜的過程,它通過一定的編程步驟將JSP代碼和Java代碼聯系起來。標簽制定的最大好處就是使得開發者的職責分工更加地明細,標簽制定者無需關注業務邏輯的實現,而頁面編程人員直接使用標簽即可。這樣兩者就不會沖突,分工明確。下面簡單介紹定制標簽的過程。
1.標簽庫
標簽庫用于定義標簽的XML文件。該文件中包含了標簽的屬性、和標簽的名稱、JSP在處理標簽時所需的類文件等信息。在使用自定義標簽時,必須指明標簽庫所在目錄;在執行標簽功能作用時,通過定義標簽屬性來決定顯示的內容。下面看一段標簽的源代碼,其中包括了標簽名的定義、屬性定義以及標簽對應的Java類。
01 <? xml version="1.0" encoding="UTF-8" ? > 02 <! DOCTYPE taglib 03 PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 04 "http://java.sun.com/dtd/web-jsptaglibrary_1_3.dtd"> 05 <taglib> 06 <tlib-version>1.0</tlib-version> 07 <jsp-version>1.2</jsp-version> 08 <short-name>lms</short-name> 09 <! -- 頁面引用的url地址 --> 10 <uri>/lms-tags</uri> 11 12 <tag> 13 <! -- 標簽名稱 --> 14 <name>page</name> 15 <! -- 標簽處理類 --> 16 <tag-class>com.common.model.PageTag</tag-class> 17 <body-content>JSP</body-content> 18 <! -- 標簽描述 --> 19 <description>分頁</description> 20 <! -- 標簽屬性 --> 21 <attribute> 22 <! -- 標簽屬性名稱 --> 23 <name>object</name> 24 <! -- 標簽屬性是否為必需,true是必需,false不是必需 --> 25 <required>true</required> 26 <! -- 標簽屬性對應的處理類 --> 27 <type>com.common.model.PageObject</type> 28 <! -- 標簽屬性描述 --> 29 <description>PageObject對象</description> 30 </attribute> 31 </tag> 32 33 <tag> 34 <! -- 標簽名稱 --> 35 <name>substring</name> 36 <! -- 標簽處理類 --> 37 <tag-class>com.gsta.common.tag.SubStringTag</tag-class> 38 <description>substring</description> 39 <attribute> 40 <name>content</name> 41 <required>true</required> 42 <type>java.lang.String</type> 43 </attribute> 44 </tag> 45 </taglib>
上述代碼中第6~8行分別定義標簽的版本、JSP的版本、標簽的簡稱,代碼第12~31行定義page標簽,代碼第21~30行定義page標簽的屬性,在定義屬性名稱的時候,可以定義該標簽的數據類型以及該屬性是否是必需的。例如上述代碼第41行定義的,JSP頁面就會根據其定義在執行的時候檢查相關的錯誤信息。
2.標簽處理類
標簽處理類其實就是一個Java類,該Java類實現標簽接口(javax.Servlet.jsp.Tag),當自定義標簽被JSP處理時即被執行。每個標簽中都需要執行的方法是:
Public int doStartTag() throws JspException
該方法定義了標簽被執行時的方法。在標簽中定義的屬性,那么在Java類中就必須有這些屬性并且設定其get/set方法。例如,在上面標簽源碼中與substring標簽對應的標簽Java類是一個用于返回結果的Java類,在substring標簽定義時,必須定義其content屬性并給出get/set方法,如下代碼所示:
01 private String content; 02 public void setContent(String content) { 03 this.content = content; 04 } 05 06 public void setLength(int length) { 07 this.length = length; 08 }
上述代碼中,給出了屬性content的get/set方法。