製作tld檔案及應用詳解
1、開個環境:myeclipse6.5+tomcat6.0.23
所需元件jree5.0
2、index.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>
3、web.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、寫自定義Tag的tld檔案
<?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()返回。
相關文章
- Linux網路卡的配置檔案詳解及應用Linux
- JSP自定義標籤開發+TLD檔案元素詳解JS
- JSP中的TAG檔案和TLD檔案JS
- 製作ISO檔案
- 詳解SpringBoot(2.3)應用製作Docker映象(官方方案)Spring BootDocker
- 直播平臺製作,支援其他應用開啟,接收其他應用檔案並儲存
- 歸併排序詳解及應用排序
- 檔案補丁製作
- 製作ISO檔案 與 提取ISO檔案
- 製作URL檔案的方法
- Matlab製作shp檔案Matlab
- Oracle minus用法詳解及應用例項Oracle
- IMS AKA鑑權及應用流程詳解
- 應用程式池屬性詳解及配置
- rootfs -根檔案系統製作
- patch檔案的製作與使用
- 輕鬆製作PDF檔案(轉)
- Linux 動態庫與靜態庫製作及使用詳解Linux
- Mac如何使用預覽應用合併PDF檔案 Mac合併PDF檔案教程詳解Mac
- 詳解javascript拖拽(二)拖拽的應用及示例JavaScript
- IIS應用程式池配置詳解及優化優化
- BabyLinux製作過程詳解(轉)Linux
- 8個純CSS3製作的動畫應用及原始碼CSSS3動畫原始碼
- Dockerfile檔案詳解Docker
- mtl檔案詳解
- cmake檔案詳解
- BMP檔案詳解
- LD檔案詳解
- Python檔案讀寫詳解及設定檔案的字元編碼Python字元
- 如何製作一個 RPM 檔案
- Python製作egg檔案包Python
- nginx製作檢查配置bat檔案NginxBAT
- DMG檔案格式製作:DMG Canvas for MacCanvasMac
- Windows XP 映像檔案製作指南(轉)Windows
- nginx伺服器安裝及配置檔案詳解Nginx伺服器
- Nginx 伺服器安裝及配置檔案詳解Nginx伺服器
- php複製目錄及檔案PHP
- Linux 建立檔案系統及掛載檔案系統詳解一薦Linux