华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> javaWeb >> 文章內(nèi)容

Taglib原理和實(shí)現(xiàn)之什么是Taglib

來源:中華考試網(wǎng)  [2020年11月26日]  【

  Taglib 原理和實(shí)現(xiàn)之什么是Taglib

  1、問題:Tag究竟是什么?如何實(shí)現(xiàn)一個(gè)Tag?

  一個(gè)tag就是一個(gè)普通的java類,它唯一特別之處是它必須繼承TagSupport或者BodyTagSupport類。 這兩個(gè)類提供了一些方法,負(fù)責(zé)jsp頁面和你編寫的類之間的交互,例如輸入,輸出。而這兩個(gè)類是由jsp容器提供的,無須開發(fā)人員自己實(shí)現(xiàn)。換句話說,你 只需把實(shí)現(xiàn)了業(yè)務(wù)邏輯的類繼承TagSupport或者BodyTagSupport,再做一些特別的工作,你的類就是一個(gè)Tag。并且它自己負(fù)責(zé)和 jsp頁面的交互,不用你多操心。

  “特別的工作”通常有以下幾個(gè)步驟:

  1)提供屬性的set方法,此后這個(gè)屬性就可以在jsp頁面設(shè)置。以jstl標(biāo)簽為例 ,這個(gè)value就是jsp數(shù)據(jù)到tag之間的入口。所以tag里面必須有一個(gè)setValue方法,具體的屬性可以不叫value。例如

  setValue(String data){this.data = data;}

  這個(gè)“value”的名稱是在tld里定義的。取什么名字都可以,只需tag里提供相應(yīng)的set方法即可。

  2)處理 doStartTag 或 doEndTag 。這兩個(gè)方法是 TagSupport提供的。 還是以為例,當(dāng)jsp解析這個(gè)標(biāo)簽的時(shí)候,在“<”處觸發(fā) doStartTag 事件,在“>”時(shí)觸發(fā) doEndTag 事件。通常在 doStartTag 里進(jìn)行邏輯操作,在 doEndTag 里控制輸出。

  3)編寫tld文件。

  4)在jsp頁面導(dǎo)入tld

  這樣,你的jsp頁面就可以使用自己的tag了。

  填寫下面表單即可預(yù)約申請免費(fèi)試聽java課程!害怕學(xué)不會?助教陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

預(yù)約申請免費(fèi)聽java課程

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  通常你會發(fā)現(xiàn)自己絕大多數(shù)活動都集中在 doStartTag 或 doEndTag 方法里。確實(shí)如此,熟悉一些接口和類之后,寫taglib很容易。正如《jsp設(shè)計(jì)》的作者所言:里面的邏輯稍微有點(diǎn)復(fù)雜,但畢竟沒有火箭上天那么難。

  2、一個(gè)簡單的例子:OutputTag

  package diegoyun;

  import javax.servlet.jsp.JspException;

  import javax.servlet.jsp.JspWriter;

  import javax.servlet.jsp.tagext.TagSupport;

  /**

  * @author chenys

  */

  public class OutputTag extends TagSupport{

  private String name=null;

  public void setName(String name){

  this.name = name;

  }

  public int doStartTag() throws JspException{

  try{

  JspWriter out = pageContext.getOut();

  out.print("Hello! " + name);

  }

  catch (Exception e){

  throw new JspException(e);

  }

  return EVAL_PAGE;

  }

  }

  簡要說明:

  1、如何輸出到j(luò)sp頁面:

  調(diào)用JspWriter JspWriter out = pageContext.getOut();out.print......

  記住這個(gè)方法就可以了。

  2、輸出后如何作處理

  函數(shù)會返回幾個(gè)值之一。EVAL_PAGE 表示tag已處理完畢,返回jsp頁面。還有幾個(gè)值,例如 EVAL_BODY_AGAIN 和EVAL_BODY_INCLUDE等,后面我們會作討論

  編寫tld

  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

  1.0

  1.2

  diego

  out

  diegoyun.OutputTag

  empty

  name

  false

  false

  在WEB-INF下新建tlds文件夾,把這個(gè)文件取名為diego.tld,放到tlds文件夾下。路徑應(yīng)該這樣:WEB-INF\tlds\diego.tld

  關(guān)于tld的簡單說明:

  short-name:taglib的名稱,也稱為前綴。比如 里的“c”

  name:tag的名字。例如 里的"out”,我們的類也取名為out,由于有前綴作區(qū)分,不會混淆

  tag-class:具體的tag類。帶包名

  body-content:指tag之間的內(nèi)容。例如 ...... 起始和關(guān)閉標(biāo)簽之間就是body-content。由于沒有處理body-content,所以上面設(shè)為empty

  里的name:屬性名字。例如里的value。名字可任意取,只要類里提供相應(yīng)的set方法即可。

  required:是否必填屬性。

  rtexprvalue:是否支持運(yùn)行時(shí)表達(dá)式取值。這是tag的強(qiáng)大功能。以后我們會討論。暫時(shí)設(shè)為false

責(zé)編:fushihao

上一篇:HTTPGet與Post的區(qū)別

下一篇: 沒有了

  • 會計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
吴川市| 尚志市| 迁西县| 陆丰市| 黎平县| 扶沟县| 饶河县| 滦平县| 泸水县| 盐亭县| 绵阳市| 珲春市| 禄劝| 监利县| 六枝特区| 潮安县| 古浪县| 城市| 奈曼旗| 获嘉县| 乌苏市| 固原市| 山阳县| 吉林市| 平湖市| 洛阳市| 兰考县| 平阳县| 庆安县| 介休市| 特克斯县| 保定市| 玉树县| 当雄县| 仪征市| 建水县| 灵宝市| 寻甸| 翼城县| 安吉县| 汕尾市|