製作tld檔案及應用詳解

瓜瓜東西發表於2014-07-10

1、開個環境:myeclipse6.5+tomcat6.0.23
所需元件jree5.0

2index.jsp
頂部新增:<%@ tagliburi="/cmszxm" prefix="cms" %>

<tablewidth="800" border="0" align="center"cellpadding="0" cellspacing="0">
  <tr>
    <td align="center">
測試資訊</td>
  </tr>
<cms:module_list>
  <tr>
    <tdalign="center"><%=module_info.getModuleName() %></td>
  </tr>
</cms:module_list>
</table>

3web.xml中指定你的tld檔案

 <jsp-config>
  <taglib>
   <taglib-uri>/cmszxm</taglib-uri>
   <!--
置自定義標籤的uri(不一定存在,但是一定要唯一),為頁面的部署做好準備 -->
   <taglib-location>/WEB-INF/tlds/cms.tld</taglib-location>
   <!--
定位你的tld檔案的相對路徑 -->
  </taglib>
 </jsp-config>

 

4、寫自定義Tagtld檔案

<?xmlversion="1.0" encoding="UTF-8" ?>
<taglib>
    <tlib-version>1.0</tlib-version> <!--
你自定義標籤的版本數 -->
    <jsp-version>2.0</jsp-version> <!--
標籤庫依賴的JSP版本 -->
    <short-name>cmsTablib</short-name> <!--
標籤的簡寫 -->
    <uri></uri> <!--
指定這個標籤庫的uri資訊 -->
    <small-icon></small-icon> <!--
被工具使用的小圖示 -->
    <description>cms</description> <!--
本標籤的描述 -->
   
    <tag>
     
      <name>module_list</name> <!--
標籤名字 -->
     <tag-class>com.ModuleListTag</tag-class> <!--
指定你的標籤的類 -->
     <body-content>JSP</body-content> <!--
標籤主體的內容 -->
     <description>module_list</description> <!--
標籤描述 -->

      
      <variable>
        <name-given>module_info</name-given>
       <variable-class>com.ModuleVO</variable-class>
        <declare>true</declare>
        <scope>cccc</scope>
      </variable>
     
    </tag>
   
</taglib>


5
ModuleListTag.java

importjava.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

importjavax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

importtools.ConnSqlSer;

