• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            JSP與XML的結合

            綜述:可擴展標注語言(eXtensible Markup LanguageXML)正被迅速的運用于業界,它已作為與平臺、語言和協議無關的格式描述和交換數據的廣泛應用標準。XML和它的輔助規范可用于描述數據的文檔表現,描述XML文檔類型的限制,描述XML文檔和資源之間的鏈接,描述XML文檔的自動轉換和格式化。   如何開發自定義標簽庫?

              我使用JSPASP編程已經有一段頗長的時間了,在兩種服務器端的編程方式中,我越來越覺得JSP的功能要強大得多。不提別的,其中JSP的標簽庫就是我選擇JSP作為首選服務器端Web應用開發工具的原因。為什么?因為:維護和開發的速度。在一個單一的服務器頁面中,你可以混合使用各種不同的腳本方法和對象。就?quot;混凝土"一樣,這種混合可令服務器端的腳本變得強大,并且讓服務器端的編程者設計出非常靈活和動態的Web頁面。不過這種自由的混合也有其缺點,那就是維護起來非常麻煩,特別是當項目逐漸變大時。由于最終的產品是經由一個傳統的Web設計者來維護的,因此會帶來問題。更糟糕的是,隨著代碼的復雜性增加,開發的速度就會變慢,不利于開發中等和大型的Web應用,一旦開發完,站點還要找合格的編程者來維護這些頗為復雜的代碼。

            幸好,JSP提供了一個很好解決的辦法。標簽庫提供了一個簡單的方法來建立一個可重用的代碼塊。一旦標簽庫設計好,它就可以在許多項目中再次使用。更方便的是,與COMJ2EE不同,你無需學習任何其它的技巧就可以建立一個標簽庫!只要你懂得寫JSP,你就可以建立一個標簽庫。標簽庫還可以改善Web應用的維護。這個是得益于JSP頁面自定義標簽的簡單XML接口。這樣,Web設計者甚至可以做到無需知道任何JSP的知識,就可以建立JSPWeb應用。這個開放式的Web開發對于團隊運作是非常有效的。JSP編程者可以建立自定義的標簽和后臺的代碼模塊,而Web設計者可以使用自定義的標簽來建立Web應用,并且將精力集中在Web設計上。

              1. 標簽庫的定義

               JSP標簽庫(也稱自定義庫)可看成是一套產生基于XML腳本的方法,它經由JavaBeans來支持。在概念上說,標簽庫是非常簡單和可以重用的代碼構造。

            執行XML/XSL轉換的標簽范例和HTML頁面

            <
            @ taglib uri=" http://www.jspinsider.com/jspkit/JAXP " prefix="JAXP">

            c:/xml/example.xml

            c:/xml/example.xsl

              在這個例子中,通過使用簡單的標簽來訪問后臺更為強大的代碼,一個XML被裝載,并且通過一個XSL文件來產生一個結果,并發送給客戶端,全部通過使用一個簡單的標簽調用就做到了。

               自定義標簽為在JSP項目中創建易于重用的代碼打開了一扇大門。你所需要的只是標簽庫和它的文檔說明。

              2. 標簽的組件

               雖然標簽庫非常易于使用,不過要建立一個內里的設計來支持標簽庫是頗復雜的,起碼要比建立一個簡單的JavaBean復雜。這個復雜是來自于標簽庫是由幾部分構成的。不過,你只需要知道JavaJSP的知識就夠了。

            一個簡單的標簽由下面的元素構成:

               ⑴ JavaBeans:為了得到Java與生具來的面向對象的好處,可重用的代碼應該放到一個獨立的代碼容器中。這些JavaBeans并不是標簽庫的一部分。不過它是你的代碼庫用來執行相關任務的基本代碼塊。

              標簽處理:這是標簽庫的真正核心。一個標簽處理器將引用它需要的任何資源(你的JavaBeans)和訪問你的JSP頁面的全部信息(pageContext對象)。JSP頁面也會將所有已經被設置的標簽屬性和JSP頁面上的標簽體中的內容傳送給標簽處理器。在標簽處理器處理完畢后,它將發回輸出到你的JSP頁面進行處理。

              標簽庫的描述(tld文件):這是一個簡單的XML文件,它記錄著標簽處理器的屬性、信息和位置。JSP容器通過這個文件來得知從哪里及如何調用一個標簽庫。

              網站的web.xml文件:這是你網站的初始化文件,在這個文件中,你定義了網站中用到的自定義標簽,以及哪個tld文件用來描述每個自定義的標簽。

              分發文件(一個WAR或者JAR文件):如果你想重用自定義標簽的話,你需要一個方法來將它由一個項目轉移到另一個項目中。將標簽庫打包為一個JAR文件是一個簡單而且有效的方式。
            在你的JSP文件中作標簽庫聲明:很簡單,如果要用到該標簽的話,只要在頁面聲明一下就可以,其后,你就可以在該JSP頁面的任何地方使用它。

               看來要做的工作很多,不過其實并不是很難。它的要點并不在于編碼,而是在于如何將各部分正確地組織起來。不過,這樣的分層是很重要的,它可令標簽的使用靈活和更容易轉移。更重要的是,這些層的存在可讓處理建立標簽的工程通過一個JSP IDEJSP的集成開發環境)自動完成。期望將來的JSP IDE可自動完成創建一個自定義標簽的大部分工作,這樣你只需要寫代碼和標簽處理就可以了。

               注意:一個標簽處理僅定義一個自定義標簽;一個標簽庫是幾個處理相同任務的標簽處理器的集合。

              3. 建立自己的標簽

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

              創建一個JavaBean

               你代碼中任何可重新使用的部分都應該放到一個JavaBean中。這個很重要,因為你要經常在項目的其它地方用到這些代碼。放在標簽處理器中的任何代碼在標簽外都是不可以重新使用的,因此將可重用的代碼部分獨立開來是很重要的。在這個例子總,為HTML編碼的邏輯是常用的,因此放到JavaBean中。

               ⑵ 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.charAtli_count));

            if
            ls_next.equals"<")) ls_next = "<";

            if
            ls_next.equals">")) ls_next = ">";

            lsb_encode.append
            ls_next ;

            }

            return
            lsb_encode.toString() );

            }

            }

              創建一個標簽處理器

               標簽處理器使用以下的代碼:

            HTML
            編碼標簽處理器

            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}
            將結果寫回到數據流中 */

            pageContext.getOut
            ().writels_output.trim());

            }

            catch
            IOException e

            { throw new JspTagException
            "Tag Error:" + e.toString());

            }

            /*
            JSP繼續處理以下頁面的內容 */

            return EVAL_PAGE;

            }

            }

              這個處理很簡單,它包括有:

               o 讀入標簽開始和結束間的文本

               o 調用html編碼函數

               o 返回結果到JSP頁面。

              創建一個標簽描述器

               需要描述自定義標簽以讓系統知道如何處理。該描述文件的后綴為.tld,通常它的名字和標簽處理器相同,并存放在"/WEB-INF/"目錄。

            HTML
            編碼標簽描述器

            <?xml version="1.0" encoding="UTF-8" ?>

            <!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>HTML_FormatTag</SHORTNAME>

            <URI></URI>

            <INFO>HTML Encoding Tag </INFO>

            <TAG>

            <NAME>HTMLEncode</NAME>

            <TAGCLASS>HTML_FormatTag</TAGCLASS>

            <INFO>Encode HTML</INFO>

            </TAG>

            </TAGLIB>

              更新Web XML文件

               現在可告訴JSP容器使用標簽庫。為此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來注冊該標簽庫。最重要的是,要為tag分配一個URIURI是一個唯一的引用,只應用在該網站的這個特別的標簽上。使用全長的URL或者包名是一個好的習慣,它可以確保唯一性,因為該標簽可以在不同的網站使用。這個例子是簡化了。

            修改web.xml文件

            <?xml version="1.0" encoding="ISO-8859-1"?>

            <!DOCTYPE web-app

            PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

            " http://Java.sun.com/j2ee/dtds/web-app_2.2.dtd ">

            <WEB-APP>

            <TAGLIB>

            <TAGLIB-URI>

            HTMLEncode

            </TAGLIB-URI>

            <TAGLIB-LOCATION>

            /WEB-INF/HTML_FormatTag.tld

            </TAGLIB-LOCATION>

            </TAGLIB>

            </WEB-APP>

              使用新的標簽

               自定義的標簽已經設置好,可以用在一個JSP頁面上。要做到這一點,只需在該頁面使用taglib指示命令聲明一下該標簽就可以了,該標簽通過它唯一的URI被引用,并且會被分配一個名字空間前綴。前綴可以任意,只要它不與其它的名字空間沖突便可。

               在一個JSP頁面上使用HTML編碼標簽:

            <
            @ taglib uri="HTMLEncode" prefix="Examples" >

            <PRE>

            <?XML:NAMESPACE PREFIX = Examples /><Examples:HTMLEncode>

            < Hello , Simple sample >

            </Examples:HTMLEncode>
            </PRE>

            范例代碼的輸出

            < Hello , Simple sample >

            which displays as:

            < Hello , Simple sample >

              通過這個標簽,我就將該頁面的所有代碼編碼了。有趣的是所有的自定義標簽都是在服務器上處理的。這意味著你將不會在輸出的頁面上看到自定義的標簽。

               建立一個標簽不是很難吧。最困難的部分是要學習標簽處理的所有細節。這是一個很強大的功能,我們只是提到了最基本的地方。由于這個處理需要幾步,新的JSP編程者在創建標簽時將會感到迷惑。

              如何利用JSP開發DOM應用?

              DOMDocument Object Model的縮寫,即文檔對象模型。XML將數據組織為一顆樹,所以DOM就是對這顆樹的一個對象描敘。通俗的說,就是通過解析XML文檔,為XML文檔在邏輯上建立一個樹模型,樹的節點是一個個對象。我們通過存取這些對象就能夠存取XML文檔的內容。

               下面我們來看一個簡單的例子,看看在DOM中,我們是如何來操作一個XML文檔的。這是一個XML文檔,也是我們要操作的對象:

            <?xml version="1.0" encoding="UTF-8"?>

            <messages>

            <message>Good-bye serialization, hello Java!</message>

            </messages>

              下面,我們需要把這個文檔的內容解析到一個個的Java對象中去供程序使用,利用JAXP,我們只需幾行代碼就能做到這一點。首先,我們需要建立一個解析器工廠,以利用這個工廠來獲得一個具體的解析器對象:

               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

               我們在這里使用DocumentBuilderFacotry的目的是為了創建與具體解析器無關的程序,當DocumentBuilderFactory類的靜態方法newInstance()被調用時,它根據一個系統變量來決定具體使用哪一個解析器。又因為所有的解析器都服從于JAXP所定義的接口,所以無論具體使用哪一個解析器,代碼都是一樣的。所以當在不同的解析器之間進行切換時,只需要更改系統變量的值,而不用更改任何代碼。這就是工廠所帶來的好處。

               DocumentBuilder db = dbf.newDocumentBuilder();
            當獲得一個工廠對象后,使用它的靜態方法newDocumentBuilder()方法可以獲得一個DocumentBuilder對象,這個對象代表了具體的DOM解析器。但具體是哪一種解析器,微軟的或者IBM的,對于程序而言并不重要。

               然后,我們就可以利用這個解析器來對XML文檔進行解析了:

               Document doc = db.parse("c:/xml/message.xml");

               DocumentBuilderparse()方法接受一個XML文檔名作為輸入參數,返回一個Document對象,這個Document對象就代表了一個XML文檔的樹模型。以后所有的對XML文檔的操作,都與解析器無關,直接在這個Document對象上進行操作就可以了。而具體對Document操作的方法,就是由DOM所定義的了。

               從得到的Document對象開始,我們就可以開始我們的DOM之旅了。使用Document對象的getElementsByTagName()方法,我們可以得到一個NodeList對象,一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,觀其名而知其意,所代表的是一個Node對象的列表:

               NodeList nl = doc.getElementsByTagName("message");

               我們通過這樣一條語句所得到的是XML文檔中所有<message>標簽對應的Node對象的

               一個列表。然后,我們可以使用NodeList對象的item()方法來得到列表中的每一個Node對象:

               Node my_node = nl.item(0);

               當一個Node對象被建立之后,保存在XML文檔中的數據就被提取出來并封裝在這個Node中了。在這個例子中,要提取Message標簽內的內容,我們通常會使用Node對象的getNodeValue()方法:

            String message = my_node.getFirstChild().getNodeValue();

               請注意,這里還使用了一個getFirstChild()方法來獲得message下面的第一個子Node對象。雖然在message標簽下面除了文本外并沒有其它子標簽或者屬性,但是我們堅持在這里使用getFirseChild()方法,這主要和W3CDOM的定義有關。W3C把標簽內的文本部分也定義成一個Node,所以先要得到代表文本的那個Node,我們才能夠使用getNodeValue()來獲取文本的內容。現在,既然我們已經能夠從XML文件中提取出數據了,我們就可以把這些數據用在合適的地方,來構筑應用程序。
            DOM
            實例

              先說說這個例子到底要做的是什么吧,我們在一個名為link.xml文件中保存了一些URL地址,我們希望可以通過DOM把這些URL讀出并顯示出來,也可以反過來向這個XML文件中寫入加入的URL地址。很簡單,卻很實用,也足夠來例示DOM的絕大部分用法了。

               第一個程序我們稱為xmldisplay.Java,主要的功能就是讀取這個XML文件中各個節點的內容,然后在格式化輸出在System.out上,我們來看看這個程序:

            import Javax.xml.parsers.*;

            import org.w3c.dom.*;

              這是引入必要的類,因為在這里使用的是Sun所提供的XML解析器,因而需要引入Java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具體實現。org.w3c.dom包中定義了w3c所制定的DOM接口。

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder=factory.newDocumentBuilder();

            Document doc=builder.parse("links.xml");

            doc.normalize();

              除了上面講到的,還有一個小技巧,對Document對象調用normalize(),可以去掉XML文檔中作為格式化內容的空白而映射在DOM樹中的不必要的Text Node對象。否則你得到的DOM樹可能并不如你所想象的那樣。特別是在輸出的時候,這個normalize()更為有用。

              NodeList links =doc.getElementsByTagName("link");

              剛才說過,XML文檔中的空白符也會被作為對象映射在DOM樹中。因而,直接調用Node方法的getChildNodes方法有時候會有些問題,有時不能夠返回所期望的NodeList對象。解決的辦法是使用ElementgetElementByTagName(String),返回的NodeLise就是所期待的對象了。然后,可以用item()方法提取想要的元素。

            for (int i=0;i<links.getLength();i++){

            Element link=(Element) links.item(i);

            System.out.print("Content: ");

            System.out.println(link.getElementsByTagName("text").item(0).getFirstChild();

            .getNodeValue());

            ……

              上面的代碼片斷就完成了對XML文檔內容的格式化輸出。只要注意到一些細節的問題,比如getFirstChile()方法和getElementsByTagName()方法的使用,這些還是比較容易的。
            下面的內容,就是在修改了DOM樹后重新寫入到XML文檔中去的問題了。這個程序名為xmlwrite.Java。在JAXP1.0版本中,并沒有直接的類和方法能夠處理XML文檔的寫入問題,需要借助其它包中的一些輔助類。而在JAXP1.1版本中,引入了對XSLT的支持,所謂XSLT,就是對XML文檔進行變換(Translation)后,得到一個新的文檔結構。利用這個新加入的功能,我們就能夠很方便的把新生成或者修改后的DOM樹從新寫回到XML文件中去了,下面我們來看看代碼的實現,這段代碼的主要功能是向links.xml文件中加入一個新的link節點:

            import Javax.xml.parsers.*;

            import Javax.xml.transform.*;

            import Javax.xml.transform.dom.DOMSource;

            import Javax.xml.transform.stream.StreamResult;

            import org.w3c.dom.*;

              新引入的Java.xml.transform包中的幾個類,就是用來處理XSLT變換的。

            我們希望在上面的XML文件中加入一個新的link節點,因而首先還是要讀入links.xml文件,構建一個DOM樹,然后再對這個DOM樹進行修改(添加節點),最后把修改后的DOM寫回到links.xml文件中:

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder=factory.newDocumentBuilder();

            Document doc=builder.parse("links.xml");

            doc.normalize();

            //---
            取得變量----

            String text="Hanzhong's Homepage";

            String url=" www.hzliu.com ";

            String author="Hzliu Liu";

            String discription="A site from Hanzhong Liu, give u lots of suprise!!!";

              為了看清重點,簡化程序,我們把要加入的內容硬編碼到記憶String對象中,而實際操作中,往往利用一個界面來提取用戶輸入,或者通過JDBC從數據庫中提取想要的內容。

            Text textseg;

            Element link=doc.createElement("link");

              首先應該明了的是,無論什么類型的NodeText型的也好,Attr型的也好,Element型的也好,它們的創建都是通過Document對象中的createXXX()方法來創建的(XXX代表具體要創建的類型),因此,我們要向XML文檔中添加一個link項目,首先要創建一個link對象:
            Element linktext=doc.createElement("text");

            textseg=doc.createTextNode(text);

            linktext.appendChild(textseg);

            link.appendChild(linktext);

            ……

              創建節點的過程可能有些千篇一律,但需要注意的地方是,對Element中所包含的text(在DOM中,這些text也是代表了一個Node的,因此也必須為它們創建相應的node),不能直接用Element對象的setNodeValue()方法來設置這些text的內容,而需要用創建的Text對象的setNodeValue()方法來設置文本,這樣才能夠把創建的Element和其文本內容添加到DOM樹中。看看前面的代碼,你會更好的理解這一點:

            doc.getDocumentElement().appendChild(link);

               最后,不要忘記把創建好的節點添加到DOM樹中。Document類的getDocumentElement()方法,返回代表文檔根節點的Element對象。在XML文檔中,根節點一定是唯一的。

            TransformerFactory tFactory =TransformerFactory.newInstance();

            Transformer transformer = tFactory.newTransformer();

            DOMSource source = new DOMSource(doc);

            StreamResult result = new StreamResult(new Java.io.File("links.xml"));

            transformer.transform(source, result);

              然后就是用XSLTDOM樹輸出了。這里的TransformerFactory也同樣應用了工廠模式,使得具體的代碼同具體的變換器無關。實現的方法和DocumentBuilderFactory相同,這兒就不贅述了。Transformer類的transfrom方法接受兩個參數、一個數據源Source和一個輸出目標Result。這里分別使用的是DOMSourceStreamResult,這樣就能夠把DOM的內容輸出到一個輸出流中,當這個輸出流是一個文件的時候,DOM的內容就被寫入到文件中去了。

              如何利用JSP開發SAX應用?

              SAXSimple API for XML的縮寫,它并不是由W3C官方所提出的標準,可以說是"民間"的事實標準。實際上,它是一種社區性質的討論產物。雖然如此,在XML中對SAX的應用絲毫不比DOM少,幾乎所有的XML解析器都會支持它。

               這樣泛泛的說來或許有些不容易理解,別急,后面的例子會讓你明白SAX的解析過程。看看這個簡單XML文件:

            <POEM>

            <AUTHOR>Ogden Nash</AUTHOR>

             

            posted on 2009-06-16 21:53 肥仔 閱讀(180) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            久久国产高清一区二区三区| 久久精品无码一区二区三区日韩| 污污内射久久一区二区欧美日韩 | 人妻无码αv中文字幕久久琪琪布| 午夜精品久久久久久影视777| 久久99精品久久久大学生| 精品国产乱码久久久久久呢| 久久93精品国产91久久综合| 国产精品久久久久久| 国内精品久久久久影院优| 99久久人妻无码精品系列蜜桃| 国产亚洲美女精品久久久| 亚洲国产精品综合久久一线| 色偷偷久久一区二区三区| 精品免费久久久久国产一区| 久久精品国产亚洲AV蜜臀色欲 | 亚洲AV无一区二区三区久久| 2021少妇久久久久久久久久| 久久亚洲精品无码播放| 国产精品毛片久久久久久久| 亚洲人成无码久久电影网站| 99久久婷婷免费国产综合精品| 一本大道久久香蕉成人网 | 久久久国产99久久国产一| 青青青青久久精品国产h| 午夜天堂av天堂久久久| 中文字幕精品无码久久久久久3D日动漫 | 国产99久久久国产精品~~牛| 久久精品国产精品亚洲精品 | 久久久这里只有精品加勒比| 一级做a爱片久久毛片| 久久99精品久久久久久久不卡| 综合久久精品色| 午夜福利91久久福利| 久久九九久精品国产| 99久久精品国产一区二区| 久久精品国产亚洲AV香蕉| 亚洲国产精品无码久久一区二区| 狠狠色丁香久久婷婷综合蜜芽五月| 久久青青草原精品国产不卡| 久久久久噜噜噜亚洲熟女综合|