<tm:DBconnectionTag>標籤處理器:繼承 TagSupport,實作 doEndTag() 執行 JDBC 查詢並輸出結果。
public class DBconnectionTag extends TagSupport {
private String driver, url, username, password, sql;
// setter/getter 省略
public int doEndTag() throws JspException {
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) pageContext.getOut().print(rs.getString("cname") + "<br/>");
return EVAL_PAGE;
} catch (Exception e) { return SKIP_PAGE; }
finally { /* 關閉資源 */ }
}
}
TLD 定義:指定屬性 driver、url 等,body-content>empty。
JSP 使用:
<%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %>
<tm:DBconnectionTag url="jdbc:mysql://..." driver="com.mysql.jdbc.Driver"
username="root" password="pwd" sql="select * from course"/>
<tm:foreach>List、Set、Map(轉為 EntrySet)doStartTag() + doAfterBody() 實現多次評估 BodypageContext 供 EL 表達式 ${var} 取用<tm:IteratorTagDemo>items 接收 String[]i 控制迭代<tm:SkipPageOrEvalPageTag>doEndTag() 檢查 Referer 標頭EVAL_PAGE,非法輸出「盜鏈」並返回 SKIP_PAGE 終止頁面執行<tm:simpleforeachAll>Collection、Map、陣列(含基本型別陣列透過反射轉 ArrayList)doTag() 內完成迭代與 jspBody.invoke(null)<tm:referer>SkipPageException 直接中斷頁面<tm:bodyTag>BodyContent 獲取標籤體字串getEnclosingWriter() 向外層輸出修改後內容<tm:bodyTag>hello</tm:bodyTag> 替換為 www.cnblogs.com/izhongwei| 屬性 | 說明 |
|---|---|
| body-content | empty無體、scriptless無腳本、JSP/tagdependent任意內容 |
| rtexprvalue | true允許 EL/運行時表達式 |
| required | true屬性必填 |
doStartTag/doAfterBody 狀態機複雜度。WEB-INF/classes 或打包 JAR 放 WEB-INF/lib,TLD 放 WEB-INF/tlds/ 或 JAR META-INF/ 下。