Java EE入門教程系列第二章JSP(六)——JSP標準標籤和自定義標籤的配置與使用
2.6 JSP的標籤
2.6.1 標籤簡介
標籤就是把一段具體業務的Java程式碼封裝起來,然後以標記語言的形式在頁面檔案中對它進行呼叫,增強頁面檔案和Java程式的獨立性。
目前標籤庫有兩種形式:標準標籤庫和自定義標籤。
JSP標準標籤(JSTL)是一個可以實現Web應用程式中常用功能的定製標籤庫集,這些功能包括迭代和條件判斷、資料管理格式化、XML操作,以及資料庫訪問等,就像是一個庫函式,是事先定義好的東西,開發者可以直接使用其中的標籤。
自定義標籤是指使用者可以根據自己的業務需求,把一些java語言寫出來的業務程式封裝在標籤裡,形成自己的標籤庫。
從標籤的使用形式上看,它是以XML形式表示的JSP語言元素,可以理解為是對JSP標準動作標記的一種擴充套件。
2.5.2 標準標籤庫JSTL
無論什麼版本,一般來說,標準標籤庫都需要下載兩個安裝包:jstl.jar和standard.jar,必須把它們放到自己專案中的classpath中才可以用。
如果頁面需要使用標籤庫,則需要在每個JSP檔案頭部包含<taglib>標籤,格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
具體配置步驟:
從官方下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/下載 jakarta-taglibs-standard-1.1.2.zip
接下來可以配置web.xml也可以不配置,因為我看的教材接下來沒有詳細敘述,所以我暫且不配置,如果之後有地方需要深入學習,再來補充。
建立測試程式碼jspc1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <jsp:useBean id="date" class="java.util.Date"/> <c:out value="${date}"/> </body> </html>
截圖:
2.6.3 自定義標籤
前面介紹過,標籤內包含的其實是一個java程式應用。因此,要建立一個自定義標籤,首先需要建立一個java檔案,這個檔案就是標籤所封裝的功能,然後還要建立一個副檔名為.tld的標籤庫描述符檔案,它的作用相當於建立一個自己的標籤庫,並由它把java檔案和具體的標籤名關聯起來,然後使用者就可以在JSP頁面中呼叫了。
要注意的是,這幾個檔案在eclipse中建立的位置,因為位置問題找錯了一個晚上,所以大家一定要先看下面的位置佈局。
舉例:第一步SayHi.java
這一步我們要先建立一個包,在這個包裡建立java程式,因為eclipse專案中的java程式都有個預設包,但是預設包在配置中沒法呼叫會產生錯誤。
這裡是我建立好的情況,cy是我新創的包,沒建立好的時候這裡顯示的是default package,右鍵—NEW-package,在名字一欄填寫cy,然後右鍵這個包建立java程式SayHi.java(就是一個實現父類方法的過程,這個程式就是我們要封裝的功能)
package cy;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.*;
import javax.servlet.jsp.JspWriter;
public class SayHi extends TagSupport{
public int doStartTag() {
try {
JspWriter JspWriterOutput=pageContext.getOut();
JspWriterOutput.print("Hi");
}catch(IOException ioEx) {
System.out.println(ioEx);
}
return(SKIP_BODY);
}
public int doEndTag() {return EVAL_PAGE;}
}
第二步 firsttlib.tld
位置是在WEB-INF下建立的,右鍵new——other,選擇XML file,在檔名填寫firstlib.tld
程式碼為
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>hi</short-name>
<uri>/WEB-INF/firstlib.tld</uri>
<tag>
<name>sayHi</name>
<tag-class>cy.SayHi</tag-class>
<body-content>empty</body-content>
<small-icon></small-icon>
<large-icon></large-icon>
<description></description>
<example></example>
</tag>
</taglib>
其實看標籤名就能大致理解他們的作用了
第三步,建立hi.jsp 進行使用,這個檔案的位置和之前建立jsp檔案的位置沒有區別
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="hi" uri="/WEB-INF/firstlib.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>引用標籤庫</h1>
<hi:sayHi/>
</body>
</html>
專案整體結構為:
結果截圖:
自定義標籤的原理
1)當伺服器開啟時,就會載入WEB-INF下的資原始檔,包括web.xml 和 tld檔案,把它們載入到記憶體
3)伺服器讀取jsp裡的內容,當讀到
<%@ taglib prefix="hi" uri="/WEB-INF/firstlib.tld" %>
這一句的時候,就會在記憶體中找是否存在uri為/WEB-INF/firstlib.tld的tld檔案,找不到就會報錯
4)繼續讀取jsp頁面,讀到<hi:sayHi/>這個標籤的時候,就會通過uri去找到tld檔案,在tld檔案中找到mytab是否被定義,是的話就得到它的tag-class的內容,然後去找到它對應的標籤處理程式
5)例項化標籤處理程式,利用生成的物件呼叫它裡面的方法
這裡伺服器對標籤處理程式裡的方法也有一定的呼叫順序
A)void setPageContext(PageContext pc) --傳入pageContext物件
B)void setParent(Tag t) --如果有父標籤,傳入父標籤物件,如果沒有,則傳入null
C)int doStartTag() --開始執行標籤時呼叫。
D)int doEndTag() --結束標籤時呼叫
E)void release() --釋放資源
如果你沒有重寫上面的方法,系統將會呼叫它的父類裡的方法~