1. 程式人生 > >自定義標籤的作用

自定義標籤的作用

                1)控制標籤體內容是否輸出

                            2)控制標籤餘下內容是否輸出

                            3)控制重複輸出標籤體內容

                            4)改變標籤體內容

                            5)帶屬性的標籤

package com.loaderman.demo.a_tag;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * 標籤處理器類
 * 
@author APPle * */ public class DemoTag extends SimpleTagSupport{ //1.宣告屬性的成員變數 private Integer num; //2.關鍵點: 必須提供公開的setter方法,用於給屬性賦值 public void setNum(Integer num) { this.num = num; } @Override public void doTag() throws JspException, IOException { System.out.println("執行了標籤"); /** * 1)控制標籤內容是否輸出 * 輸出: 呼叫jspFrament.invoke(); * 不輸出: 不呼叫jspFrament.invoke(); */ //1.1 得到標籤體內容 JspFragment jspBody = this.getJspBody(); /** * 執行invoke方法: 把標籤體內容輸出到指定的Writer物件中 */ //1.2 往瀏覽器輸出內容,writer為null就是預設往瀏覽器輸出 //JspWriter out = this.getJspContext().getOut(); //jspBody.invoke(out); jspBody.invoke(null);//等價於上面的程式碼 /** * 3)控制重複輸出標籤體內容 * 方法: 執行多次jspBody.invoke()方法 */ /*for(int i=1;i<=num;i++){ jspBody.invoke(null); }*/ /** * 4)改變標籤體內容 */ //4.1 建立StringWriter臨時容器 /*StringWriter sw = new StringWriter(); //4.2 把標籤體拷貝到臨時容器 jspBody.invoke(sw); //4.3 從臨時容器中得到標籤體內容 String content = sw.toString(); //4.4 改變內容 content = content.toLowerCase(); //System.out.println(content); //4.5 把改變的內容輸出到瀏覽器 //jspBody.invoke(null); 不能使用此方式輸出,因為jsbBody沒有改變過 this.getJspContext().getOut().write(content);*/ /** * 2)控制標籤餘下內容是否輸出 * 輸出: 什麼都不幹! * 不輸出: 丟擲SkipPageException異常 */ throw new SkipPageException(); } }

loaderman.tld檔案

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
  <!-- 標籤庫的版本 -->
  <tlib-version>1.1</tlib-version>
  <!-- 標籤庫字首 -->
  <short-name>loaderman</short-name>
  <!-- tld檔案的唯一標記 -->
  <uri>http://loaderman.cn</uri>
  <tag>
    <name>demoTag</name>
    <tag-class>com.loaderman.demo.a_tag.DemoTag</tag-class>
    <body-content>scriptless</body-content>
    <!-- 屬性宣告 -->
    <attribute>
        <!-- 屬性名稱 -->
        <name>num</name>
        <!-- 是否必填 -->
        <required>true</required>
        <!-- 是否支援EL表示式 -->
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
  
</taglib>