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

          2009年12月5日

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

          2. xml encoding declaration

          對 一段編碼后的文本,要想正確地處理它,必須要事先知道其采用的編碼方式,因此這種編碼信息一般是存在于該文本之外的,比如某些編輯器會在文件開始放幾個不 可見的字節來指示其正文的編碼方式,這些字節叫做BOM(Byte Order Mark);某些網絡協議會有一些字段來指示其所攜帶文本的編碼方式。這種方式很直觀,很多系統/技術采用這種方式,大多數有關xml的應用也會優先使用 這種外部的編碼信息,但是當沒有這種外部的編碼信息可用的時候呢?一個xml document可以用一個xml declaration來聲明其采用的編碼,形如<?xml version="1.0" encoding="UTF-8"?>,這種方式看起來不大可能工作,因為這個聲明本身就是文本的,并且該聲明是xml document的一部分,不可能規定其采用的編碼方式。如何能在不知道xml document編碼的情況下理解其xml declaration中聲明的編碼呢?對xml編碼聲明的位置及內容的限制使自動檢測成為可能:編碼聲明必須出現在文檔開頭,只允許ASCII字符并且 其頭幾個字符必須是<?xml,這樣,一個xml processor就可以先讀出文檔的前幾個字節,推斷其采用的編碼的特征,根據該特征能理解xml declaration,讀出encoding屬性值,從而知道該文檔的編碼。比如,如果前4個字節的內容為3C 3F 78 6D,則可以確定該文檔采用的是一種兼容ASCII的編碼,這樣xml processor就可以用任一種兼容ASCII的編碼(如UTF-8)來理解編碼后xml聲明,因為其只包含ASCII字符,任何兼容ASCII的編碼 對其編碼的結果都是相同的。當得到xml declaration中聲明的編碼時,xml processor再轉換到該編碼對該xml進行處理。下表來自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 閱讀(301) | 評論 (0)編輯 收藏

          雖然將jxl.jar包添加到工程里了, 但是仍讓有java.lang.ClassNotFoundException: jxl.write.WritableCell錯誤。
          需要把jar包放在web-inf/lib目錄下再加載才可以解決這個問題。
          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 閱讀(899) | 評論 (1)編輯 收藏

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

          2.EJB構件是可部署的,EJB構件可以作為獨立的單元被部署到EJB應用服務器上,是應用構件(application components),而JavaBeans構件是不可部署的, JavaBeans構件是開發構件,不能被部署為獨立的單元。

          3.EJB構件是部署可定制的,使用部署描述符可以在部署EJB時對其運行時配置進行定制,而JavaBeans構件在部署時不能進行定制,JavaBeans構件的定制僅發生在開發階段,只能利用開發工具創建并組裝JavaBeans構件,部署時不能定制

          4.EJB構件是分布式對象,可以被客戶應用或者其它EJB構件進行遠程訪問,而JavaBeans構件不是分布式對象,JavaBeans構件只能在其構成的應用中使用,不能提供遠程訪問能力

          5.EJB構件對終端用戶不可見,運行在服務端,沒有人機交互界面,而部分JavaBeans構件對終端用戶可見,如GUI應用中使用的按鈕構件.

          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


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


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





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

          主站蜘蛛池模板: 盐山县| 商洛市| 淮南市| 资中县| 崇州市| 彭泽县| 北川| 宜昌市| 克拉玛依市| 建瓯市| 崇仁县| 岑巩县| 平南县| 海原县| 中卫市| 万山特区| 都匀市| 普格县| 进贤县| 三河市| 文山县| 镇平县| 同江市| 尼木县| 水城县| 富阳市| 道真| 老河口市| 襄汾县| 东明县| 甘德县| 商城县| 威信县| 健康| 灌云县| 太和县| 怀集县| 东源县| 石门县| 岳阳市| 平潭县|