jsp的自定义标签

http://blog.csdn.net/u010819416/article/details/43318029

一种可在页面中使用的标签,这种标具有和HTML标签类似的语法,但又可以完成JSP脚本的功能——这种标签就是JSP自定义标签。

开发标签库的步骤:

1、开发自定义标签处理类;

2、建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签;

3、在jsp文件中使用自定义标签。

2.11.1 开发自定义标签类

*自定义标签类应该继承一个父类:java.servlet.jsp.tagext.SimpleTagSupport;
*如果标签类包含属性,每个属性都有对应的getter和setter方法;
*重写doTag()方法,这个方法负责生产页面内容
例子:
     在页面上输出HelloWord的标签:HelloWorldTag.java
[java]  view plain  copy
 print ?
  1. package lee;  
  2. import javax.servlet.jsp.tagext.*;  
  3. import javax.servlet.jsp.*;  
  4. import java.io.*;  
  5. public class HelloWorldTag extends SimpleTagSupport  
  6. {  
  7.     //重写doTag方法,该方法在标签结束生成页面内容  
  8.     public void doTag()throws JspException,  
  9.         IOException  
  10.     {  
  11.         //获取页面输出流,并输出字符串  
  12.         getJspContext().getOut().write("Hello World "  
  13.             + new java.util.Date());  
  14.     }  
  15. }  

2.11.2建立TLD文件

