posts - 9, comments - 1, trackbacks - 0, articles - 0

          2009年12月9日

          character set,character encoding和xml encoding declaration

          hanlray@gmail.com

          Revision: 0.9 Date: 2005/08/28


          1. character set和character encoding

          一 直以為character set和character encoding是一回事,最近才發(fā)現(xiàn)它們差不多是兩個(gè)概念。從字面意思上看,一個(gè)character set就是一些字符的集合,比如26個(gè)英文字母,全體漢字,或者兩者的組合,然而計(jì)算機(jī)是只能處理數(shù)字的,一個(gè)字符必須被表示成一個(gè)數(shù)字才可能被計(jì)算機(jī)處 理,因此一個(gè)character set還必須定義字符到數(shù)字的映射關(guān)系,比如字符A映射到數(shù)字64,字符Z映射到數(shù)字90,這些數(shù)字叫做code points;character encoding則用來定義這些code points如何用字節(jié)表示出來,比如code point 90可以被編碼為一個(gè)單字節(jié),一個(gè)little-endian的unsigned short,一個(gè)big-endian的integer,或者更復(fù)雜的形式。換句話說,一個(gè)character set僅僅是一張字符和數(shù)字的映射表,它并不規(guī)定這些數(shù)字如何用字節(jié)表示出來,這種表示的事情由character encoding來定義。因此,一個(gè)character encoding是針對一個(gè)character set的,而一個(gè)character set可以有多個(gè)character encoding,比如UTF-8,UTF-16都是Unicode Character Set的encoding。

          2. xml encoding declaration

          對 一段編碼后的文本,要想正確地處理它,必須要事先知道其采用的編碼方式,因此這種編碼信息一般是存在于該文本之外的,比如某些編輯器會在文件開始放幾個(gè)不 可見的字節(jié)來指示其正文的編碼方式,這些字節(jié)叫做BOM(Byte Order Mark);某些網(wǎng)絡(luò)協(xié)議會有一些字段來指示其所攜帶文本的編碼方式。這種方式很直觀,很多系統(tǒng)/技術(shù)采用這種方式,大多數(shù)有關(guān)xml的應(yīng)用也會優(yōu)先使用 這種外部的編碼信息,但是當(dāng)沒有這種外部的編碼信息可用的時(shí)候呢?一個(gè)xml document可以用一個(gè)xml declaration來聲明其采用的編碼,形如<?xml version="1.0" encoding="UTF-8"?>,這種方式看起來不大可能工作,因?yàn)檫@個(gè)聲明本身就是文本的,并且該聲明是xml document的一部分,不可能規(guī)定其采用的編碼方式。如何能在不知道xml document編碼的情況下理解其xml declaration中聲明的編碼呢?對xml編碼聲明的位置及內(nèi)容的限制使自動檢測成為可能:編碼聲明必須出現(xiàn)在文檔開頭,只允許ASCII字符并且 其頭幾個(gè)字符必須是<?xml,這樣,一個(gè)xml processor就可以先讀出文檔的前幾個(gè)字節(jié),推斷其采用的編碼的特征,根據(jù)該特征能理解xml declaration,讀出encoding屬性值,從而知道該文檔的編碼。比如,如果前4個(gè)字節(jié)的內(nèi)容為3C 3F 78 6D,則可以確定該文檔采用的是一種兼容ASCII的編碼,這樣xml processor就可以用任一種兼容ASCII的編碼(如UTF-8)來理解編碼后xml聲明,因?yàn)槠渲话珹SCII字符,任何兼容ASCII的編碼 對其編碼的結(jié)果都是相同的。當(dāng)?shù)玫絰ml declaration中聲明的編碼時(shí),xml processor再轉(zhuǎn)換到該編碼對該xml進(jìn)行處理。下表來自XML W3C Recommendation,列出了自動檢測編碼的方式:

          00 00 00 3C
          3C 00 00 00
          00 00 3C 00
          00 3C 00 00
          UCS-4 or other encoding with a 32-bit code unit and ASCII characters encoded as ASCII values, in respectively big-endian (1234), little-endian (4321) and two unusual byte orders (2143 and 3412). The encoding declaration must be read to determine which of UCS-4 or other supported 32-bit encodings applies.
          00 3C 00 3F UTF-16BE or big-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in big-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
          3C 00 3F 00 UTF-16LE or little-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in little-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
          3C 3F 78 6D UTF-8, ISO 646, ASCII, some part of ISO 8859, Shift-JIS, EUC, or any other 7-bit, 8-bit, or mixed-width encoding which ensures that the characters of ASCII have their normal positions, width, and values; the actual encoding declaration must be read to detect which of these applies, but since all of these encodings use the same bit patterns for the relevant ASCII characters, the encoding declaration itself may be read reliably
          4C 6F A7 94 EBCDIC (in some flavor; the full encoding declaration must be read to tell which code page is in use)
          Other UTF-8 without an encoding declaration, or else the data stream is mislabeled (lacking a required encoding declaration), corrupt, fragmentary, or enclosed in a wrapper of some kind

          posted @ 2009-12-09 20:27 TonyZhangtl 閱讀(302) | 評論 (0)編輯 收藏

          2009年12月6日

          雖然將jxl.jar包添加到工程里了, 但是仍讓有java.lang.ClassNotFoundException: jxl.write.WritableCell錯誤。
          需要把jar包放在web-inf/lib目錄下再加載才可以解決這個(gè)問題。
          package tony.servlet.example;

          import java.io.IOException;
          import java.io.OutputStream;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import jxl.Workbook;
          import jxl.write.Label;
          import jxl.write.WritableSheet;
          import jxl.write.WritableWorkbook;

          public class Hello extends HttpServlet {
              protected void service(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
                  // ServletOutputStream out = response.getOutputStream();
                  // PrintWriter out = response.getWriter();
                  // out.println("Hello world!");
                  // System.out.println("TEST");
                  // request.getRequestDispatcher("/WEB-INF/jspfooder/test1.html").forward(request,
                  // response);
                  // request.getRequestDispatcher("test.jsp").forward(request, response);
                  // request.getRequestDispatcher("/WEB-INF/test.jsp").forward(request,
                  // response);
                  /*
                   * response.setContentType("application/vnd.ms-excel");
                   * response.setHeader("Content-disposition","filename="+ "Example.xls"
                   * ); HSSFWorkbook demoWorkBook = new HSSFWorkbook(); HSSFSheet sheet =
                   * demoWorkBook.createSheet("賬號詳單"); HSSFRow row = sheet.createRow(0);
                   * HSSFCell cell = row.createCell(0); cell.setCellValue(11);
                   * ServletOutputStream out = response.getOutputStream();
                   * demoWorkBook.write(out); out.flush(); out.close();
                   */
                  OutputStream out = response.getOutputStream();
                  try {

                      response.setContentType("application/vnd.ms-excel");

                      response.setHeader("Content-Disposition",
                              "attachment; filename=example.xls");

                      WritableWorkbook w = Workbook.createWorkbook(out);
                      WritableSheet s = w.createSheet("sheet1", 0);

                      s.addCell(new Label(0, 0,
                              "this is my first servlet & sheet example."));
                      w.write();
                      w.close();

                  } catch (Exception e) {
                      throw new ServletException("Exception in Excel Sample Servlet", e);
                  } finally {
                      if (out != null)
                          out.close();
                  }
              }
          }


          posted @ 2009-12-06 17:42 TonyZhangtl 閱讀(900) | 評論 (1)編輯 收藏

          2009年12月5日

          EJB與JavaBean之區(qū)別
          [日期]: 2006-08-17  [來源]:   [作者]:
          EJB 不是一般的JavaBean,EJB是企業(yè)級JavaBean,EJB一共分為3種,實(shí)體Bean,消息Bean,會話Bean,書寫EJB是需要遵循一 定的規(guī)范的,具體規(guī)范你可以參考相關(guān)的資料.另外,要運(yùn)行EJB,你需要相應(yīng)的EJB容器,比如Weblogic,Jboss等,而JavaBean不需 要,只需要安裝Tomcat就可以了
          .EJB用于服務(wù)端應(yīng)用開發(fā), 而JavaBeans用于客戶端應(yīng)用開發(fā)
          也可以使用JavaBeans進(jìn)行服務(wù)端應(yīng)用開發(fā),但JavaBeans模型沒有提供服務(wù)框架,當(dāng)應(yīng)用需要使用系統(tǒng)級服務(wù)(如事務(wù)管理,安全性,生命周期管理等)時(shí),不適合。

          2.EJB構(gòu)件是可部署的,EJB構(gòu)件可以作為獨(dú)立的單元被部署到EJB應(yīng)用服務(wù)器上,是應(yīng)用構(gòu)件(application components),而JavaBeans構(gòu)件是不可部署的, JavaBeans構(gòu)件是開發(fā)構(gòu)件,不能被部署為獨(dú)立的單元。

          3.EJB構(gòu)件是部署可定制的,使用部署描述符可以在部署EJB時(shí)對其運(yùn)行時(shí)配置進(jìn)行定制,而JavaBeans構(gòu)件在部署時(shí)不能進(jìn)行定制,JavaBeans構(gòu)件的定制僅發(fā)生在開發(fā)階段,只能利用開發(fā)工具創(chuàng)建并組裝JavaBeans構(gòu)件,部署時(shí)不能定制

          4.EJB構(gòu)件是分布式對象,可以被客戶應(yīng)用或者其它EJB構(gòu)件進(jìn)行遠(yuǎn)程訪問,而JavaBeans構(gòu)件不是分布式對象,JavaBeans構(gòu)件只能在其構(gòu)成的應(yīng)用中使用,不能提供遠(yuǎn)程訪問能力

          5.EJB構(gòu)件對終端用戶不可見,運(yùn)行在服務(wù)端,沒有人機(jī)交互界面,而部分JavaBeans構(gòu)件對終端用戶可見,如GUI應(yīng)用中使用的按鈕構(gòu)件.

          Java bean is just a set of conventions. EJB is a standard for J2EE business components.

          Specifically a Java bean:

          • has a public default constructor;
          • readable propertiy methods prepended with "get";
          • writable propertty methods prepended with "set"; and
          • is Serializable.

          For example, a Java bean with a property of "margin" would minimally look like this:

          public class MyBean implements Serializable {
           
          private int margin;

           
          public MyBean() { }
           
          public int getMargin() { return margin; }
           
          public void setMargin(int margin) { this.margin = margin; }
          }

          EJB, despite the name, is almost completely unrelated.


          JavaBeans:-
          ---------
          Basically used to CUSTOMIZE EXISTING OBJECTS. i.e. You can
          create USER OBJECTS, which are based on existing objects.
          For Example: A default button operates as a Single-State Switch. i.e. when you press a button on a web page, it doesn't remain pressed. Infact, it immediately bounces back to its OFF state like a Door-Bell.

          Now, let's say, you need a button, which should have 2 stable states, like the typical Electrical Light Switch. So, in this case, what you can do is, take an existing button (having 1 stable state) and CUSTOMIZE it so that it has 2 stable states.
          This is possible using JavaBeans.

          Enterprise Java Beans (EJB):-
          ---------------------------
          EJB is a completely different concept than the one mentioned
          above. It is NOT used to customize existing objects. Instead
          they are basically used to STANDARDIZE the way, in which
          business logic is written.
          For Example: We can write our business logic as well as the GUI logic, inside Servlets/Applets/StandAlone applications itself. But this way,there will be no clear distinction between the Code that is responsible for the GUI and the actual Business logic code, because everything is written inside the same class file.

          So, to COMPONENTIZE we write business logic in seperate class files than the GUI logic, thereby making a clear distinction between the reponsibilities


          有一些基本相同之處。它們都是用一組特性創(chuàng)建,以執(zhí)行其特定任務(wù)的對象或組件。它們還有從當(dāng)前所駐留服務(wù)器上的容器獲得其它特性的能力。這使得   bean   的行為根據(jù)特定任務(wù)和所在環(huán)境的不同而有所不同。  
                  不同的是:  
                  EJB   是設(shè)計(jì)成運(yùn)行在服務(wù)器上,并由客戶機(jī)調(diào)用的非可視遠(yuǎn)程對象。可通過多個(gè)非可視   JavaBean   構(gòu)建   EJB。它們有一個(gè)部署描述符,其目的與   JavaBean   屬性相同:它是以后可由工具讀取的   bean   的描述。EJB   還獨(dú)立于平臺,一旦編寫好,還可以在任何支持   Java   的平臺(包括客戶機(jī)和服務(wù)器)上使用。  
                  EJB是一種非可視化的構(gòu)件,完全位于服務(wù)器端,規(guī)范說明詳細(xì)說明了EJB容器需要滿足的需求以及如何和EJB構(gòu)件相互協(xié)作。EJB可以和遠(yuǎn)程的客戶端程 序通訊,并提供一定的功能,根據(jù)規(guī)范說明,EJB是client/Server系統(tǒng)的一部分,如果不和客戶端程序交互,EJB一般不執(zhí)行具體的功 能,EJB和JavaBean的一個(gè)重要區(qū)別是EJB必須在網(wǎng)絡(luò)計(jì)算環(huán)境下使用才有意義。  
            EJB的重點(diǎn)是給出服務(wù)框架模型,以保證Java構(gòu)件可以進(jìn)行可移植性的部署,因此,在EJB規(guī)格說明中,并沒有提到事件,因?yàn)榈湫偷腅JB構(gòu)件不發(fā) 送和接收事件,EJB規(guī)范說明中也沒有提到屬性。和一般的JavaBean一樣,EJB是高度可定制的,對EJB進(jìn)行定制不需要存取源代碼,但對EJB可 以進(jìn)行定制不是在開發(fā)階段,而是在部署階段用部署描述符進(jìn)行定制。  
            需要說明的是,JavaBean不僅可用于客戶端應(yīng)用程序的開發(fā),也可以用于服務(wù)器端應(yīng)用程序的開發(fā),但和EJB的區(qū)別是,如果用JavaBean創(chuàng) 建服務(wù)器端應(yīng)用程序,還必須同時(shí)實(shí)現(xiàn)服務(wù)框架,在多層結(jié)構(gòu)分布式應(yīng)用系統(tǒng)中,服務(wù)框架的實(shí)現(xiàn)是非常繁瑣的,對于EJB來說,服務(wù)框架已經(jīng)提供,因此大大簡 化了系統(tǒng)的開發(fā)過程。


          我了省時(shí)間,我給你一份文檔吧!是專門介紹二者區(qū)別的。  
             
            java   bean   與   ejb的區(qū)別  
             
            您現(xiàn)在可能已在使用   JavaBean,但還不了解它。如果有支持   Java   的瀏覽器,那么,在桌面上使用   JavaBean   就沒有限制。使用的   Web   頁面可以將   bean   作為小應(yīng)用程序的一部分。您很快就會和作為瀏覽器可視部分的   JavaBean   交互,然后,那些   JavaBean   將與服務(wù)器上的   EJB   接口。這種能力也可以擴(kuò)展到因特網(wǎng)和內(nèi)部網(wǎng)。  
             
            JavaBean   和   Server   Bean(通常稱為   Enterprise   JavaBean   (EJB))有一些基本相同之處。它們都是用一組特性創(chuàng)建,以執(zhí)行其特定任務(wù)的對象或組件。它們還有從當(dāng)前所駐留服務(wù)器上的容器獲得其它特性的能力。這使 得   bean   的行為根據(jù)特定任務(wù)和所在環(huán)境的不同而有所不同。  
             
            這開辟了巨大商機(jī)。因?yàn)?  JavaBean   是與平臺無關(guān)的,所以對于將來的解決方案,供應(yīng)商可以輕易向不同用戶推出其客戶機(jī)方的   JavaBean,而不必創(chuàng)建或維護(hù)不同的版本。這些   JavaBean   可以與執(zhí)行商業(yè)功能(例如訂購、信用卡處理、電子匯款、存貨分配、運(yùn)輸?shù)龋┑?  EJB   配合使用。這里有巨大潛力,而這正是組件代理(WebSphere   Application   Server   企業(yè)版)設(shè)計(jì)提供的那種潛力。  
             
            JavaBean   是一種組件,它在內(nèi)部有接口或有與其相關(guān)的屬性,以便不同人在不同時(shí)間開發(fā)的   bean   可以詢問和集成。可以構(gòu)建一個(gè)   bean,而在以后構(gòu)造時(shí)將其與其它   bean   綁定。這種過程提供了先構(gòu)建,然后重復(fù)使用的方法,這就是組件的概念。可以將這種單一應(yīng)用程序部署成獨(dú)立程序、ActiveX   組件或在瀏覽器中。  
             
            JavaBean   因其外部接口(即屬性接口)而與純對象不同。這種接口允許工具讀取組件要執(zhí)行的功能,將其與其它   bean   掛鉤,以及將其插入其它環(huán)境。JavaBean   設(shè)計(jì)成對單一進(jìn)程而言是本地的,它們在運(yùn)行時(shí)通常可視。這種可視組件可能是按鈕、列表框、圖形或圖表   -   但這不是必需的。  
             
            可執(zhí)行組件    
            Server   Bean   或   EJB   是部署在服務(wù)器上的可執(zhí)行組件或商業(yè)對象。有一個(gè)協(xié)議允許對其進(jìn)行遠(yuǎn)程訪問或在特定服務(wù)器上安裝或部署它們。有一系列機(jī)制允許它們將服務(wù)安全性、事務(wù)行 為、并發(fā)性(由多個(gè)客戶機(jī)同時(shí)訪問的能力)和持久性(其狀態(tài)可以保存多久)的主要方面授權(quán)給   EJB   服務(wù)器上其所在的容器。當(dāng)安裝在容器中時(shí),它們獲得各自的行為,該行為提供不同質(zhì)量的服務(wù),因此,選擇正確的   EJB   服務(wù)器至關(guān)重要。這正是   IBM   WebSphere   企業(yè)版的優(yōu)勢所在。  
             
            EJB   是設(shè)計(jì)成運(yùn)行在服務(wù)器上,并由客戶機(jī)調(diào)用的非可視遠(yuǎn)程對象。可通過多個(gè)非可視   JavaBean   構(gòu)建   EJB。它們有一個(gè)部署描述符,其目的與   JavaBean   屬性相同:它是以后可由工具讀取的   bean   的描述。EJB   還獨(dú)立于平臺,一旦編寫好,還可以在任何支持   Java   的平臺(包括客戶機(jī)和服務(wù)器)上使用。  
             
            因?yàn)?  EJB   由諸如   IBM   VisualAge   for   Java   這樣的工具集生成,所以,它是基于服務(wù)器的對象,并用于遠(yuǎn)程調(diào)用。它們安裝在   EJB   服務(wù)器上,并象調(diào)用其它   CORBA   遠(yuǎn)程對象那樣獲得進(jìn)行調(diào)用的遠(yuǎn)程接口。  
             
            ActiveX   對象    
            可以將   JavaBean   部署成   ActiveX   對象,雖然   EJB   的代理也可以這樣做,但是,因?yàn)?  ActiveX   運(yùn)行在桌面上,所以,EJB   本身不能成為   ActiveX   對象。要在與平臺相關(guān)的、僅   Windows   平臺上做到這一點(diǎn),開發(fā)人員可以將   JavaBean   變換成   ActiveX   組件。  
             
            好處    
            EJB   的主要好處在于:構(gòu)建   bean   時(shí),bean   開發(fā)人員可以規(guī)定需要什么類型的行為,而不必規(guī)定如何去做。開發(fā)分為兩部分:程序員開發(fā)   bean,然后驗(yàn)證:它可與構(gòu)建工具一起工作,并包括標(biāo)識所需服務(wù)質(zhì)量行為種類的部署描述符。下一步,另一個(gè)程序員可以采用這個(gè)   bean,并使用讀取   EJB   部署描述符的部署工具,然后將該   bean   安裝到   Enterprise   Java   Server   上的容器中。在第二步中,部署工具采取一些操作   -   這可能意味著生成如狀態(tài)保存代碼,放入事務(wù)掛鉤,或執(zhí)行安全性檢查這樣的代碼。所有這些操作由部署工具生成,bean   開發(fā)人員和部署人員可以是不同的人。  
             
            可以通過使用部署工具,將任何獨(dú)立于平臺的   JavaBean   改寫成具有可靠服務(wù)質(zhì)量、特定于平臺的   EJB,以滿足現(xiàn)有商業(yè)系統(tǒng)和應(yīng)用程序的特定需求。這就是   EJB   服務(wù)器對集成系統(tǒng)、網(wǎng)絡(luò)和體系結(jié)構(gòu)如此重要的原因所在。  
             
            EJB   與   IBM   WebSphere   企業(yè)版    
            在   IBM   WebSphere   企業(yè)版中使用時(shí),可以將   EJB   配置成被管理的商業(yè)對象。接受它們授權(quán)服務(wù)的容器是其安裝到的容器。將   EJB   的持久性部分映射在數(shù)據(jù)或狀態(tài)對象中。EJB   服務(wù)器為   EJB   提供不同的服務(wù)質(zhì)量,選擇正確的   EJB   服務(wù)器可能對滿足完整的商業(yè)需求至關(guān)重要。“組件代理”功能極其健壯,該功能提供如負(fù)載均衡和支持服務(wù)器組中多臺機(jī)器的高級功能。它還有大大超出   Enterprise   Java   Server   (EJS)   規(guī)范所倡導(dǎo)的系統(tǒng)管理功能。因此,按照基本標(biāo)準(zhǔn)編寫的   JavaBean   或   EJB   可以運(yùn)行在使用“組件代理”功能的   WebSphere   企業(yè)版上,并獲得那些所有的附加功能。  
             
            EJB   服務(wù)器還提供獨(dú)特的特性和服務(wù)質(zhì)量,而且不完全相同。IBM“組件代理”有一些強(qiáng)大特性   -   例如,可伸縮性,它允許開發(fā)人員將   EJB   部署到從小型系統(tǒng)到大型網(wǎng)絡(luò)的不同類型服務(wù)器。開發(fā)人員可以從小處入手,例如,在一個(gè)部門中,首先在   LAN   的   Java   服務(wù)器上部署,一旦準(zhǔn)備好,就知道可以將在那里創(chuàng)建的   JavaBean   和   EJB   部署到全球網(wǎng)絡(luò)。然后,開發(fā)人員可以測試并熟悉這些   bean,試運(yùn)行,制作樣本等等。滿意之后,開發(fā)人員可以通過將其移至高性能服務(wù)器,來大幅度擴(kuò)大其規(guī)模。JavaBean   和   EJB   不受任何計(jì)算機(jī)體系結(jié)構(gòu)邊界的限制。它們用   Java   編寫,可以運(yùn)行在任何具有   Java   虛擬機(jī)的系統(tǒng)上,并可以使用任何   Enterprise   Java   Server   (EJS)   來部署對象。因此,開發(fā)人員現(xiàn)在可以在方便的系統(tǒng)上構(gòu)建,以后在方便的系統(tǒng)上部署,而不必是同一臺或同樣類型的機(jī)器。  
             
            IBM   WebSphere   企業(yè)版支持將商業(yè)對象部署到多臺服務(wù)器。EJB   作為商業(yè)對象集成到“組件代理”功能,并作為任何其它商業(yè)對象處理。因此,EJB   可以連接到所選的后端系統(tǒng),并執(zhí)行任何所需操作,以滿足其商業(yè)需求。這就成為“組件代理”為   EJB   提供的基礎(chǔ)設(shè)施。通過將“組件代理”用作   EJB   服務(wù)器,開發(fā)人員將能夠繼續(xù)使用當(dāng)前舊有系統(tǒng),并將其與電子商務(wù)接口一起提供。  
             
            為使   EJB   能在   WebSphere“組件代理”環(huán)境中工作,可以使用“組件代理”部署工具將其安裝在一臺或多臺服務(wù)器上,然后將其添加到命名服務(wù)器,以便可以全局查找到 它。任何可以訪問公共命名服務(wù)器的人都可以找到它,找到其宿主,并可以在宿主上執(zhí)行方法,同時(shí)創(chuàng)建   EJB。這就是“代理組件”要做的事。  
             
            示例    
            讓我們舉一個(gè)在   Web   購物站點(diǎn)上可以看到的電子購物車的例子。用戶的購物車是一個(gè)   JavaBean。用戶將貨架上的商品放入購物車,這些商品本身是   JavaBean。它們?nèi)靠梢暎⑶颐嫦蛴脩簟=Y(jié)帳時(shí),將用戶購物車中的商品發(fā)送到服務(wù)器上的   EJB,該   EJB   執(zhí)行一些必要的操作,如檢查信用卡授權(quán)和可用額度,生成封條,或生成給發(fā)貨部門的有關(guān)提什么貨和發(fā)貨地點(diǎn)的特殊指示   -   這就是商業(yè)程序已在進(jìn)行的活動。  
             
            結(jié)束語    
            Bean   的全部意義不只是其現(xiàn)有能力,更在于其可以為商業(yè)提供的有競爭力的潛在能力。IT   設(shè)計(jì)師和應(yīng)用開發(fā)人員現(xiàn)在可以將精力完全集中在商業(yè)邏輯,而將如事務(wù)、持久性和安全性的底層工作留給服務(wù)器。WebSphere   的“組件代理”功能將提供所有這些(還有后端訪問)和對象事務(wù)管理器。





          posted @ 2009-12-05 13:05 TonyZhangtl 閱讀(226) | 評論 (0)編輯 收藏

          2009年12月2日

          Taking a big step back, a Web server serves pages for viewing in a Web browser, while an application server provides methods that client applications can call. A little more precisely, you can say that:
          A Web server exclusively handles HTTP requests, whereas an application server serves business logic to application programs through any number of protocols.


          Let's examine each in more detail.

          The Web server

          A Web server handles the HTTP protocol. When the Web server receives an HTTP request, it responds with an HTTP response, such as sending back an HTML page. To process a request, a Web server may respond with a static HTML page or image, send a redirect, or delegate the dynamic response generation to some other program such as CGI scripts, JSPs (JavaServer Pages), servlets, ASPs (Active Server Pages), server-side JavaScripts, or some other server-side technology. Whatever their purpose, such server-side programs generate a response, most often in HTML, for viewing in a Web browser.

          Understand that a Web server's delegation model is fairly simple. When a request comes into the Web server, the Web server simply passes the request to the program best able to handle it. The Web server doesn't provide any functionality beyond simply providing an environment in which the server-side program can execute and pass back the generated responses. The server-side program usually provides for itself such functions as transaction processing, database connectivity, and messaging.

          While a Web server may not itself support transactions or database connection pooling, it may employ various strategies for fault tolerance and scalability such as load balancing, caching, and clustering—features oftentimes erroneously assigned as features reserved only for application servers.

          The application server

          As for the application server, according to our definition, an application server exposes business logic to client applications through various protocols, possibly including HTTP. While a Web server mainly deals with sending HTML for display in a Web browser, an application server provides access to business logic for use by client application programs. The application program can use this logic just as it would call a method on an object (or a function in the procedural world).

          Such application server clients can include GUIs (graphical user interface) running on a PC, a Web server, or even other application servers. The information traveling back and forth between an application server and its client is not restricted to simple display markup. Instead, the information is program logic. Since the logic takes the form of data and method calls and not static HTML, the client can employ the exposed business logic however it wants.

          In most cases, the server exposes this business logic through a component API, such as the EJB (Enterprise JavaBean) component model found on J2EE (Java 2 Platform, Enterprise Edition) application servers. Moreover, the application server manages its own resources. Such gate-keeping duties include security, transaction processing, resource pooling, and messaging. Like a Web server, an application server may also employ various scalability and fault-tolerance techniques.

          posted @ 2009-12-02 21:29 TonyZhangtl 閱讀(200) | 評論 (0)編輯 收藏

          XML現(xiàn)在已經(jīng)成為一種通用的數(shù)據(jù)交換格式,平臺的無關(guān)性使得很多場合都需要用到XML。本文將詳細(xì)介紹用Java解析XML的四種方法。

          XML現(xiàn)在已經(jīng)成為一種通用的數(shù)據(jù)交換格式,它的平臺無關(guān)性,語言無關(guān) 性,系統(tǒng)無關(guān)性,給數(shù)據(jù)集成與交互帶來了極大的方便。對于XML本身的語法知識與技術(shù)細(xì)節(jié),需要閱讀相關(guān)的技術(shù)文獻(xiàn),這里面包括的內(nèi)容有 DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具體可參閱w3c官方網(wǎng)站文檔http://www.w3.org獲取更多信息。

          XML在不同的語言里解析方式都是一樣的,只不過實(shí)現(xiàn)的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基于事件流的解析,DOM是基于XML文檔樹結(jié)構(gòu)的解析。假設(shè)我們XML的內(nèi)容和結(jié)構(gòu)如下:

          <?xml version="1.0" encoding="UTF-8"?> 
          <employees>
          <employee>
          <name>ddviplinux</name>
          <sex>m</sex>
          <age>30</age>
          </employee>
          </employees>

          本文使用JAVA語言來實(shí)現(xiàn)DOM與SAX的XML文檔生成與解析。
          首先定義一個(gè)操作XML文檔的接口XmlDocument 它定義了XML文檔的建立與解析的接口。

          package com.alisoft.facepay.framework.bean; 
          /**
          *
          * @author hongliang.dinghl
          * 定義XML文檔建立與解析的接口
          */
          public interface XmlDocument {
          /**
          * 建立XML文檔
          * @param fileName 文件全路徑名稱
          */
          public void createXml(String fileName);
          /**
          * 解析XML文檔
          * @param fileName 文件全路徑名稱
          */
          public void parserXml(String fileName);
          }

          1.DOM生成和解析XML文檔

          為 XML 文檔的已解析版本定義了一組接口。解析器讀入整個(gè)文檔,然后構(gòu)建一個(gè)駐留內(nèi)存的樹結(jié)構(gòu),然后代碼就可以使用 DOM 接口來操作這個(gè)樹結(jié)構(gòu)。優(yōu)點(diǎn):整個(gè)文檔樹在內(nèi)存中,便于操作;支持刪除、修改、重新排列等多種功能;缺點(diǎn):將整個(gè)文檔調(diào)入內(nèi)存(包括無用的節(jié)點(diǎn)),浪費(fèi)時(shí) 間和空間;使用場合:一旦解析了文檔還需多次訪問這些數(shù)據(jù);硬件資源充足(內(nèi)存、CPU)。

          package com.alisoft.facepay.framework.bean; 
          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.PrintWriter;
          import javax.xml.parsers.DocumentBuilder;
          import javax.xml.parsers.DocumentBuilderFactory;
          import javax.xml.parsers.ParserConfigurationException;
          import javax.xml.transform.OutputKeys;
          import javax.xml.transform.Transformer;
          import javax.xml.transform.TransformerConfigurationException;
          import javax.xml.transform.TransformerException;
          import javax.xml.transform.TransformerFactory;
          import javax.xml.transform.dom.DOMSource;
          import javax.xml.transform.stream.StreamResult;
          import org.w3c.dom.Document;
          import org.w3c.dom.Element;
          import org.w3c.dom.Node;
          import org.w3c.dom.NodeList;
          import org.xml.sax.SAXException;
          /**
          *
          * @author hongliang.dinghl
          * DOM生成與解析XML文檔
          */
          public class DomDemo implements XmlDocument {
          private Document document;
          private String fileName;
          public void init() {
          try {
          DocumentBuilderFactory factory = DocumentBuilderFactory
          .newInstance();
          DocumentBuilder builder = factory.newDocumentBuilder();
          this.document = builder.newDocument();
          } catch (ParserConfigurationException e) {
          System.out.println(e.getMessage());
          }
          }
          public void createXml(String fileName) {
          Element root = this.document.createElement("employees");
          this.document.appendChild(root);
          Element employee = this.document.createElement("employee");
          Element name = this.document.createElement("name");
          name.appendChild(this.document.createTextNode("丁宏亮"));
          employee.appendChild(name);
          Element sex = this.document.createElement("sex");
          sex.appendChild(this.document.createTextNode("m"));
          employee.appendChild(sex);
          Element age = this.document.createElement("age");
          age.appendChild(this.document.createTextNode("30"));
          employee.appendChild(age);
          root.appendChild(employee);
          TransformerFactory tf = TransformerFactory.newInstance();
          try {
          Transformer transformer = tf.newTransformer();
          DOMSource source = new DOMSource(document);
          transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
          PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
          StreamResult result = new StreamResult(pw);
          transformer.transform(source, result);
          System.out.println("生成XML文件成功!");
          } catch (TransformerConfigurationException e) {
          System.out.println(e.getMessage());
          } catch (IllegalArgumentException e) {
          System.out.println(e.getMessage());
          } catch (FileNotFoundException e) {
          System.out.println(e.getMessage());
          } catch (TransformerException e) {
          System.out.println(e.getMessage());
          }
          }
          public void parserXml(String fileName) {
          try {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document document = db.parse(fileName);
          NodeList employees = document.getChildNodes();
          for (int i = 0; i < employees.getLength(); i++) {
          Node employee = employees.item(i);
          NodeList employeeInfo = employee.getChildNodes();
          for (int j = 0; j < employeeInfo.getLength(); j++) {
          Node node = employeeInfo.item(j);
          NodeList employeeMeta = node.getChildNodes();
          for (int k = 0; k < employeeMeta.getLength(); k++) {
          System.out.println(employeeMeta.item(k).getNodeName()
          + ":" + employeeMeta.item(k).getTextContent());
          }
          }
          }
          System.out.println("解析完畢");
          } catch (FileNotFoundException e) {
          System.out.println(e.getMessage());
          } catch (ParserConfigurationException e) {
          System.out.println(e.getMessage());
          } catch (SAXException e) {
          System.out.println(e.getMessage());
          } catch (IOException e) {
          System.out.println(e.getMessage());
          }
          }
          }

          2.SAX生成和解析XML文檔

          為 解決DOM的問題,出現(xiàn)了SAX。SAX ,事件驅(qū)動。當(dāng)解析器發(fā)現(xiàn)元素開始、元素結(jié)束、文本、文檔的開始或結(jié)束等時(shí),發(fā)送事件,程序員編寫響應(yīng)這些事件的代碼,保存數(shù)據(jù)。優(yōu)點(diǎn):不用事先調(diào)入整個(gè) 文檔,占用資源少;SAX解析器代碼比DOM解析器代碼小,適于Applet,下載。缺點(diǎn):不是持久的;事件過后,若沒保存數(shù)據(jù),那么數(shù)據(jù)就丟了;無狀態(tài) 性;從事件中只能得到文本,但不知該文本屬于哪個(gè)元素;使用場合:Applet;只需XML文檔的少量內(nèi)容,很少回頭訪問;機(jī)器內(nèi)存少;

          Java代碼

          package com.alisoft.facepay.framework.bean;   
          import java.io.FileInputStream;  
          import java.io.FileNotFoundException;  
          import java.io.IOException;  
          import java.io.InputStream;  

          import javax.xml.parsers.ParserConfigurationException;  
          import javax.xml.parsers.SAXParser;  
          import javax.xml.parsers.SAXParserFactory;  

          import org.xml.sax.Attributes;  
          import org.xml.sax.SAXException;  
          import org.xml.sax.helpers.DefaultHandler;  
          /**
          *  
          * @author hongliang.dinghl
          * SAX文檔解析
          */
          public class SaxDemo implements XmlDocument {  

          public void createXml(String fileName) {  
          System.out.println("<<"+filename+">>");  
          }  

          public void parserXml(String fileName) {  
          SAXParserFactory saxfac = SAXParserFactory.newInstance();  

          try {  

          SAXParser saxparser = saxfac.newSAXParser();  

          InputStream is = new FileInputStream(fileName);  

          saxparser.parse(is, new MySAXHandler());  

          } catch (ParserConfigurationException e) {  

          e.printStackTrace();  

          } catch (SAXException e) {  

          e.printStackTrace();  

          } catch (FileNotFoundException e) {  

          e.printStackTrace();  

          } catch (IOException e) {  

          e.printStackTrace();  

          }  

          }  

          }  

          class MySAXHandler extends DefaultHandler {  

          boolean hasAttribute = false;  

          Attributes attributes = null;  

          public void startDocument() throws SAXException {  

          System.out.println("文檔開始打印了");  

          }  

          public void endDocument() throws SAXException {  

          System.out.println("文檔打印結(jié)束了");  

          }  

          public void startElement(String uri, String localName, String qName,  

          Attributes attributes) throws SAXException {  

          if (qName.equals("employees")) {  

          return;  

          }  

          if (qName.equals("employee")) {  

          System.out.println(qName);  

          }  

          if (attributes.getLength() > 0) {  

          this.attributes = attributes;  

          this.hasAttribute = true;  

          }  

          }  

          public void endElement(String uri, String localName, String qName)  

          throws SAXException {  

          if (hasAttribute && (attributes != null)) {  

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

          System.out.println(attributes.getQName(0)  
          + attributes.getValue(0));  

          }  

          }  

          }  

          public void characters(char[] ch, int start, int length)  

          throws SAXException {  

          System.out.println(new String(ch, start, length));  

          }  

          }
          package com.alisoft.facepay.framework.bean;
          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.IOException;
          import java.io.InputStream;
          import javax.xml.parsers.ParserConfigurationException;
          import javax.xml.parsers.SAXParser;
          import javax.xml.parsers.SAXParserFactory;
          import org.xml.sax.Attributes;
          import org.xml.sax.SAXException;
          import org.xml.sax.helpers.DefaultHandler;
          /**
          *
          * @author hongliang.dinghl
          * SAX文檔解析
          */
          public class SaxDemo implements XmlDocument {
          public void createXml(String fileName) {
          System.out.println("<<"+filename+">>");
          }
          public void parserXml(String fileName) {
          SAXParserFactory saxfac = SAXParserFactory.newInstance();
          try {
          SAXParser saxparser = saxfac.newSAXParser();
          InputStream is = new FileInputStream(fileName);
          saxparser.parse(is, new MySAXHandler());
          } catch (ParserConfigurationException e) {
          e.printStackTrace();
          } catch (SAXException e) {
          e.printStackTrace();
          } catch (FileNotFoundException e) {
          e.printStackTrace();
          } catch (IOException e) {
          e.printStackTrace();
          }
          }
          }
          class MySAXHandler extends DefaultHandler {
          boolean hasAttribute = false;
          Attributes attributes = null;
          public void startDocument() throws SAXException {
          System.out.println("文檔開始打印了");
          }
          public void endDocument() throws SAXException {
          System.out.println("文檔打印結(jié)束了");
          }
          public void startElement(String uri, String localName, String qName,
          Attributes attributes) throws SAXException {
          if (qName.equals("employees")) {
          return;
          }
          if (qName.equals("employee")) {
          System.out.println(qName);
          }
          if (attributes.getLength() > 0) {
          this.attributes = attributes;
          this.hasAttribute = true;
          }
          }
          public void endElement(String uri, String localName, String qName)
          throws SAXException {
          if (hasAttribute && (attributes != null)) {
          for (int i = 0; i < attributes.getLength(); i++) {
          System.out.println(attributes.getQName(0)
          + attributes.getValue(0));
          }
          }
          }
          public void characters(char[] ch, int start, int length)
          throws SAXException {
          System.out.println(new String(ch, start, length));
          }
          }

          3.DOM4J生成和解析XML文檔

          DOM4J 是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。

          Java代碼

          package com.alisoft.facepay.framework.bean;   
          import java.io.File;  
          import java.io.FileWriter;  
          import java.io.IOException;  
          import java.io.Writer;  
          import java.util.Iterator;  

          import org.dom4j.Document;  
          import org.dom4j.DocumentException;  
          import org.dom4j.DocumentHelper;  
          import org.dom4j.Element;  
          import org.dom4j.io.SAXReader;  
          import org.dom4j.io.XMLWriter;  
          /**
          *  
          * @author hongliang.dinghl
          * Dom4j 生成XML文檔與解析XML文檔
          */
          public class Dom4jDemo implements XmlDocument {  

          public void createXml(String fileName) {  
          Document document = DocumentHelper.createDocument();  
          Element employees=document.addElement("employees");  
          Element employee=employees.addElement("employee");  
          Element name= employee.addElement("name");  
          name.setText("ddvip");  
          Element sex=employee.addElement("sex");  
          sex.setText("m");  
          Element age=employee.addElement("age");  
          age.setText("29");  
          try {  
          Writer fileWriter=new FileWriter(fileName);  
          XMLWriter xmlWriter=new XMLWriter(fileWriter);  
          xmlWriter.write(document);  
          xmlWriter.close();  
          } catch (IOException e) {  

          System.out.println(e.getMessage());  
          }  


          }  


          public void parserXml(String fileName) {  
          File inputXml=new File(fileName);  
          SAXReader saxReader = new SAXReader();  
          try {  
          Document document = saxReader.read(inputXml);  
          Element employees=document.getRootElement();  
          for(Iterator i = employees.elementIterator(); i.hasNext();){  
          Element employee = (Element) i.next();  
          for(Iterator j = employee.elementIterator(); j.hasNext();){  
          Element node=(Element) j.next();  
          System.out.println(node.getName()+":"+node.getText());  
          }  

          }  
          } catch (DocumentException e) {  
          System.out.println(e.getMessage());  
          }  
          System.out.println("dom4j parserXml");  
          }   
          }  

          4.JDOM生成和解析XML  

          為減少DOM、SAX的編碼量,出現(xiàn)了JDOM;優(yōu)點(diǎn):20-80原則,極大減少了代碼量。使用場合:要實(shí)現(xiàn)的功能簡單,如解析、創(chuàng)建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。

              
          package com.alisoft.facepay.framework.bean;    

          import java.io.FileNotFoundException;  
          import java.io.FileOutputStream;  
          import java.io.IOException;  
          import java.util.List;  

          import org.jdom.Document;  
          import org.jdom.Element;  

          posted @ 2009-12-02 21:16 TonyZhangtl 閱讀(245) | 評論 (0)編輯 收藏


          2007-07-15 11:33

          關(guān)于JAXP,DOM,SAX,JDOM,DOM4J的一些想法

          這些API是XSLT的關(guān)鍵部分,它們構(gòu)建在DOM和SAX解析器基礎(chǔ)上。

          Sun在XML領(lǐng)域總是后知后覺,等到Sun重視XML的時(shí)候,XML的API早就滿天飛了,尤其是IBM具有非常大的領(lǐng)先優(yōu)勢。不過Sun是規(guī)范 的制訂者,于是參考WOffice:smarttags" />3C的標(biāo)準(zhǔn)制訂了JAXP規(guī)范。JAXP不像Xerces和Crimon那樣,它只是一個(gè)spec,本身是不做任何事情的,它的作用就是提出一 個(gè)統(tǒng)一的接口,讓其它的XML API都來遵循JAXP編程,那么用JAXP寫出來的程序,底層的API可以任意切換。

          具體來說JAXP包括了幾個(gè)工廠類,這就是JDK1.4里面的Javax.xml.parsers 包,用來尋找符合DOM標(biāo)準(zhǔn)的XML API實(shí)現(xiàn)類的位置;此外JAXP還包括一整套interface,這就是JDK1.4里面的org.w3c.dom那幾個(gè)包。工廠類負(fù)責(zé)加載DOM的實(shí) 現(xiàn)類。

          當(dāng)你嚴(yán)格采用JAXP編程的時(shí)候,是遵循W3C的DOm標(biāo)準(zhǔn)的,那么在JAXP底層你實(shí)際上可以任意切換不同的DOM實(shí)現(xiàn),例如Xerces,或者Crimon,再或者其它,切換方法就是配置jaxp.properties。因此JAXP就是一些標(biāo)準(zhǔn)接口而已。

          JAXP應(yīng)用程序 -> JAXP接口 -> Xerces DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器
          JAXP應(yīng)用程序 -> JAXP接口 -> Crimson DOM實(shí)現(xiàn) -> Crimson DOM/SAX 解析器
          JAXP應(yīng)用程序 -> JAXP接口 -> Crimson DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器

          W3C的DOM標(biāo)準(zhǔn)API難用的讓人想撞墻,于是有一幫人開發(fā)Java專用的XML API目的是為了便于使用,這就是jdom的由來,開發(fā)到一半的時(shí)候,另一部分人又分了出來,他們有自己的想法,于是他們就去開發(fā)dom4j,形成了今天 這樣兩個(gè)API,至于他們之間的性能,功能之比較看看上面我推薦的文章就知道了,jdom全面慘敗。

          jdom 相當(dāng)于上面的 JAXP接口 + Xerces DOM實(shí)現(xiàn)部分,它本身沒有解析器,它可以使用Xerces或者Crimson的解析器即
          JAXP應(yīng)用程序 -> JAXP接口 -> Xerces DOM實(shí)現(xiàn) -> Crimson DOM/SAX 解析器 或 Xerces DOM/SAX 解析器

          jdom應(yīng)用程序 -> jdom API -> Xerces/Crimson解析器
          dom4j應(yīng)用程序 -> dom4j API -> Xerces/Crimson解析器
          dom4j應(yīng)用程序 -> dom4j API -> Alfred2解析器

          因此可以看出采用dom4j/jdom編寫的應(yīng)用程序,已經(jīng)不具備可移植性了

          Sun是JAXP標(biāo)準(zhǔn)的制訂者,甚至很執(zhí)著的在JDK1.4里面綁定Crimson DOM實(shí)現(xiàn)和解析器,然后可笑的是,Sun自己的JAXM RI竟然不是用JAXP寫出來的,而是dom4j

          我的舉例:

          1.   僅僅是XSL轉(zhuǎn)換。XMLàHTML,通過XSL

          Import javax.xml.transform.TransformerFactory;

          Import javax.xml.transform.Transformer;

          Import javax.xml.stream.StreamSource;

          Import javax.xml.stream.StreamResult;

          import java.io.FileOutputStream;

          TransformerFactory transFactory = TransformerFactory.newInstance();

          Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

          Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

          這里的stream是一個(gè)DOM對象。
          我感覺這個(gè)就是JAXP應(yīng)用程序 -> JAXP接口 -> Xerces DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器,不知道對不對。

          2.遍歷XML,通過DOM。不僅僅是XSL轉(zhuǎn)換。中間有對XML元素內(nèi)容的操作。
          Import javax.xml.transform.TransformerFactory;

          Import javax.xml.transform.Transformer;

          Import javax.xml.stream.StreamSource;

          Import javax.xml.stream.StreamResult;

          import java.io.FileOutputStream;

          //Xerces解析器來完成DOM遍歷XML.DOMParser是Xerces包的一部分。

          Import org.apache.xerces.parsers.DOMParser;

          Import org.w3c.dom.Document;

          Import org.w3c.dom.NodeList;

          //DOM遍歷XML

          DOMParser parser = new DOMParser();

          Parser.parse(XMLFileName);//解析并在內(nèi)存中創(chuàng)建XML樹。

          Document document = parser.getDocument();//通過Document對象,可以使用內(nèi)存中的樹。

          NodeList products = document.getElementByTagName(“product_id”);

          Int num_products = products.getLength();

          //XSL轉(zhuǎn)化器

          TransformerFactory transFactory = TransformerFactory.newInstance();

          Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

          Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

          我感覺XSL轉(zhuǎn)化和對XML對象的操作是兩個(gè)過程。可以分別對待。最重要的是對對象的操作。這也就是為什么有DOM,JDOM,DOM4J。轉(zhuǎn)化好像只需要JAXP就可以了,關(guān)心的是StreamSource和StreamResult。這兩個(gè)是DOM對象。


          3.JDOM使用,生成Document內(nèi)容并保存到XML文件。
          import org.jdom.Element;
          import org.jdom.Document;//和Import org.w3c.dom.Document對比一下。一個(gè)是JAXP的一個(gè)是JDOM的Document

          import org.jdom.output.XMLOutputter;

          Element root = Element(“orders”);

          root.addContent(“ ”);

          org.jdom.Document document = new Document(root);//創(chuàng)建JDOM樹。

          FileOutputStream outStream = new FileOutputStream(XMLFileName);

          XMLOutputter outToFile = new XMLOutputter();

          outToFile.output(document,outStream);

          outStream.flush();

          outStream.close();

          jdom應(yīng)用程序 -> jdom API -> Xerces/Crimson解析器
          VS
          JAXP應(yīng)用程序 -> JAXP接口 -> Xerces DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器

          這里的沒有Transform的過程,直接把Document的內(nèi)容存到XML中。沒有XSL轉(zhuǎn)化,沒有XSL文件。

          JDOM提供了幾種輸出方法。這里XMLOutputter是保存到文件,輸出一個(gè)實(shí)際的XML流。還有DOMOutputter,在內(nèi)存中創(chuàng)建一個(gè)傳統(tǒng)的DOM樹。還有SAXOutputter,創(chuàng)建一串SAX事件以便被其他對象讀取。



          4.JDOM使用,讀取已有的XML然后生成Document,修改Document
          import org.jdom.Element;
          import org.jdom.Document;

          import org.jdom.output.XMLOutputter;
              import org.jdom.input.SAXBuilder;

              SAXBuilder builder = new SAXBuilder();
              Document document = builder.build(XMLFileName);

          Element order = Element(“orders”);

          orders.addAttribute(“order_id”,session_id);

          Element root = document.getRootElement();//root是已經(jīng)存在的根元素。

          Root.addContent(order);//在根元素里增加orders元素。

          //把document保存到文件中。

          FileOutputStream outStream = new FileOutputStream(XMLFileName);

          XMLOutputter outToFile = new XMLOutputter();

          outToFile.output(document,outStream);

          outStream.flush();

          outStream.close();

          即使創(chuàng)建一個(gè)DOM式的結(jié)構(gòu),這里仍使用SAXBuilder來做這這件事情。

          DOMBuilder和SAXBuilder中的”DOM”和”SAX”指的是用于建立文檔的方法,而不是生成的內(nèi)容。

          5.XSL轉(zhuǎn)換,能把DOM對象轉(zhuǎn)化成輸出,也可以向上面所舉例的把XMLFileName的流轉(zhuǎn)化成輸出的流(文件或屏幕顯示)。但是不能把JDOM對象轉(zhuǎn)化,所以需要把JDOM轉(zhuǎn)化成DOM對象,然后再輸出。
          import org.jdom.Element;
          import org.jdom.Document;

          import org.jdom.output.XMLOutputter;
              import org.jdom.input.SAXBuilder;  
              //XSL轉(zhuǎn)化需要的包
          import org.jdom.output.DOMOutputter;//對比org.jdom.output.XMLOutputter;
          Import javax.xml.transform.TransformerFactory;

          Import javax.xml.transform.Transformer;

          Import javax.xml.transform.DOMSource;//對比Import javax.xml.stream.StreamSource;

          Import javax.xml.stream.StreamResult;

             org.w3c.dom.Document DOMDoc;
             DOMOutputter DomOut = DOMOutputter();
             DOMDoc = DomOut.output(org.jdom.Document);//把jdom的document轉(zhuǎn)化成DOM的document

             TransformFactory transFactory = TransformFactory.newInstance();
             Transformer transformer = transFactory.newTransformer(new DOMSource(DOMDoc));//感覺錯了,應(yīng)該是XSL文件。
             Transformer.transform(new DOMSource(DOMDoc),new StreamResult(out));

          //對比以前的轉(zhuǎn)化,是從文件到文件,現(xiàn)在是DOM樹到屏幕輸出。
          TransformerFactory transFactory = TransformerFactory.newInstance();

          Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

          Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

          posted @ 2009-12-02 21:14 TonyZhangtl 閱讀(504) | 評論 (0)編輯 收藏

          SAX是基于事件流的解析,DOM是基于XML文檔樹結(jié)構(gòu)的解析。
          dom優(yōu)點(diǎn):整個(gè)文檔樹在內(nèi)存中,便于操作;支持刪除、修改、重新排列等多種功能;缺點(diǎn):將整個(gè)文檔調(diào)入內(nèi)存(包括無用的節(jié)點(diǎn)),浪費(fèi)時(shí)間和空間;使用場合:一旦解析了文檔還需多次訪問這些數(shù)據(jù);硬件資源充足(內(nèi)存、CPU)。
          SAX ,事件驅(qū)動。當(dāng)解析器發(fā)現(xiàn)元素開始、元素結(jié)束、文本、文檔的開始或結(jié)束等時(shí),發(fā)送事件,程序員編寫響應(yīng)這些事件的代碼,保存數(shù)據(jù)。優(yōu)點(diǎn):不用事先調(diào)入整個(gè) 文檔,占用資源少;SAX解析器代碼比DOM解析器代碼小,適于Applet,下載。缺點(diǎn):不是持久的;事件過后,若沒保存數(shù)據(jù),那么數(shù)據(jù)就丟了;無狀態(tài) 性;從事件中只能得到文本,但不知該文本屬于哪個(gè)元素;使用場合:Applet;只需XML文檔的少量內(nèi)容,很少回頭訪問;機(jī)器內(nèi)存少;

          posted @ 2009-12-02 21:13 TonyZhangtl 閱讀(265) | 評論 (0)編輯 收藏

          2009年11月30日

          http://www.javaeye.com/topic/60179

          posted @ 2009-11-30 21:33 TonyZhangtl 閱讀(149) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 津市市| 长治市| 澎湖县| 淮阳县| 南和县| 东港市| 徐闻县| 西乡县| 霸州市| 榆社县| 建湖县| 尉氏县| 蛟河市| 余干县| 姜堰市| 泰州市| 浦江县| 东乡族自治县| 肥城市| 永清县| 县级市| 炎陵县| 太仓市| 日喀则市| 晋宁县| 杨浦区| 罗定市| 财经| 醴陵市| 措勤县| 远安县| 九龙城区| 新干县| 文昌市| 保山市| 托克逊县| 福鼎市| 修水县| 丹东市| 工布江达县| 阜阳市|