blogjava's web log

          blogjava's web log
          ...

          jsp自定義標記--筆記


          可以創建自己的標記
          自定義動作是通過自定義標記來調用
          自定義標記提供了可重用、可維護及可移植的內容生成解決方案
          自定義標記的集合稱為標記庫

          自定義標記是顯式設計的,用于在 JSP 頁面中添加功能,包括頁面內容(如HTML)的動態生成

          ?
          定義自定義標記的步驟:
          ? 1.為標記開發標記處理程序和助手類
          ? 2.? 在標記庫描述文件?Web.xml 中聲明標記
          ?? tagdemojsp-------->webxml-------->mytag.tld---------> 標記處理程序類
          ?標記處理程序類
          執行與自定義標記關聯的動作的 Java 對象
          必須實現javax.servlet.jsp.tagext包的Tag或Body Tag接口
          支持以下方法:
          setPageContext(),??? setParent()
          doStartTag(), doEndTag()? and release()


          doStartTag()
          自定義標記開始時調用
          返回在標記接口中定義的 int 常量的EVAL_BODY_INCLUDE或 SKIP_BODY,以決定是否處理標記的主題部分。
          doEndTag()
          在自定義標記結束時調用
          返回 EVAL_PAGE 或 SKIP_PAGE。如果它返回 EVAL_PAGE或SKIP_PAGE,以決定是否處理頁面的其余部分。

          標記庫描述文件

          標記庫描述文件 (TLD) 是描述標記庫的 XML 文檔。JSP 容器使用TLD來驗證標記。
          TLD 包含關于作為整體的庫以及包含在庫中的每個標記的信息。
          TLD還包含各種標記元素,每種元素均作了詳細解釋。

          標記元素的信息
          <tag>
          ??
          <name>Greeting</name>
          <tagclass>examples.servlets.Greeting</tagclass>
          ??
          <bodycontent>empty</bodycontent>
          ??
          <info>Tag?with?Parameter</info>
          </tag>

          標記屬性的信息
          <attribute>
          ????
          <name>num1</name>
          ????
          <required>true</required>
          ????
          <rtexprvalue>false</rtexprvalue>
          </attribute>

          標記庫描述文件

          <?xml?version="1.0"?encoding="ISO-8859-1"??>
          <!DOCTYPE?taglib?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?JSP?Tag?Library?1.1//EN"?"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
          <taglib>
          ??
          <tlibversion>1.0</tlibversion>
          ??
          <jspversion>1.1</jspversion>
          ??
          <shortname>mytag</shortname>
          ??
          <uri></uri>
          </taglib>

          web.xml聲明
          <?xml?version="1.0"?encoding="UTF-8"?>
          <!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.3//EN"?"http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          ??
          <taglib>
          ???
          <taglib-uri>mycusttag</taglib-uri>
          ???
          <taglib-location>/WEB-INF/mytag.tld</taglib-location>
          ??
          </taglib>
          </web-app>


          在JSP中使用標記庫
          <html>
          ??
          <title>?Custom?JSP?Tag?example?</title>
          ????
          <%@?taglib?uri="mycusttag"?prefix="mytag"?%>
          ????Here?comes?the?tag:
          <p>
          ??
          <body?bgcolor=wheat>
          ????
          <i><mytag:Greeting/></i>
          ????
          <p>There?went?the?tag.</p>
          ??
          </body>
          </html>

          下面看個例子。。
          功能是輸出給定指定數 的行數。。

          新建一個類繼承 BodyTagSupport? 類
          代碼如下:
          package?tagtest.mytag;

          import?javax.servlet.jsp.tagext.BodyTagSupport;
          import?javax.servlet.jsp.JspTagException;
          import?javax.servlet.jsp.tagext.BodyContent;

          public?class?LoopTag?extends?BodyTagSupport?{

          ????
          private?int?count;
          ????
          public?LoopTag()?{
          ????}


          ????
          public?void?setCount(int?count)?{
          ????????
          this.count?=?count;
          ????}

          ????
          public?int?doStartTag()?throws?JspTagException
          ?????
          {
          ?????????System.out.println(
          "doStartTag");
          ?????????
          if(count>0)
          ?????????
          {
          ?????????????
          return?EVAL_BODY_TAG;
          ?????????}

          ?????????
          else
          ?????????
          {
          ??????????????
          return?SKIP_BODY;
          ?????????}

          ?????}

          ?????
          /**
          ????*覆蓋doAfterBody方法
          ????
          */

          ???
          public?int?doAfterBody()?throws?JspTagException
          ???
          {
          ???????System.out.println(
          "doAfterBody"+count);
          ???????
          if(count>1)
          ???????
          {
          ???????????????count
          --;
          ???????????????
          return?EVAL_BODY_TAG;
          ????????}

          ????????
          else
          ????????
          {
          ???????????
          return?SKIP_BODY;
          ????????}

          ???}

          ???
          public?int?doEndTag()?throws?JspTagException
          ???
          {
          ?????System.out.println(
          "doEndTag");
          ???????
          try
          ???????
          {
          ????????????
          if(bodyContent?!=?null)
          ????????????
          {
          ????????????????????bodyContent.writeOut(bodyContent.getEnclosingWriter());
          ????????????}

          ???????}

          ???????
          catch(java.io.IOException?e)
          ???????
          {
          ???????????????
          throw?new?JspTagException("IO?Error:?"?+?e.getMessage());
          ???????}

          ???????
          return?EVAL_PAGE;
          ???}


          ???
          public?void?doInitBody()?throws?JspTagException{
          ??????System.out.println(
          "doInitBody");
          ?????}

          ?????
          public?void?setBodyContent(BodyContent?bodyContent)
          ?????
          {
          ??????????System.out.println(
          "setBodyContent");
          ??????????
          this.bodyContent=bodyContent;
          ?????}

          }


          在WEB-INF 下新建mytag.tld 文件。。
          <?xml?version="1.0"?encoding="ISO-8859-1"??>
          <!DOCTYPE?taglib?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?JSP?Tag?Library?1.1//EN"?"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">


          <taglib>
          <tlibversion>1.0</tlibversion>
          <jspversion>2.0</jspversion>
          <shortname>mytag</shortname>

          <tag>
          <name>Loop</name>
          <tagclass>tagtest.mytag.LoopTag</tagclass>
          <attribute>
          <name>count</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
          </attribute>
          </tag>
          </taglib>
          web.xml 文件加上一句
          ??<taglib>
          ????
          <taglib-uri>/WEB-INF/mytag.tld</taglib-uri>
          ????
          <taglib-location>/WEB-INF/mytag.tld</taglib-location>
          ??
          </taglib>
          新建JSP頁。。
          <%@?page?contentType="text/html;?charset=GBK"?%>
          <!--這里加上這句-->
          <%@?taglib?uri="/WEB-INF/mytag.tld"?prefix="mytag"?%>

          <html>
          <head>
          <title>
          firstTag
          </title>
          </head>
          <body?bgcolor="#ffffff">
          <!--count?要循環的次數-->
          <mytag:Loop?count="10">
          wujunjunjunjun
          <br>
          </mytag:Loop>
          </body>
          </html>
          上面寫的10? 運行后頁面應該打印10行 wujunjunjunjun了。。

          posted on 2006-04-05 22:56 record java and net 閱讀(537) 評論(1)  編輯  收藏 所屬分類: Jsp&&Web

          評論

          # re: jsp自定義標記--筆記 2006-09-16 19:23 ert

          retert  回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 济源市| 额济纳旗| 胶州市| 阳春市| 新竹市| 汨罗市| 桃园县| 东城区| 德化县| 青岛市| 临沂市| 新昌县| 炎陵县| 英德市| 石首市| 尼木县| 洪雅县| 三明市| 甘南县| 咸阳市| 敦煌市| 安溪县| 房产| 社旗县| 封丘县| 芦溪县| 玉树县| 陆川县| 内丘县| 中江县| 延庆县| 厦门市| 凤庆县| 奇台县| 灯塔市| 盱眙县| 新昌县| 泉州市| 句容市| 阿拉善盟| 阳西县|