TLD(Tag Library Definition),标签库定义。标签库定义文件的根元素是taglib,它可以包含多个tag子元素,每个tag子元素都定义一个标签。
例子:mytaglib.tld
[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="GBK"?>  
  2.   
  3. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"  
  6.     version="2.0">  
  7.     <tlib-version>1.0</tlib-version>  
  8.     <short-name>mytaglib</short-name>  
  9.     <!-- 定义该标签库的URI -->  
  10.     <uri>http://www.crazyit.org/mytaglib</uri>  
  11.   
  12.     <!-- 定义第一个标签 -->  
  13.     <tag>  
  14.         <!-- 定义标签名 -->  
  15.         <name>helloWorld</name>  
  16.         <!-- 定义标签处理类 -->  
  17.         <tag-class>lee.HelloWorldTag</tag-class>  
  18.         <!-- 定义标签体为空 -->  
  19.         <body-content>empty</body-content>  
  20.     </tag>  
  21. </taglib>  
标签库文件放在Web应用的WEB-INF路径或任意子路径下,Java Web规范会自动加载该文件,则该文件定义的标签库也将生效。

2.11.3 使用标签库

1、导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来。
2、使用标签:在JSP页面中使用自定义标签。

taglib的语法格式如下:
<%@ taglib uri="tagliburi" prefix="tagPrefix"%>
其中uri属性指定标签库的URI,这个URI可以确定一个标签库。而prefix属性指定标签库前缀,即所有使用该前缀的标签将由此标签库处理。

使用标签的语法格式如下:
<tagPrefix:tagName tagAttribute="tagValue" ...>
<tagBody/>
</tagPrefix:tagName>
如果该标签没有标签体,则可以使用如下语法格式:
<tagPrefix:tagName tagAttribute="tagValue" .../>

例子:helloWorldTag.jsp
[java]  view plain  copy
 print ?
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <!-- 导入标签库,指定mytag前缀的标签,  
  3.     由http://www.crazyit.org/mytaglib的标签库处理 -->  
  4. <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  6.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  7. <html xmlns="http://www.w3.org/1999/xhtml">  
  8. <head>  
  9.     <title>自定义标签示范</title>  
  10.     <meta name="website" content="http://www.crazyit.org" />  
  11. </head>  
  12. <body bgcolor="#ffffc0">  
  13. <h2>下面显示的是自定义标签中的内容</h2>  
  14. <!-- 使用标签 ,其中mytag是标签前缀,根据taglib的编译指令,  
  15.     mytag前缀将由http://www.crazyit.org/mytaglib的标签库处理 -->  
  16. <mytag:helloWorld/><br/>  
  17. </body>  
  18. </html>  

2.11.4 带属性的标签

例子:QueryTag.java
[java]  view plain  copy
 print ?
  1. package lee;  
  2.   
  3. import javax.servlet.jsp.tagext.*;  
  4. import javax.servlet.jsp.*;  
  5. import java.io.*;  
  6. import java.sql.*;  
[java]  view plain  copy
 print ?
  1. public class QueryTag extends SimpleTagSupport  
  2. {  
  3.     //标签的属性  
  4.     private String driver;  
  5.     private String url;  
  6.     private String user;  
  7.     private String pass;  
  8.     private String sql;  
  9.   
  10.     //driver属性的setter和getter方法  
  11.     public void setDriver(String driver)  
  12.     {  
  13.         this.driver = driver;  
  14.     }  
  15.     public String getDriver()  
  16.     {  
  17.         return this.driver;  
  18.     }  
  19.       
  20.     //url属性的setter和getter方法  
  21.     public void setUrl(String url)  
  22.     {  
  23.         this.url = url;  
  24.     }  
  25.     public String getUrl()  
  26.     {  
  27.         return this.url;  
  28.     }  
  29.       
  30.     //user属性的setter和getter方法  
  31.     public void setUser(String user)  
  32.     {  
  33.         this.user = user;  
  34.     }  
  35.     public String getUser()  
  36.     {  
  37.         return this.user;  
  38.     }  
  39.       
  40.     //pass属性的setter和getter方法  
  41.     public void setPass(String pass)  
  42.     {  
  43.         this.pass = pass;  
  44.     }  
  45.     public String getPass()  
  46.     {  
  47.         return this.pass;  
  48.     }     
  49.       
  50.     //sql属性的setter和getter方法  
  51.     public void setSql(String sql)  
  52.     {  
  53.         this.sql = sql;  
  54.     }  
  55.     public String getSql()  
  56.     {  
  57.         return this.sql;  
  58.     }     
  59.       
  60.     //conn属性的setter和getter方法  
  61.     public void setConn(Connection conn)  
  62.     {  
  63.         this.conn = conn;  
  64.     }  
  65.     public Connection getConn()  
  66.     {  
  67.         return this.conn;  
  68.     }  
  69.       
  70.     //stmt属性的setter和getter方法  
  71.     public void setStmt(Statement stmt)  
  72.     {  
  73.         this.stmt = stmt;  
  74.     }  
  75.     public Statement getStmt()  
  76.     {  
  77.         return this.stmt;  
  78.     }     
  79.       
  80.     //rs属性的setter和getter方法  
  81.     public void setRs(ResultSet rs)  
  82.     {  
  83.         this.rs = rs;  
  84.     }  
  85.     public ResultSet getRs()  
  86.     {  
  87.         return this.rs;  
  88.     }  
  89.       
  90.     //rsmd属性的setter和getter方法  
  91.     public void setRsmd(ResultSetMetaData rsmd)  
  92.     {  
  93.         this.rsmd = rsmd;  
  94.     }  
  95.     public ResultSetMetaData getRsmd()  
  96.     {  
  97.         return this.rsmd;  
  98.     }  
  99.     //执行数据库访问的对象   
  100.     private Connection conn = null;  
  101.     private Statement stmt = null;  
  102.     private ResultSet rs = null;  
  103.     private ResultSetMetaData rsmd = null;  
  104.     public void doTag()throws JspException,  
  105.         IOException  
  106.     {  
  107.         try  
  108.         {  
  109.             //注册驱动  
  110.             Class.forName(driver);  
  111.             //获取数据库连接  
  112.             conn = DriverManager.getConnection(url,user,pass);  
  113.             //创建Statement对象  
  114.             stmt = conn.createStatement();  
  115.             //执行查询  
  116.             rs = stmt.executeQuery(sql);  
  117.             rsmd = rs.getMetaData();  
  118.             //获取列数目  
  119.             int columnCount = rsmd.getColumnCount();  
  120.             //获取页面输出流  
  121.             Writer out = getJspContext().getOut();  
  122.             //在页面输出表格  
  123.             out.write("<table border='1' bgColor='#9999cc' width='400'>");  
  124.             //遍历结果集  
  125.             while (rs.next())  
  126.             {  
  127.                 out.write("<tr>");  
  128.                 //逐列输出查询到的数据  
  129.                 for (int i = 1 ; i <= columnCount ; i++ )  
  130.                 {  
  131.                     out.write("<td>");  
  132.                     out.write(rs.getString(i));  
  133.                     out.write("</td>");  
  134.                 }  
  135.                 out.write("</tr>");  
  136.             }  
  137.         }  
  138.         catch(ClassNotFoundException cnfe)  
  139.         {  
  140.             cnfe.printStackTrace();  
  141.             throw new JspException("自定义标签错误" + cnfe.getMessage());  
  142.         }  
  143.         catch (SQLException ex)  
  144.         {  
  145.             ex.printStackTrace();  
  146.             throw new JspException("自定义标签错误" + ex.getMessage());  
  147.         }  
  148.         finally  
  149.         {  
  150.             //关闭结果集  
  151.             try  
  152.             {  
  153.                 if (rs != null)  
  154.                     rs.close();  
  155.                 if (stmt != null)  
  156.                     stmt.close();  
  157.                 if (conn != null)  
  158.                     conn.close();  
  159.             }  
  160.             catch (SQLException sqle)  
  161.             {  
  162.                 sqle.printStackTrace();  
  163.             }  
  164.         }  
  165.     }  
  166. }  
对于有属性的标签,需要为<tag.../>元素增加<attribute.../>子元素,每个attribute子元素定义一个标签属性。<attribute.../>子元素通常还需要指定如下几个子元素:
1、name:设置属性名,子元素的值是字符串内容
2、required:设置该属性是否为必须属性
3、fragment: 设置该属性是否支持JSP脚本、表达式等动态内容
[html]  view plain  copy
 print ?
  1. <!-- 定义第二个标签 -->  
  2.     <tag>  
  3.         <!-- 定义标签名 -->  
  4.         <name>query</name>  
  5.         <!-- 定义标签处理类 -->  
  6.         <tag-class>lee.QueryTag</tag-class>  
  7.         <!-- 定义标签体为空 -->  
  8.         <body-content>empty</body-content>  
  9.         <!-- 配置标签属性:driver -->  
  10.         <attribute>  
  11.             <name>driver</name>   
  12.             <required>true</required>  
  13.             <fragment>true</fragment>  
  14.         </attribute>  
  15.         <!-- 配置标签属性:url -->  
  16.         <attribute>  
  17.             <name>url</name>   
  18.             <required>true</required>  
  19.             <fragment>true</fragment>  
  20.         </attribute>  
  21.         <!-- 配置标签属性:user -->  
  22.         <attribute>  
  23.             <name>user</name>   
  24.             <required>true</required>  
  25.             <fragment>true</fragment>  
  26.         </attribute>  
  27.         <!-- 配置标签属性:pass -->  
  28.         <attribute>  
  29.             <name>pass</name>   
  30.             <required>true</required>  
  31.             <fragment>true</fragment>  
  32.         </attribute>  
  33.         <!-- 配置标签属性:sql -->  
  34.         <attribute>  
  35.             <name>sql</name>   
  36.             <required>true</required>  
  37.             <fragment>true</fragment>  
  38.         </attribute>  
  39.     </tag>  
使用标签:queryTag.jsp
[java]  view plain  copy
 print ?
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <!-- 导入标签库,指定mytag前缀的标签,  
  3.     由http://www.crazyit.org/mytaglib的标签库处理 -->  
  4. <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  6.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  7. <html xmlns="http://www.w3.org/1999/xhtml">  
  8. <head>  
  9.     <title>自定义标签示范</title>  
  10.     <meta name="website" content="http://www.crazyit.org" />  
  11. </head>  
  12. <body bgcolor="#ffffc0">  
  13. <h2>下面显示的是查询标签的结果</h2>  
  14. <!-- 使用标签 ,其中mytag是标签前缀,根据taglib的编译指令,  
  15.     mytag前缀将由http://www.crazyit.org/mytaglib的标签库处理 -->  
  16. <mytag:query  
  17.     driver="com.mysql.jdbc.Driver"  
  18.     url="jdbc:mysql://localhost:3306/javaee"  
  19.     user="root"  
  20.     pass="32147"  
  21.     sql="select * from news_inf"/><br/>  
  22. </body>  
  23. </html>  

*JSTL是sun提供的一套标签库,这套标签库的功能非常强大(就是C标签)。

2.11.5 带标签体的标签

带标签体的标签,可以在标签内嵌入其他内容(包括静态的HTML内容和动态的JSP内容),通常用于完成一些逻辑运算,例如判断和循环等。
迭代器标签例子:IteratorTag.java
[java]  view plain  copy
 print ?
  1. package lee;  
  2.   
  3. import javax.servlet.jsp.tagext.*;  
  4. import javax.servlet.jsp.*;  
  5. import java.io.*;  
  6. import java.sql.*;  
  7. import java.util.*;  
  8.   
  9. public class IteratorTag extends SimpleTagSupport  
  10. {  
  11.     //标签属性,用于指定需要被迭代的集合  
  12.     private String collection;  
  13.     //标签属性,指定迭代集合元素,为集合元素指定的名称  
  14.     private String item;  
  15.       
  16.     //collection属性的setter和getter方法  
  17.     public void setCollection(String collection)  
  18.     {  
  19.         this.collection = collection;  
  20.     }  
  21.     public String getCollection()  
  22.     {  
  23.         return this.collection;  
  24.     }  
  25.     //item属性的setter和getter方法  
  26.     public void setItem(String item)  
  27.     {  
  28.         this.item = item;  
  29.     }  
  30.     public String getItem()  
  31.     {  
  32.         return this.item;  
  33.     }  
  34.     //标签的处理方法,简单标签处理类只需要重写doTag方法  
  35.     public void doTag() throws JspException, IOException  
  36.     {  
  37.         //从page scope中获取属性名为collection的集合  
  38.         Collection itemList = (Collection)getJspContext().  
  39.             getAttribute(collection);  
  40.         //遍历集合  
  41.         for (Object s : itemList)  
  42.         {  
  43.             //将集合的元素设置到page 范围  
  44.             getJspContext().setAttribute(item, s );  
  45.             //输出标签体  
  46.             getJspBody().invoke(null);  
  47.         }  
  48.     }  
  49. }  
getJspBody()方法返回该标签所包含的标签体:JSPFragment对象,执行该对象的invoke()方法,即可输出标签体内容。
因为该标签的标签体不为空,配置该标签时指定body-content为scripless
[java]  view plain  copy
 print ?
  1. <!-- 定义第三个标签 -->  
  2.     <tag>  
  3.         <!-- 定义标签名 -->  
  4.         <name>iterator</name>  
  5.         <!-- 定义标签处理类 -->  
  6.         <tag-class>lee.IteratorTag</tag-class>  
  7.         <!-- 定义标签体不允许出现JSP脚本 -->  
  8.         <body-content>scriptless</body-content>  
  9.         <!-- 配置标签属性:collection -->  
  10.         <attribute>  
  11.             <name>collection</name>   
  12.             <required>true</required>  
  13.             <fragment>true</fragment>  
  14.         </attribute>  
  15.         <!-- 配置标签属性:item -->  
  16.         <attribute>  
  17.             <name>item</name>   
  18.             <required>true</required>  
  19.             <fragment>true</fragment>  
  20.         </attribute>  
  21.     </tag>  
使用标签:iteratorTag.jsp
[java]  view plain  copy
 print ?
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <%@ page import="java.util.*"%>  
  3. <!-- 导入标签库,指定mytag前缀的标签,  
  4. 由http://www.crazyit.org/mytaglib的标签库处理 -->  
  5. <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>  
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  7.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  8. <html xmlns="http://www.w3.org/1999/xhtml">  
  9. <head>  
  10.     <title> 带标签体的标签-迭代器标签 </title>  
  11.     <meta name="website" content="http://www.crazyit.org" />  
  12. </head>  
  13. <body>  
  14.     <h2>带标签体的标签-迭代器标签</h2><hr/>  
  15.     <%  
  16.     //创建一个List对象  
  17.     List<String> a = new ArrayList<String>();  
  18.     a.add("疯狂Java");  
  19.     a.add("www.crazyit.org");  
  20.     a.add("java");  
  21.     //将List对象放入page范围内  
  22.     pageContext.setAttribute("a" , a);  
  23.     %>  
  24.     <table border="1" bgcolor="#aaaadd" width="300">  
  25.         <!-- 使用迭代器标签,对a集合进行迭代 -->  
  26.         <mytag:iterator collection="a" item="item">  
  27.         <tr>  
  28.             <td>${pageScope.item}</td>  
  29.         <tr>  
  30.         </mytag:iterator>  
  31.     </table>  
  32. </body>  
  33. </html>  

2.11.6以页面片段作为属性的标签

*标签处理类中定义类型为JspFragment的属性,该属性代表了“页面片段”;
*使用标签库时,通过<jsp:attribute.../>动作指令为标签的属性指定值。
例子:FragmentTag.java
[java]  view plain  copy
 print ?
  1. package lee;  
  2.   
  3. import javax.servlet.jsp.tagext.*;  
  4. import javax.servlet.jsp.*;  
  5. import java.io.*;  
  6.   
  7.   
  8. public class FragmentTag extends SimpleTagSupport   
  9. {  
  10.     private JspFragment fragment;  
  11.       
  12.     //fragment属性的setter和getter方法  
  13.     public void setFragment(JspFragment fragment)  
  14.     {  
  15.         this.fragment = fragment;  
  16.     }  
  17.     public JspFragment getFragment()  
  18.     {  
  19.         return this.fragment;  
  20.     }  
  21.     @Override  
  22.     public void doTag() throws JspException, IOException  
  23.     {  
  24.         JspWriter out = getJspContext().getOut();  
  25.         out.println("<div style='padding:10px;border:1px solid black'>");  
  26.         out.println("<h3>下面是动态传入的JSP片段</h3>");  
  27.         //调用、输出“页面片段”  
  28.         fragment.invoke( null );  
  29.         out.println("</div");  
  30.     }  
  31. }  
配置标签:
[html]  view plain  copy
 print ?
  1. <tag>  
  2.         <!-- 定义标签名 -->  
  3.         <name>fragment</name>  
  4.         <!-- 定义标签处理类 -->  
  5.         <tag-class>lee.FragmentTag</tag-class>  
  6.         <!-- 指定该标签不支持标签体 -->  
  7.         <body-content>empty</body-content>  
  8.         <!-- 定义标签属性:fragment -->  
  9.         <attribute>  
  10.             <name>fragment</name>  
  11.             <required>true</required>  
  12.             <fragment>true</fragment>  
  13.         </attribute>  
  14.     </tag>  

由于该标签需要一个fragment 属性,该属性的类型为JSPFragment,因此使用该标签时需要使用<jsp:attribute.../>动作指令来设置属性值。

[java]  view plain  copy
 print ?
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <!-- 导入标签库,指定mytag前缀的标签,  
  3.     由http://www.crazyit.org/mytaglib的标签库处理 -->  
  4. <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  6.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  7. <html xmlns="http://www.w3.org/1999/xhtml">  
  8. <head>  
  9.     <title>自定义标签示范</title>  
  10.     <meta name="website" content="http://www.crazyit.org" />  
  11. </head>  
  12. <body bgcolor="#ffffc0">  
  13. <h2>下面显示的是自定义标签中的内容</h2>  
  14. <mytag:fragment>  
  15.     <!-- 使用jsp:attribute标签传入fragment参数 -->  
  16.     <jsp:attribute name="fragment">  
  17.         <!-- 下面是动态的JSP页面片段 -->  
  18.         <mytag:helloWorld/>  
  19.     </jsp:attribute>  
  20. </mytag:fragment>  
  21. <br/>  
  22. <mytag:fragment>  
  23.     <jsp:attribute name="fragment">  
  24.         <!-- 下面是动态的JSP页面片段 -->  
  25.         ${pageContext.request.remoteAddr}  
  26.     </jsp:attribute>  
  27. </mytag:fragment>  
  28. </html>  

2.11.7 动态属性的标签

我们需要传入自定义标签的属性个数是不确定的,属性名也不确定,这就需要借助于动态属性的标签了。
动态属性标签额外要求:
*标签处理类还需要实现DynamicAttributes接口。
*配置标签时通过<dynamic-attributes.../>子元素指定该标签支持动态属性。
例子:DynamicAttributesTag.java
[java]  view plain  copy
 print ?
  1. package lee;  
  2.   
  3. import javax.servlet.jsp.tagext.*;  
  4. import javax.servlet.jsp.*;  
  5. import java.io.*;  
  6. import java.util.*;  
  7.   
  8. public class DynaAttributesTag   
  9.     extends SimpleTagSupport implements DynamicAttributes  
  10. {  
  11.     //保存每个属性名的集合  
  12.     private ArrayList<String> keys = new ArrayList<String>();  
  13.     //保存每个属性值的集合  
  14.     private ArrayList<Object> values = new ArrayList<Object>();  
  15.   
  16.     @Override  
  17.     public void doTag() throws JspException, IOException  
  18.     {  
  19.         JspWriter out = getJspContext().getOut();  
  20.         //此处只是简单地输出每个属性  
  21.         out.println("<ol>");  
  22.         forint i = 0; i < keys.size(); i++ )  
  23.         {  
  24.             String key = keys.get( i );  
  25.             Object value = values.get( i );  
  26.             out.println( "<li>" + key + " = " + value + "</li>" );  
  27.         }  
  28.         out.println("</ol>");  
  29.     }  
  30.       
  31.     @Override  
  32.     public void setDynamicAttribute( String uri, String localName,   
  33.         Object value )   
  34.         throws JspException  
  35.     {  
  36.         //添加属性名  
  37.         keys.add( localName );  
  38.         //添加属性值  
  39.         values.add( value );  
  40.     }  
  41. }  
