隨筆 - 1  文章 - 2  trackbacks - 0
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評論

          建立第一個自定義標簽

          這個例子是在Eclipse3.1+MyEclipse4.1+Tomcat5.0的環境下運行通過的。

          本來,這個例子在網上可以搜到的,但是,在實驗中卻通不過,什么也輸不出。我不知道作者有沒有實驗,還是其它原因。這里只列出正確的代碼,具體的說明可以在網上搜到。

          完成功能:擴展JSP,令它擁有自己的HTML編碼功能。這個功能將所有的<和>字符用 HTML代碼來代替。它可以很容易地擴展為做其它的編碼處理。為了簡化,這個例子只解釋了建立自定義標簽的基本要素。

          在MyEclipse中建立一個Web工程。

          創建JavaBean

          代碼中的任何可重用部分都應該放到一個JavaBean中。在這個例子中,為HTML編碼的邏輯是常用的,因此放到JavaBean中,請參看清單A
          清單B:HTML編碼JavaBean
          /* HTML_Format.java */
          public class HTML_Format extends Object implements java.io.Serializable {

          /** 創建新的HTML_Format */
          public HTML_Format() {}

          /** 將一個字符串中所有的所有 < 和 > 字符用響應的HTML編碼代替 */
          public String HTML_Encode(String as_data)
          {
              int li_len = as_data.length();

              /*string buffer的長度要比原來的字符串長*/
              StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));

              /* 循環替換全部的< 和 > 字符 */
              for( int li_count = 0 ; li_count < li_len ; li_count++)
              {

              String ls_next = String.valueOf(as_data.charAt(li_count));
              if (ls_next.equals("<")) ls_next = "&lt";
              if (ls_next.equals(">")) ls_next = "&gt";
              lsb_encode.append( ls_next );
              }

              return( lsb_encode.toString() );
              }
          }

          創建標簽處理器
          標簽處理器的代碼請參看清單B:
          清單C:HTML編碼標簽處理器 HTML_FormatTag.java
          import java.io.IOException;
          import javax.servlet.jsp.*;
          import javax.servlet.jsp.tagext.*;

          public class HTML_FormatTag extends BodyTagSupport
          {
          /* 1) 在標簽末將會調用這個函數 */
          public int doEndTag() throws JspTagException
          {
          try
          { /* 2)得到標簽中的文本 */
          BodyContent l_tagbody = getBodyContent();
          String ls_output = "";

          /* 3)如果標簽體有文本,就處理它 */
          if(l_tagbody != null)
          { HTML_Format l_format = new HTML_Format();
          /* 3a) 將標簽體的內容轉換為一個字符串 */
          String ls_html_text = l_tagbody.getString();
          ls_output = l_format.HTML_Encode(ls_html_text);
          }
          /* 4)將結果寫回到數據流中 */
          System.out.println(ls_output);
          pageContext.getOut().write(ls_output.trim());
          }
          catch (IOException e)
          { throw new JspTagException("Tag Error:" + e.toString());
          }

          /* 讓JSP繼續處理以下頁面的內容 */
          return EVAL_PAGE;
          }
          }


          創建標簽描述符

          我們需要描述自定義標簽以讓系統知道如何處理。該描述文件的后綴為.tld,TLD文件通常就以標簽處理器命名,并存放在“/WEB-INF/”目錄之下。請在eclipse的工程中在“/WEB-INF/”目錄上點右鍵,New-->File,即可注意后綴名為.tld。請參看清單C。
          清單C:HTML編碼標簽描述器HTML_FormatTag.tld
          <?xml version="1.0" encoding="ISO-8859-1" ?>

          <taglib>
              <tlibversion>1.0</tlibversion>
              <jspversion>1.2</jspversion>
              <shortname>HTML_FormatTag</shortname>
              <uri></uri>
              <info>HTML Encoding Tag</info>
              <tag>
                  <name>HTMLEncode</name>
                  <tag-class>tagtest.HTML_FormatTag</tag-class>
                  <body-content>tagdependent</body-content>
              </tag>
          </taglib>

          更新Web XML文件

          現在可以告訴JSP容器如何使用標簽庫了。為此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來注冊該標簽庫,并為標簽分配一個URI。示例代碼請參看清單D。

          清單D:修改web.xml文件

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.4"
              xmlns="http://java.sun.com/xml/ns/j2ee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
           <jsp-config>
               <taglib>
                   <taglib-uri>HTMLEncode</taglib-uri>
                   <taglib-location>/WEB-INF/HTML_FormatTag.tld</taglib-location>
               </taglib>
           </jsp-config>
          </web-app>

          注意要加上jsp-config標簽,否則在MyEclipse中報錯誤的。

          使用新的標簽

          自定義的標簽設置好后,就可以用在你的JSP頁面上了。要做到這一點,只需要在頁面上使用 taglib指示命令聲明所要采用的標簽即可。標簽通過其唯一的 URI被索引,然后被分配給一個名字空間前綴(prefix)。這一前綴并沒有什么特別的意義,只要它不與其它的名字空間沖突便可,可以任意。請參看以下 的清單E。


          清單E:在一個JSP頁面上使用HTML編碼標簽testtag.jsp


          <%@ page language="java" pageEncoding="UTF-8"%>
          <%@ taglib uri="HTMLEncode" prefix="Examples" %>

          <html>
          <head>
              <title>My JSF 'testtag.jsp' starting page</title>
          </head>
           
          <body>
          This is a test.
          <pre>
          <Examples:HTMLEncode>
          test:<Hello,this World>
          </Examples:HTMLEncode>
          </pre>
          this is a test.
          </body>

          輸出:

          This is a test.
          test:<Hello,this World>
          This is a test.

          最開始,我按照網上的教程,可是,這一句:pageContext.getOut().write(ls_output.trim());就是不輸出到JSP頁面上。

          后來,我查看了JSP的源代碼,才發現其實已經輸出到JSP頁面,但是被JSP頁面把<Hello,this World>作為了HTML標簽(但是,它不是HTML標簽),就在瀏覽器上展現不出來了。

          于是,我在HTML_Format.java類中改動了以下兩句話:
              if (ls_next.equals("<")) ls_next = "&lt";
              if (ls_next.equals(">")) ls_next = "&gt";
          就成功得輸出了。
          posted on 2007-04-30 11:23 leitter 閱讀(921) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 广安市| 桐梓县| 青海省| 安庆市| 江北区| 荥阳市| 万州区| 阳高县| 应城市| 桐柏县| 新竹市| 皋兰县| 黔西县| 福贡县| 化州市| 宁阳县| 秭归县| 乐陵市| 杭州市| 寻甸| 佛教| 江孜县| 宜丰县| 海林市| 特克斯县| 灵武市| 莱西市| 井陉县| 许昌县| 安康市| 无为县| 高要市| 喀喇沁旗| 武鸣县| 公主岭市| 海阳市| 鄂州市| 柳州市| 和平县| 汉源县| 临高县|