1. 程式人生 > >Java EE入門教程系列第二章JSP(六)——JSP標準標籤和自定義標籤的配置與使用

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

 包並解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩個 jar 檔案:standard.jar 和 jstl.jar 檔案拷貝到 /WEB-INF/lib/ 下

接下來可以配置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()                  --釋放資源

如果你沒有重寫上面的方法,系統將會呼叫它的父類裡的方法~