实现DynamicAttributesTag接口的setDynaAttribute()方法,该方法用于为该标签处理类动态地添加属性名和属性值。
配置标签:
[html]  view plain  copy
 print ?
  1. <!-- 定义接受动态属性的标签 -->  
  2.     <tag>  
  3.         <name>dynaAttr</name>  
  4.         <tag-class>lee.DynaAttributesTag</tag-class>  
  5.         <body-content>empty</body-content>  
  6.         <!-- 指定支持动态属性 -->  
  7.         <dynamic-attributes>true</dynamic-attributes>  
  8.     </tag>  
使用该标签;dynaAttrTag.jsp
[java]  view plain  copy
 print ?
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <!-- 导入标签库,指定mytag前缀的标签,  
  3.     由http://www.crazyit.org/mytaglib的标签库处理 -->  
  4. <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  6.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  7. <html xmlns="http://www.w3.org/1999/xhtml">  
  8. <head>  
  9.     <title>自定义标签示范</title>  
  10.     <meta name="website" content="http://www.crazyit.org" />  
  11. </head>  
  12. <body bgcolor="#ffffc0">  
  13. <h2>下面显示的是自定义标签中的内容</h2>  
  14. <h4>指定两个属性</h4>  
  15. <mytag:dynaAttr name="crazyit" url="crazyit.org"/><br/>  
  16. <h4>指定四个属性</h4>  
  17. <mytag:dynaAttr 书名="疯狂Java讲义" 价格="99.0"  
  18.     出版时间="2008年" 描述="Java图书"/><br/>  
  19. </body>  
  20. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值