1. 程式人生 > >【J2EE】- JSP自定義標籤

【J2EE】- JSP自定義標籤

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

用途:在進行JSP頁面顯示處理的時候,有時候JSTL/Struts/Spring提供的標籤庫並不能滿足專案中顯示的需求,特別是對一些要求比較高的定製化服務中,可以使用自定義的標籤庫去處理。

JSP自定義標籤的步驟

①:編寫標籤庫對應的tld檔案:Tag Library Descrptor File

②:標籤庫處理類:繼承TagSupport類,並用set方法設定標籤的屬性

③:web.xml配置自定義的tld檔案的uri

④:JSP直接web.xml中自定義的標籤庫的uri引入標籤庫

tld檔案:

  • short-name: 標籤字首:類比C標籤的c:if》c

  • name:標籤字尾名:類比C標籤的c:if》if

  • tag-class:頁面渲染時處理標籤的工作類

  • body-content:主體內容

    • jsp:接收所有的jsp語法的內容
    • empty:開始和結束中間沒有內容
    • scriptless:接收文字、el和jsp指令碼
    • tagDependent:標籤體內容直接寫入bodyContext由自定義標籤類進行處理
  • attribute:標籤的屬性,類比input標籤的name/value等屬性

    • name:屬性名(與標籤處理類的屬性(set)必須保持一致)
    • required:屬性的必要性
    • rtexprvalue:是否支援特殊表示式:EL表示式等
<?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>test</short-name>
	<tag>
		<name>out</name>
		<tag-class>com.zhiwei.tag.TagHandler</tag-class>
		<body-content>jsp</body-content>
		<attribute>
			<name>name</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>    

標籤處理類:

package com.zhiwei.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * jsp自定義標籤處理類
 * @author Yang ZhiWei
 */
public class TagHandler  extends TagSupport{
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * 自定義標籤的屬性名
	 */
	private String name;

	/**
	 * set方法是必須的,用來注入jsp傳過來的屬性值:類似spring的注入
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * doStartTag:jsp容器在掃面到"<"時啟用
	 */
	@Override
	 public int doStartTag() throws JspException {
		
		 StringBuffer results = new StringBuffer("");
		 System.err.println("------->doStartTag");
         try {
        	//父類的pageContext:表示當前jsp上下文
			pageContext.getOut().write(results.toString());
		} catch (Exception e) {
			throw new JspException("錯誤"); 
		}
        /**
         * SKIP_BODY:跳過開始和結束之間的程式碼
         * EVAL_BODY_INCLUDE:表示標籤之間的內容被正常執行,將body之間的資訊輸出到存在的輸出流中
         */
		return EVAL_BODY_INCLUDE;
	}
	
	/**
	 * doEndTag在標籤在標籤結尾時啟用
	 */
	@Override
	 public int doEndTag() throws JspException{
		
		System.err.println("------->doEndTag");
		try {
			JspWriter out = pageContext.getOut();    
			out.print("Hello " + name+" !");    
		} catch (Exception e) {
			throw new JspException("錯誤"); 
		}   
		/**
		 * SKIP_PAGE:忽略剩下的頁面
		 * EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁
		*/
		return EVAL_PAGE;  
	}
}

web.xml檔案配置:

<jsp-config>
    <taglib>
      <taglib-uri>/tld/test</taglib-uri>
      <taglib-location>    
                /WEB-INF/tlds/test.tld    
      </taglib-location>
    </taglib>
  </jsp-config>

自定義標籤庫JSP檔案中應用:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="/tld/test" prefix="test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TagHandler</title>
</head>
<body>
Test Tag: <test:out name="TEST"/><br>

Test Tag: <test:out name="TEST"> AAAAAAA</test:out>  
</body>
</html>

效果呈現:

分析:JSP頁面正確渲染出我們的自定義標籤庫,值得注意的是第2個自定義標籤裡面包含內容:

Test Tag: <test:out name="TEST"> AAAAAAA</test:out>  

JSP頁面渲染的內容是Test Tag: AAAAAAAHello TEST !,這表明JSP引擎是先處理標籤體包裹的資訊然後在解析處理標籤體