public classModuleListTag extends BodyTagSupport {

 privatestatic final long serialVersionUID = 1670679946944899701L;

 ServletRequestrequest = null;
 private Iterator it;
 ModuleVO vo = new ModuleVO();

 //遇到開始標籤執行  
 public int doStartTag() throws JspException {
  request = pageContext.getRequest();

  Collectioncoll = (Collection) getModule_List();

  // 表示如果未找到指定集合,則不用處理標籤體,直接呼叫doEndTag()方法。  
  if (coll == null || coll.isEmpty())
   return 0;

  it =coll.iterator();

  if(it.hasNext()) {
   vo = (ModuleVO) it.next();
   pageContext.setAttribute("module_info", vo);
   return 1;
  }
  return 0;
 }

 //遇到標籤體執行
 public int doAfterBody() {
  if (it.hasNext()) {
   vo = ((ModuleVO) it.next());
   pageContext.setAttribute("module_info", vo);
   return 2;
  }
  return 0;
 }

 //遇到結束標籤執行  
 public int doEndTag() throws JspException {
  System.out.println("doEndTag...");
  return EVAL_PAGE;
 }

 
 public ArrayList getModule_List() {
  Connection conn = ConnSqlSer.init();
  PreparedStatement pstm = null;
  ResultSet rs = null;
  ArrayList<ModuleVO> list = new ArrayList<ModuleVO>();
  String sql = "SELECTModuleID,ModuleCode,ModuleName,ModuleLinkUrl FROM PermissionControl_ModuleORDER BY ModuleCode";
  try {
   pstm = conn.prepareStatement(sql);
   rs = pstm.executeQuery();
   while (rs.next()) {
    ModuleVO module = new ModuleVO();
    module.setModuleID(rs.getString("ModuleID"));
    module.setModuleCode(rs.getString("ModuleCode"));
    module.setModuleName(rs.getString("ModuleName"));
    list.add(module);
   }
  } catch (SQLException e) {
   System.out.println("
查詢系統模組資訊");
  } finally {
   ConnSqlSer.ConnClose(rs, pstm, conn);
  }
  return list;
 }


6
ModuleVO.java
import javax.servlet.jsp.tagext.TagSupport;

public classModuleVO extends TagSupport {
 
 String ModuleID;  
 String ModuleCode;
 String ModuleName;
 
 public String getModuleID() {
  return ModuleID;
 }
 public void setModuleID(String moduleID) {
  ModuleID = moduleID;
 }
 public String getModuleCode() {
  return ModuleCode;
 }
 public void setModuleCode(String moduleCode) {
  ModuleCode = moduleCode;
 }
 public String getModuleName() {
  return ModuleName;
 }
 public void setModuleName(String moduleName) {
  ModuleName = moduleName;
 }
 

 

 

 

 

 

 

 

TLD自定義標籤

 

TLD配置說明

 

rtexprvalue的全稱是 Run-time Expression Value,它用於表示是否可以使用JSP表示式.

 

當在<attribute>標籤裡指定<rtexprvalue>true</rtexprvalue>時, 表示該自定義標籤的某屬性的值可以直接指定或者通過動態計算指定,  example as follow:

 

<sql:query var="result" >

   select * from mytable order by nameid

</sql:query>

<%request.setAttribute("nameid","2"); %>

<myTag:cupSize cupSize="1"cupSizes="${result}"></myTag:cupSize>

<myTag:cupSizecupSize="${nameid}"cupSizes="${result}"></myTag:cupSize>

 

 

當在<attribute>標籤裡指定<rtexprvalue>false</rtexprvalue>時, 表示該自定義標籤的某屬性的值只能直接指定,  example as follow:

<myTag:cupSize cupSize="1"cupSizes="${result}"></myTag:cupSize>

 

...................................................................................................................................................................................................................

 

TLD檔案配置詳解(jsp自定義標籤)

 

<tag>

<name>write</name>

<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>

<bodycontent>empty</bodycontent>

<attribute>

<name>bundle</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>其中:

<name>write</name>:這個Tag的名字

<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>:這個Tag是由那個類實現的(這個class可以在struts.jar包中找到)

<bodycontent>empty</bodycontent>:這個Tag可以直接結尾,不需要填寫內容

   這裡bodycontent有三個可選值

      jsp        標籤體由其他jsp元素組成  

        如果其有jsp元素,那麼標籤會先解釋,然後將元素的實際值傳入。比如標籤體裡含有<%=attributeName%>這樣子的jsp元素,此時標籤會按attributeName的實際值是什麼就傳入什麼。這個是最常用的一個。

      empty 標籤體必須為空  

        在引用這個Tag的時候,可以<bean:writebundle="attributeName" />,而不必<bean:write bundle="attributeName"></bean:write>

      tagdependent 由標籤解釋,不帶jsp轉換

<attribute> </attribute>這裡標識的是這個Tag的一個引數

<name>bundle</name>這個引數的名字

<required>false</required>這個引數是否是必填相

     如果為true則必須寫這個引數,否則會報錯

<rtexprvalue>true</rtexprvalue>是說這個標籤的值可以寫入

      rtexprvalue:"RUN-TIME EXPRESSION VALUE",是否可以動態賦值,在jsp中如value="<%=attributeName%>"

 

...................................................................................................................................................................................................................

 

過載BodyTagSupport類的方法:

編寫標籤對應的實現類時,需要過載BodyTagSupport類幾個方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(),doEndTag();

 

 

他們執行順序如下:

doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

 

 

doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,

如果返回EVAL_BODY_INCLUDE則繼續執行;

如果返回SKIP_BODY則接下來的doInitBody(),setBodyContent(),doAfterBody()三個方法不會被執行,

而直接執行doEndTag()方法。

 

setBodyContent()方法用於設定標籤體內容,如果在此之前要作一些初始化工作,則在doInitBody()方法中完成。

標籤體內容執行完後,會呼叫doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,

EVAL_PAGE或SKIP_PAGE。

如果返回EVAL_BODY_TAG則會再次設定標籤體內容,直到返回SKIP_BODY;

如果返回EVAL_PAGE則標籤體執行完後會繼續執行JSP頁面中接下來的部分;

如果返回SKIP_PAGE,則JSP頁面的後續內容將不再執行。

 

標籤中靜態常量:

 

EVAL_BODY_INCLUDE:告訴伺服器正文的內容,並把這些內容送入輸出流

SKIP_BODY:告訴伺服器不要處理正文內容

EVAL_PAGE:讓伺服器繼續執行頁面

SKIP_PAGE:讓伺服器不要處理剩餘的頁面

EVAL_BODY_AGAIN:讓伺服器繼續處理正文內容,只有doAfterBody方法可以返回

EVAL_BODY_BUFFERED:BodyTag介面的欄位,在doStartTag()返回

EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

 

相關文章