电竞比分网-中国电竞赛事及体育赛事平台

分享

JavaWeb之JSP自定義標簽

 liang1234_ 2020-07-15

在jsp開發(fā)時,當jsp內(nèi)置標簽以及JSTL標簽庫都滿足不了需求時,可以根據(jù)自己的需求來自定義標簽。其實在jsp頁面使用標簽就等同于調(diào)用某個對象的某個方法。

自定義標簽步驟:先定義標簽處理類(如繼承SimpleTagSupport類),再編寫TLD文件(標簽庫描述庫文件)。

定義標簽類可以編寫一個實現(xiàn)SimpleTag接口的類,

public class MyTag1 implements SimpleTag {

   private PageContext context;

   private JspFragment body;

   @Override

   public void doTag() throws JspException, IOException {

      context.getOut().print("這是一個自定義標簽");

   }

   @Override

   public JspTag getParent() {

      return null;

   }

   //下面三個方法都在doTag方法之前被tomcat之前調(diào)用,所以在doTag方法中就可以使用傳遞過來的對象

   //設(shè)置標簽體

   @Override

   public void setJspBody(JspFragment body) {

    this.body =body;

   }

    //設(shè)置jsp上下文對象,它子類是PageContext

   @Override

   public void setJspContext(JspContext context) {

      this.context = (PageContext) context;

   }

   //設(shè)置父標簽

   @Override

   public void setParent(JspTag arg0) {

   }

}

上面代碼中的doTag()的方法是每次執(zhí)行標簽都會調(diào)用的方法,在這個方法之前有setJspBody()、setJspContext()以及setParent()方法都會比doTag先給Tomcat(服務器)調(diào)用,所以把傳遞過來的對象賦值給成員變量后,就可以在doTag方法里面就可以使用傳過來的對象了(這里沒有用到父標簽所以setParent方法體沒寫代碼),其中在doTag方法里面使用PageContext對象獲取輸出流輸出了一句字符串。

編寫好標簽處理類后,還需要在配置tld文件。

一般tld文件都放在WEB-INF下,這樣可以保證客戶端訪問不到

tld文件代碼(其實是一個xml)

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

<taglib xmlns="http://java./xml/ns/javaee"

    xmlns:xsi="http://www./2001/XMLSchema-instance"

    xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

version="2.1">

 

  <tlib-version>1.0</tlib-version><!-- 自定義標簽庫的版本號 -->

  <short-name>tag</short-name><!-- 自定義標簽庫的簡稱 -->

  <uri>http://www./tag1.0</uri><!-- 自定義標簽庫的uri -->>

  <tag>

  <name>MyTag1</name><!—指定當前標簽名稱 -->

  <tag-class>cn.tianye.tag.MyTag1</tag-class><!—指定當前對應標簽出處理類 -->

  <body-content>empty</body-content><!-- 標簽體內(nèi)容格式 -->

  </tag>

  </taglib>

上面需要這注意的是<body-content>元素的可選值有

empty:也就是沒有標簽體(如果在這里設(shè)置的是empty,那么在jsp頁面上就不能有標簽體。)

JSP:傳統(tǒng)標簽支持它,SimpleTag已經(jīng)不支持使用<body-content>JSP</body-content>

(標簽內(nèi)容是可以有任何東西,比如EL,JSTL,HTML以及<%%>等)

scriptless:標簽體內(nèi)容不能是java腳本,可以是EL,JSTL,字符串等,在SimpleTag中需要標簽體可以使用這選項。

tagdependent:標簽體內(nèi)容不作運算,全由標簽處理類自行處理,無論標簽體內(nèi)容是EL,JSTL等,都不會作運算。(這個基本沒有人會使用,因為用起來太麻煩,什么都要自己處理)

配置好tld文件后就可以在jsp頁面上使用了,在使用自定義標簽之前,需要先使用指令導入標簽庫。

使用taglib導入標簽庫,uri是tld文件的存放位置

<%@taglib prefix="t" uri="/WEB-INF/tlds/tianye.tag.tld" %>

使用自定義標簽

<hr>

   <h1><t:MyTag1/></h1>

   <hr>

 

 

 

 

效果

自定義有標簽體的標簽

首先需要獲取標簽體對象(JspBody)、把標簽體內(nèi)容輸出到頁面、tld中指定標簽內(nèi)容格式為scriptless。

標簽處理類代碼

public class MyTag3 extends SimpleTagSupport {

   @Override

   public void doTag() throws JspException, IOException {

   this.getJspContext().getOut().print("***************<br>");

   //執(zhí)行標簽體的內(nèi)容,把結(jié)果輸出到頁面

   Writer writer = this.getJspContext().getOut();

   this.getJspBody().invoke(writer);

   this.getJspContext().getOut().print("<br>***************");

   }

}注:上面的類繼承了SimpleTagSupport類(SimpleTagSupport類實現(xiàn)了SimpleTag接口,也就是它已經(jīng)把所有Tomcat(服務器)傳遞的對象保存了,不需要我們自己操作保存?zhèn)鬟f過來的對象了,同時也提供了get方法供子類調(diào)用),重寫了doTag()方法,然后調(diào)用對象獲取當前jsp輸出流,執(zhí)行標簽體內(nèi)容,把結(jié)果寫入指定流中即輸出到頁面上。

tld文件(也就是<body-content>可選項改為scriptless,其他跟前面的一樣)

<tag>

  <name>MyTag3</name>

  <tag-class>cn.tianye.tag.MyTag3</tag-class>

  <body-content>scriptless</body-content>

  </tag>

在jsp頁面上使用標簽(可以標簽體可以是EL,也可以是字符串)

<%request.setAttribute("title", "It doesn't matter where you came from,"); %>

 <h1><t:MyTag3>${requestScope.title }</t:MyTag3></h1>

 <h1><t:MyTag3>what matters is who you choose to be.</t:MyTag3></h1>

效果

其中還可以自定義帶有屬性的標簽,這里就不過多描述

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多