使用Java開發定製標記庫遇到的小問題——

      最近在開發定製標記庫時遇到了一個問題,當tld文件中把<body-content>設置爲JSP時,服務器總是報錯。

……specifies an invalid body-content (JSP) for a SimpleTag.

網上查找的資料很多不全面,如實查閱了《JSP程序設計》(O'Really公司 第三版)加上自己的思考,把原因搞清楚了。

      要將定製動作開發爲Java類,需要使用一組類和接口,這在JSP規範中成爲標記擴展機制。實現一個定製動作行爲的類成爲標記處理器。該類實際上是一個bean,其中包括與定製動作元素屬性相對應的性質設置方法。而且這樣一卦標記處理器類必須實現標記擴展機制所定義的4個Java接口之一。

      通常標記處理器分爲兩種:簡單標記處理器和傳統標記處理器。

      簡單標記處理器需要實現SimpleTag接口,或繼承SimpleTagSupport類。

      傳統標記處理器需要實現其他三個接口,即Tag,IterationTag和BodyTag。Tag接口定義了對於所有標記處理器所需實現的方法。IterationTag接口拓展了Tag接口,並增加了迭代處理動作元素體所需的一些方法。BodyTag接口則擴展了IterationTag接口,並增加了對動作元素體計算結果提供訪問方法。

      其中簡單標記處理器是JSP2.0新引入的(不是指功能簡單,而是相比傳統標記處理器用起來簡單,實際上功能非常強大)。我認爲它的出現是因爲EL和JSTL的引用,使得在JSP編程中幾乎不需要使用腳本元素了,當然,這也是JSP所提倡的。瞭解了這個背景,就不難理解爲什麼<body-content>設置爲JSP時會報錯,因爲我的標記處理器的實現是通過繼承SimpleTagSupport來實現的。通過SimpleTag接口實現的標記處理器與<body-content>JSP</body-content>是不相容的。否則也就有悖於JSP2.0所提倡的減少JSP界面中的腳本元素。如果就是要使用<body-content>JSP</body-content>這種設置,那標記處理器只能通過實現傳統標記處理器提供的三個接口來實現,當然這也是不提倡的。


在此,介紹一下<body-content>屬性。<body-content>屬性對於JSP2.0來說是必要屬性,其值有四種:

empty:動作體爲空

JSP:體包含JSP元素,如EL表達式,標準或定製動作以及腳本元素

scriptless:可以包含EL表達式和動作,但不能含有腳本元素

tagdependent:體中可以包含看似爲JSP元素的內容,但是容器不對其進行計算(當體中的內容與JSP元素產生混淆時採用這個,不常用)

下面簡單介紹各種屬性的用法,即顯示區別:

1.empty

<body-content>empty</body-content>
<my:date date="${now}"/>
2013-10-13

2.scriptless
<body-content>scriptless</body-content>
  <body>
    <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean>
    <my:forEachOption items="${catalog.productList}" var="product">
    	 ${product.name }:${product.price }<br/>
    </my:forEachOption>
  </body>
Thinking in Java:108.5
JSP Programming:58.5
Core Java:99.5



3.tagdependent

<body-content>tagdependent</body-content>
  <body>
    <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean>
    <my:forEachOption items="${catalog.productList}" var="product">
    	 ${product.name }:${product.price }<br/>
    </my:forEachOption>
  </body>
${product.name }:${product.price }
${product.name }:${product.price }
${product.name }:${product.price }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章