posts - 7, comments - 2, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          搜索

          •  

          最新評論

          2007年11月3日


           什么是 Java 技術(shù)?  
          Java 技術(shù)(版本 2)是一種面向?qū)ο蟮木幊陶Z言,是 Sun Microsystems 所開發(fā)的編程平臺。Java 技術(shù)基于單一 Java 虛擬機(JVM)的概念,JVM 是編程語言與機器底層軟件和硬件之間的翻譯器。編程語言的所有實現(xiàn)都必須模擬 JVM,從而使 Java 程序可以在具有 JVM 版本的任何系統(tǒng)上運行。

          Java 編程語言是與眾不同的,因為 Java 程序需要經(jīng)過編譯(翻譯為叫做 Java 字節(jié)碼的中間語言)和解釋(通過 JVM 分析和運行字節(jié)碼)。編譯只進行一次,而解釋則在每次運行程序時都要進行。編譯的字節(jié)碼是 JVM 的最佳機器碼形式;解釋程序是 JVM 的實現(xiàn)。

          Java 平臺具有三個版本(請參閱下面的 Java 平臺的多個版本),該平臺由 JVM 和 Java Application Programming Interface (API) 組成,Java API 是現(xiàn)成軟件組件的集合,便于進行 applet 和應用程序的開發(fā)和部署,其中包括健壯的、安全的和可互操作的企業(yè)應用程序。Java API 被分組到相關(guān)類和接口的庫中;這些庫稱為包。

          了解更多信息:

          要了解 Sun 的 Java 編程語言的未來發(fā)展方向,請閱讀 2003 JavaOne Developer Conference 的 technical keynote digest。 
          Java 平臺的多個版本
          因為 Java 技術(shù)的迅速普及,開發(fā)人員強烈要求某些東西更簡單些。Sun Microsystems 通過創(chuàng)建三個 Java 平臺版本來滿足此需要 ― Standard Edition、Enterprise Edition 和 Micro Edition。

          了解更多信息:

          J2SE (Java 2 Standard Edition)。包括標準的 Java 2 SDK、工具、運行時環(huán)境和 API,用于那些采用 Java 程序設(shè)計語言編寫、部署和運行 applet 和應用程序的開發(fā)人員。 Merlin 的魔力 專欄極好地介紹了最新版本的 J2SE 1.4。


          J2EE (Java 2 Enterprise Edition)。通過基于標準化模塊組件,通過為這些組件提供一整套服務,以及通過自動處理應用程序行為的許多細節(jié),而無需進行復雜編程,企業(yè)版簡化了多層企業(yè)應用程序的構(gòu)造和部署。J2EE 探索者 專欄將增加您對此版本的了解。


          J2ME (Java 2 Micro Edition)。該版本是高度優(yōu)化的 Java 運行時環(huán)境,針對特定的消費者領(lǐng)域,從智能型手機或?qū)ず魴C到機頂盒等一系列小型設(shè)備(外形小或者存儲能力受限)。在“ J2ME 101,第 1 部分:介紹 MIDP 的高層 UI”教程中可以了解更多關(guān)于 J2ME 的信息。(您還可以在 developerWorks 無線 專題找到許多 J2ME 參考資料。) 
           
           
           到頁首  
           
           
            Java 技術(shù)為什么重要?  
          總體來說,Java 語言的主要優(yōu)點在于跨平臺和操作系統(tǒng)的可移植性,以及它可以通過帶寬相對較窄的通道提供(比如撥號連接)。Java 語言還具有可伸縮性;現(xiàn)有應用程序可以很容易地適應那些受內(nèi)存資源限制的設(shè)備。另外,由于 Java 語言設(shè)計用于通過網(wǎng)絡(luò)以安全的方式運行,所以當通過 Internet 操作時,它也提供了此級別的安全性。本質(zhì)上,Java 技術(shù)將用戶計算能力從桌面擴展到了 Web 資源。
           
           
           到頁首  
           
           
            什么是 Java 組件技術(shù)?  
          管理 Java 技術(shù)縮略詞的字母湯(alphabet soup)可能是一項巨大的任務,就正如通過 Java Community Process 管理 Java 語言的發(fā)展一樣。下面是 Java 語言各版本的組件、可選包和擴展包的部分列表(也就是組成這個平臺的復雜部件),并給出了簡短描述和參考資料鏈接,用以說明它在 Java 開發(fā)領(lǐng)域中的作用。注意下面許多參考資料都可以在各版本中使用。

          J2SE 中的技術(shù):

          Java Access Bridge 用于 Microsoft Windows,它起到了網(wǎng)橋的作用,允許基于 Windows 的輔助技術(shù)與 Java Accessibility API 進行交互(請參閱“為可訪問性編碼”。)


          JavaBeans Component Architecture 是平臺獨立的規(guī)范,它為 Java 平臺定義了一套標準組件軟件 API。(請參閱“Reflecting, introspecting, and customizing JavaBeans”。)


          Javadoc 是一種工具,用于從源代碼的 doc 注釋中生成 HTML 格式的 API 文檔。(請參閱“Java 理論和實踐:我必須對那些內(nèi)容進行文檔編制嗎?”。)


          Java Foundation Classes (Swing) (JFC) 是 Java 類庫的集合,它支持為基于 Java 的客戶機應用程序構(gòu)建 GUI 和圖形功能。(請參閱“Java 2 用戶界面”。)


          Java Platform Debugger Architecture (JPDA) 是 Java 2 的調(diào)試支持基礎(chǔ)設(shè)施。JPDA 包括三層 API: 
          JDI (Java Debug Interface)是一種支持遠程調(diào)試的高級別編程語言接口。 
          JDWP (Java Debug Wire Protocol) 定義在調(diào)試過程和調(diào)試器前端之間傳輸?shù)男畔⒑驼埱蟮母袷健?nbsp;
          JVMDI (Java Virtual Machine Debug Interface) 是低級別本地接口,定義了調(diào)試時 JVM 必須提供的服務。 
          (請參閱“ 軟件開發(fā)的未來 ”。)

          Java 2D API 是用于高級 2D 圖形和成像(為圖像合成和 alpha 通道圖像提供廣泛支持)的類集合,是提供正確的色彩空間定義和轉(zhuǎn)換的類集合,是面向顯示的成像操作符的集合。(請參閱教程“Java 2D簡介”。)


          Java Web Start 使您可以通過單擊而無需經(jīng)歷安裝過程來下載和啟動功能完善的應用程序(如電子表格),從而簡化 Java 應用程序的部署。(請參閱“Java Web Start”。)


          Java Database Connectivity (JDBC) 是一種 API,使您可以從 Java 內(nèi)訪問大多數(shù)表格式數(shù)據(jù)源,它提供了大多數(shù) SQL 數(shù)據(jù)庫的跨 DBMS 連通性,以及對其他表格式數(shù)據(jù)源的訪問(如電子表格或平面文件)。(請參閱“JDBC 3.0 有什么新特性”。)


          Remote Method Invocation (RMI) 提供引導命名服務,不會改變類型,并使用對象序列化使編程人員能夠創(chuàng)建基于 Java 技術(shù)的分布式應用程序,在該應用程序中,可以從不同主機上的其他 Java 虛擬機上調(diào)用遠程 Java 對象的方法。(請參閱教程“分布式對象 101-使用RMI和CORBA ”。)


          Java Advanced Imaging (JAI) 是一種 API,提供了面向?qū)ο蟮慕涌诘募希@些接口支持簡單的高級編程模型,使得開發(fā)人員可以很容易地操縱圖像。(請參閱“利用 JSP 代碼管理您的圖像”。)


          Java Authentication and Authorization Service (JAAS) 是一個包,它啟用服務,通過實現(xiàn)標準 Pluggable Authentication Module (PAM) 框架的 Java 版本,通過支持基于用戶的授權(quán),對用戶進行驗證和執(zhí)行訪問控制。(請參閱教程“Java 安全性 第二部分 認證與授權(quán)”;“擴展 JAAS 實現(xiàn)類實例級授權(quán)”也是很好的信息來源。)


          Java Cryptography Extension (JCE) 是一個包集合,提供了加密、密鑰生成和協(xié)議以及 Message Authentication Code (MAC) 算法的框架和實現(xiàn)。它提供了對稱、非對稱、分組和流密碼的加密支持,并支持安全流和密封對象。(請參閱教程“Java 安全性第一部分 密碼學基礎(chǔ)”。)


          Java Data Objects (JDO) 是持久性的基于標準接口的 Java 模型抽象,它允許編程人員直接將 Java 域模型實例存儲到持久存儲(數(shù)據(jù)庫)中,可能替代直接文件輸入輸出、序列化、JDBC 和 EJB Bean Managed Persistence (BMP) 或 Container Managed Persistence (CMP) Entity Bean 等方法。(請參閱教程“Java 數(shù)據(jù)對象上機實踐”。)


          Java Management Extensions (JMX) 提供的工具用于構(gòu)建分布式、基于 Web 的、模塊化和動態(tài)應用程序,以便管理和監(jiān)視設(shè)備、應用程序和服務驅(qū)動的網(wǎng)絡(luò)。(請參閱由三部分組成的“從黑箱到企業(yè),第 1 部分:管理,JMX 1.1 樣式”。)


          Java Media Framework (JMF) 允許音頻、視頻和其他基于時間的媒體添加到 Java 應用程序和 applet 中。(請參閱教程“Java Media Framework 基礎(chǔ)”。)


          Java Naming and Directory Interface (JNDI) 是一種標準擴展包,為企業(yè)中的多個命名和目錄服務提供具有統(tǒng)一接口的 Java 應用程序,允許不同種類的企業(yè)命名和目錄服務的無縫連通性。(請參閱“EJB 最佳實踐:工業(yè)強度的 JNDI 優(yōu)化”。)


          Java Secure Socket Extensions (JSSE) 是啟用安全 Internet 通信的包集合,實現(xiàn) SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 協(xié)議的 Java 版本,并包括數(shù)據(jù)加密、服務器驗證、消息完整性和可選客戶機驗證的功能。(請參閱教程“將 JSSE 用于安全套接字通信”。)


          Java Speech API (JSAPI) 允許 Java 應用程序?qū)⒄Z音技術(shù)合并到用戶接口中。JSAPI 定義了跨平臺的 API,以支持命令和控制識別程序、聽寫系統(tǒng)和語音合成器。(請參閱“The Java 2 user interface”部分。)


          Java 3D 是一種 API,通過提供支持簡單高級編程模型的一組面向?qū)ο蟮慕涌冢_發(fā)人員可以使用它容易地將可伸縮的平臺獨立的 3D 圖形合并到 Java 應用程序中。(請參閱教程“Java 3D 探奇 ”。) 
          J2EE 中的技術(shù):

          Java API for XML Processing (JAXP) 通過使應用程序解析和轉(zhuǎn)換不依賴特定 XML 處理實現(xiàn)的 XML 文檔,通過使開發(fā)人員可以靈活地在 XML 處理器程序之間進行交換,而無需更改應用程序代碼,從而支持使用 DOM、SAX 和 XSLT 處理 XML 文檔。(請參閱“使用 Java 編程利用在線 XML 數(shù)據(jù)”。)


          Java API for XML Registries (JAXR) 為訪問不同種類的 XML 注冊中心提供了統(tǒng)一和標準的 API (用于構(gòu)建、部署和發(fā)現(xiàn) Web 服務的可用基礎(chǔ)設(shè)施)。(請參閱 Java 技術(shù)標準。)


          Java API for XML-based RPC (JAX-RPC) 使開發(fā)人員可以開發(fā)基于 SOAP 的可互操作的和可移植的 Web 服務。(請參閱 Java 技術(shù)標準。)


          SOAP with Attachments API for Java (SAAJ) 使開發(fā)人員可以生產(chǎn)和消費符合 SOAP 1.1 規(guī)范和 SOAP with Attachments 注解的消息。(從“使用SAAJ發(fā)送和接收SOAP消息”開始;有關(guān) XML 技術(shù)的詳細信息,請參閱 developerWorks XML 專區(qū)。)


          Common Object Request Broker Architecture (CORBA) 是異構(gòu)計算的開放標準,通過提供分布式對象框架、支持該框架的服務以及與其他語言的互操作性,該標準對 Java 進行了補充。(請參閱教程“使用RMI和CORBA ”;“企業(yè)中的 RMI-IIOP”也是很好的信息來源)。


          ECperf 是用于度量 Web 商務系統(tǒng)的性能和可伸縮性的基準。它包括:組成應用程序的 EJB 組件;使用 JSP 進行單一用戶/交互測試的 Web 客戶機;模式腳本和加載程序;makefile 和部署描述符;用于實現(xiàn)運行規(guī)則和模擬客戶機加載的驅(qū)動程序。(請參閱 Java 技術(shù)標準。)


          Enterprise JavaBeans (EJB) 是一種技術(shù),通過提供對事務、安全性、數(shù)據(jù)庫連通性等服務的支持,它使用組件模型來簡化中間件應用程序的部署。(請參閱介紹該技術(shù)的教程“Enterprise JavaBean 基礎(chǔ)”;另請參閱系列文章 EJB 最佳實踐。)


          Java Authorization Contract for Containers (Java ACC) 是一種規(guī)范,它定義了容器使用的授權(quán)提供者的安裝和配置。Java ACC 定義了提供者必須使用的接口,從而允許容器部署工具創(chuàng)建和管理與角色相對應的權(quán)限集合。(請參閱教程“Developing accessible GUIs with Swing”。)


          JavaMail 是一種 API,它提供了模擬郵件系統(tǒng)的抽象類的集合。(請參閱教程“ JavaMail API 基礎(chǔ)”。)


          Java Message Service (JMS) 是一種用來添加提供者框架的 API。通過定義所有兼容 JMS 技術(shù)的消息系統(tǒng)所支持的消息概念和編程策略的公共集合,該框架為 Java 平臺啟用了可移植的、基于消息的應用程序的部署。(請參閱“實現(xiàn)獨立于供應商的 JMS 解決方案”。)


          JavaServer Faces 提供了一種編程模型,通過匯集頁面中可重用的 UI 組件,將這些組件連接到應用程序數(shù)據(jù)源以及將客戶機生成的事件寫入服務器端事件處理程序,該模型有助于開發(fā)人員開發(fā) Web 應用程序。(請參閱“JSP pages, evolving and contributing to Web services”。)


          JavaServer Pages (JSP) 使 Web 開發(fā)人員可以使用單獨的用戶界面和內(nèi)容生成功能,快速地進行開發(fā)和輕松地維護動態(tài)的、平臺獨立的 Web 頁面,這樣設(shè)計人員就可以更改頁面布局,而無需改變動態(tài)內(nèi)容。該技術(shù)使用類似于 XML 的標簽,這些標簽封裝了用于生成頁面內(nèi)容的邏輯。(請參閱教程“JSP 技術(shù)入門 ”;另請參閱系列文章 JSP 最佳實踐。)


          Java Servlets 是一種擴展和增強 Web 服務器功能的 Java 方式。要做到這一點,應該為構(gòu)建基于 Web 的應用程序提供基于組件的平臺獨立的方法,而不會出現(xiàn) CGI 程序的性能限制。(developerWorks 中有許多關(guān)于 servlet 的信息。“創(chuàng)建 Java HTTP Servlet”和“構(gòu)建帶會話跟蹤的 Servlet”這兩篇入門教程應該是最好的起點。)


          J2EE Connector Architecture 定義了一種標準體系結(jié)構(gòu),通過定義一組可伸縮的、安全的事務性機制,允許 EIS 供應商提供插入到應用服務器中的標準資源適配器,該體系結(jié)構(gòu)用于將 J2EE 平臺連接到異構(gòu)企業(yè)信息系統(tǒng)(Enterprise Information Systems, EIS)。(請參閱教程“J2EE Connector Architecture 介紹”。)


          J2EE Management Specification (JMX) 定義了 J2EE 平臺的管理信息模型。該模型設(shè)計用于與許多管理系統(tǒng)和協(xié)議互操作,包括到 Common Information Model (CIM)、SNMP Management Information Base (MIB)的模型的標準映射,以及通過服務器駐留 EJB 組件(J2EE Management EJB Component,MEJB)到 Java 對象模型的模型的標準映射。(請參閱“從黑箱到企業(yè),第 1 部分:管理,JMX 1.1 樣式”。)


          Java Transaction API (JTA) 是高級的獨立于實現(xiàn)和協(xié)議的 API,它允許應用程序和應用程序服務器訪問事務。Java Transaction Service (JTS) 指定 Transaction Manager 的實現(xiàn), Transaction Manager 支持 JTA,并在低于 API 的級別上實現(xiàn) OMG Object Transaction Service (OTS) 1.1 規(guī)范的 Java 映射。JTS 使用 Internet Inter-ORB Protocol (IIOP) 傳輸事務。(請參閱“理解 JTS ― 平衡安全性和性能 ”。) 
          J2ME 中的技術(shù):

          Connected Limited Device Configuration (CLDC) 是組成資源受限移動信息設(shè)備的 Java 運行時環(huán)境的兩個配置之一。CLDC 提供了最基本的庫集合和虛擬機功能,在包含 K 虛擬機(KVM)的 J2ME 環(huán)境的每個實現(xiàn)中,這些都是必須存在的。(請參閱“Know no limits: Approaches to mobile device constraints”)


          Mobile Information Device Profile (MIDP) 是組成資源受限移動信息設(shè)備的 Java 運行環(huán)境的兩個配置之一。MIDP 提供核心應用程序功能,包括用戶界面、網(wǎng)絡(luò)連通性、本地數(shù)據(jù)存儲和應用程序生命周期管理。(請參閱教程“Implementing Push technology with J2ME and MIDP”。)


          Connected Device Configuration (CDC) 是一種基于標準的框架,用于構(gòu)建和提供可在許多網(wǎng)絡(luò)連接消費者和嵌入式設(shè)備之間共享的應用程序。(請參閱“Securing wireless J2ME”。)


          developerWorks Wireless technology 專區(qū)包含了 J2ME 相關(guān)技術(shù)的多篇文章和教程。 
          Java 網(wǎng)絡(luò)技術(shù):

          JAIN APIs 是一組基于 Java 的 API,用于快速開發(fā)下一代電信產(chǎn)品和服務。(請參閱 Java 技術(shù)標準。) 



          Java Metadata Interface (JMI) 是實現(xiàn)動態(tài)的、平臺獨立的基礎(chǔ)設(shè)施的規(guī)范,它允許進行元數(shù)據(jù)的創(chuàng)建、存儲、訪問、發(fā)現(xiàn)和交換。該規(guī)范基于 Object Management Group (OMG) 的 Meta Object Facility (MOF) 規(guī)范,由一組使用統(tǒng)一建模語言(Unified Modeling Language,UML)描述的基本建模工件組成。(請參閱 Java 技術(shù)標準。)


          JavaGroups 是一個軟件工具包(API 庫),用于使用分布式系統(tǒng)解決方案進行設(shè)計、實現(xiàn)和實驗。(請參閱“High-impact Web tier clustering, Part 1”和 Part 2。)


          Jini 是一種開放體系結(jié)構(gòu),用于為硬件和軟件創(chuàng)建高適應性的以網(wǎng)絡(luò)為中心的服務。Jini 系統(tǒng)體系結(jié)構(gòu)由三個類別組成:編程模型、基礎(chǔ)設(shè)施和服務。(請參閱“Jini networking technology, the next step”。)


          JXTA 是一組開放協(xié)議,允許網(wǎng)絡(luò)上所有連接設(shè)備以 P2P 方式通信和協(xié)作。JXTA 對等方創(chuàng)建虛擬網(wǎng)絡(luò),任何對等方都可以在其中與其他對等方或資源進行直接交互,甚至當一些對等方和資源位于防火墻或 NAT 后或者位于不同的網(wǎng)絡(luò)傳輸中也是如此。(請參閱“Making P2P interoperable: The JXTA story”。) 
           
           
           到頁首  
           
           
           Java 技術(shù)如何與 Web 服務聯(lián)系起來?  
          Web 服務是一種技術(shù),允許用 XML 定義業(yè)務規(guī)則和過程,這樣軟件應用程序能夠以平臺獨立和編程語言無關(guān)的方式進行通信。XML 技術(shù)使數(shù)據(jù)可以移植,方便了消息創(chuàng)建,而 Java 技術(shù)則使代碼可以移植。事實上,XML 和 Java 語言可以很好地結(jié)合起來,成為構(gòu)建和部署 Web 服務的完美組合。

          了解更多信息:

          developerWorks 的“Web services 新手入門”和“XML 新手入門”頁面將幫助您了解這些復雜的技術(shù)。 
           
           

           
           
           如何提高 Java 編程技能?  
          有兩種途徑可以提高您的技能:選學一門課程(為獲得證書或僅為了學習)或者自學(當然要通過編寫代碼來練習)。除了汲取有經(jīng)驗的開發(fā)人員的知識外,獲取證書途徑還可以向未來的雇主提供確實的證據(jù),證明您擁有構(gòu)建他們要求的技術(shù)所需的技能。通過試驗自己的技能,使用可用資源,您可以在 Java 技術(shù)的不同領(lǐng)域提高您的技能。下列參考資料對以上兩種途徑都應該有幫助。 

          了解更多信息:

          要獲得 Java 語言的全面介紹,Java 語言基礎(chǔ) 教程是個很好的起點。


          如果基本教程看起來有些復雜,您可以嘗試 Robocode。Robocode 是基于 Java 技術(shù)構(gòu)建的易于使用的機器人戰(zhàn)爭模擬程序,它在提供純粹娛樂的同時教您如何編程。要獲得 Robocode 的介紹,請閱讀“重錘痛擊 Robocode!”


          如果您是 C/C++ 編程人員,不熟悉 Java,“Java programming for C/C++ developers”教程通過比較和對照 Java 編程概念和 C/C++ 編程概念,可以幫助您快速入門 Java。


          本文是循序漸進的 幫助您準備 SCJP 考試指南,即 Sun Certified Java Programmer 證書考試。


          IBM 在 WebSphere 開發(fā)(用于企業(yè) Java 應用程序)、DB2、XML、電子商務和 Linux 這些相關(guān)技術(shù)方面提供了 專業(yè)認證。


          如果您沒有聽說過 XP 精華 或 XP,它是一種應用程序設(shè)計理念,它合并了連續(xù)階段測試、在編碼前編寫測試、現(xiàn)場客戶輸入、重構(gòu)(在不更改功能的情況下改進代碼)等,本文可提供用于編寫 Java 應用程序的極好工具。(揭開極端編程的神秘面紗:“XP 精華”重訪,第 2 部分 中詳細描述了如何進行實踐。)


          將設(shè)計理論轉(zhuǎn)換為實際應用程序是 Java 理論與實踐 系列文章的出發(fā)點。


          Java 編程人員知道利用集成 bug 檢測和測試進行程序設(shè)計,所以利用 Java 調(diào)試 提高您的調(diào)試技能。而且,developerWorks 提供了關(guān)于 Java 調(diào)試(重點是稱為 bug 模式的工具)的專欄集,稱為 診斷 Java 代碼。


          developerWorks 提供了大量 基于 Java 的教程,這是下一代自己編寫代碼的最佳學習體驗。


          要獲得更多學習如何使用 Java 語言的交互式方法,請參加 Java 討論區(qū),該論壇由具有多年 Java 相關(guān)技術(shù)開發(fā)經(jīng)驗的著名專家主持。 
           
           
            
           
           
            Java 編程人員可以使用哪些 IBM 工具和產(chǎn)品?  
          作為在 Java 技術(shù)使用方面的一流創(chuàng)新者,IBM 站在了最前線。瀏覽 Java technology downloads and products 頁面可以獲得工具和產(chǎn)品的完整列表。以下提供了一些重要部分。

          了解更多信息:

          軟件開發(fā)工具箱:構(gòu)造應用程序的工具箱,用于各種 Java 相關(guān)技術(shù)的大量工具。下面只是其中的幾個: 
          IBM developer kits for Java technology,用于在一些最普通的 IBM 平臺上創(chuàng)建和測試 Java applet 和應用程序。 
          Agent Building and Learning Environment,用于開發(fā)混合智能軟件代理和代理應用程序。 
          Emerging Technologies Toolkit 在網(wǎng)格計算、異步 Web 服務、業(yè)務流程、自主計算和其他服務中為 Web 服務開發(fā)提供高級工具。 
          Toolkit for MPEG-4,Java 類和帶有簡單應用程序的 API 的集合,用于生成 MPEG-4 內(nèi)容,以便與兼容 MPEG-4 的設(shè)備一起使用。 
          Update Tool,一種使基于 Java 桌面應用程序的用戶可以易于升級的機制。


          Java technology on alphaWorks 是 IBM 生成的 Java 相關(guān)技術(shù)的虛擬倉庫,包括 API、集成開發(fā)環(huán)境和 devkit、組件、參考實現(xiàn)和實用程序。


          WebSphere 系列的 Java 開發(fā)工具: 
          Application Server。 
          Branch Transformation Toolkit for WebSphere Studio,以前稱為 WebSphere Business Components Composer,是一組工具、組件和服務,它們用于加速構(gòu)建訪問事務系統(tǒng)的多通道銀行應用程序。 
          MQ 是允許應用程序相互通信的應用程序編程服務。 
          MQ Everyplace 允許利用確定的消息提供方式訪問移動工作者和遠程設(shè)備的企業(yè)數(shù)據(jù)。 
          Business Integration Message Broker 幫助將信息引向需要它的位置和時間,以及幫助訪問公司數(shù)據(jù),而不管數(shù)據(jù)位于何處,采用何種格式。 
          SDK for Web Services。 
          Studio Site Developer 為構(gòu)建和維護動態(tài) Web 站點、Web 服務和 Java 應用程序提供開發(fā)環(huán)境。 
          Studio Application Developer 是基于 Web 的應用程序的集成開發(fā)環(huán)境。 

          posted @ 2007-11-03 22:01 卓韋 閱讀(620) | 評論 (0)編輯 收藏

          2007年9月25日

          需要下載fileupload和beanutils兩個包,代碼如下。

          實現(xiàn)文件的上傳,代碼如下:
          <%!
           //服務器端保存上傳文件的路徑
              String saveDirectory = "g:\\upload\\";
              // 臨時路徑 一旦文件大小超過getSizeThreshold()的值時數(shù)據(jù)存放在硬盤的目錄
              String tmpDirectory = "g:\\upload\\tmp\\";
              // 最多只允許在內(nèi)存中存儲的數(shù)據(jù)大小,單位:字節(jié)
              int maxPostSize = 1024 * 1024;
          %>
          <%
              // 文件內(nèi)容 
              String FileDescription = null;
              // 文件名(包括路徑)
              String FileName = null;
              // 文件大小
              long FileSize = 0;
              // 文件類型
              String ContentType = null;

          %>

          <%
             DiskFileUpload fu = new DiskFileUpload();
              // 設(shè)置允許用戶上傳文件大小,單位:字節(jié)
             fu.setSizeMax(200*1024*1024);
              // 設(shè)置最多只允許在內(nèi)存中存儲的數(shù)據(jù),單位:字節(jié)
             fu.setSizeThreshold(maxPostSize);
              // 設(shè)置一旦文件大小超過getSizeThreshold()的值時數(shù)據(jù)存放在硬盤的目錄
             fu.setRepositoryPath("g:\\upload\\tmp\\");
              //開始讀取上傳信息 得到所有文件
             try{
                List fileItems = fu.parseRequest(request);
               }catch(FileUploadException e){
                   //這里異常產(chǎn)生的原因可能是用戶上傳文件超過限制、不明類型的文件等
                   //自己處理的代碼
               }
          %>
          <%
             // 依次處理每個上傳的文件
             Iterator iter = fileItems.iterator();
             while (iter.hasNext()) {
               FileItem item = (FileItem) iter.next();
                 //忽略其他不是文件域的所有表單信息
               if (!item.isFormField()) {
                 String name = item.getName();
                 long size = item.getSize();
                 String  contentType = item.getContentType();
               if((name==null||name.equals("")) && size==0)
                 continue;
          %>
          <%
             //保存上傳的文件到指定的目錄
            String[] names=StringUtils.split(name,"\\");  //對原來帶路徑的文件名進行分割
             name = names[names.length-1];
             item.write(new File(saveDirectory+ name));
            }
          }
          %>
           下面是其簡單的使用場景:
           A、上傳項目只要足夠小,就應該保留在內(nèi)存里。
           B、較大的項目應該被寫在硬盤的臨時文件上。
           C、非常大的上傳請求應該避免。
           D、限制項目在內(nèi)存中所占的空間,限制最大的上傳請求,并且設(shè)定臨時文件的位置。
           
           可以根據(jù)具體使用用servlet來重寫,具體參數(shù)配置可以統(tǒng)一放置到一配置文件
           

           文件的下載用servlet實現(xiàn)
                public void doGet(HttpServletRequest request,
                                 HttpServletResponse response)
               {
                   String aFilePath = null;    //要下載的文件路徑
                   String aFileName = null;    //要下載的文件名
                   FileInputStream in = null;  //輸入流
                   ServletOutputStream out = null;  //輸出流

           

                   try
             {
                    
                       aFilePath = getFilePath(request);
                       aFileName = getFileName(request);

                       response.setContentType(getContentType(aFileName) + "; charset=UTF-8");
                       response.setHeader("Content-disposition", "attachment; filename=" + aFileName);

                       in = new  FileInputStream(aFilePath + aFileName); //讀入文件
                      out = response.getOutputStream();
                      out.flush();
                      int aRead = 0;
                     while((aRead = in.read()) != -1 & in != null)
                  {
                       out.write(aRead);
                   }
                     out.flush();
                }
                 catch(Throwable e)
               {
               log.error("FileDownload doGet() IO error!",e);
                }
                   finally
                   {
                       try
                       {
                           in.close();
                           out.close();
                       }
                       catch(Throwable e)
                       {
                        log.error("FileDownload doGet() IO close error!",e);
                       }
                   }
               }



          參考文獻:
          1、用fileupload處理文件上傳
          作者:◇ 劉冬 發(fā)文時間:2003.07.09 15:52:43 ,http://tech.ccidnet.com/pub/disp/Article?columnID=322&articleID=53966&pageNO=1
          講得非常清楚
          2、Jakarta Commons:巧用類和組件1 (2) 作者:Vikram Goyal 仙人掌工作室譯 ,http://www.uml.org.cn/j2ee/j2eeh2.htm

          3、Jsp如何實現(xiàn)網(wǎng)頁的重定向 ,2002-05-16· ·包路躍··Yesky,http://www.yesky.com/SoftChannel/72342371945283584/20020424/1608521.shtml

          4、判斷文件或文件夾是否存在,作者:羅會濤,http://www.fawcette.com/china/XmlFile.aspx?ID=205

          5、java.util中的Date類,By Wing, 出處:處處,http://www.linuxaid.com.cn/articles/1/1/119413536.shtml

          6、計算Java日期--學習怎樣創(chuàng)建和使用日期,作者:Robert Nielsen ,http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=497

          7、http://dev.csdn.net/article/67/67940.shtm

          posted @ 2007-09-25 13:26 卓韋 閱讀(5513) | 評論 (1)編輯 收藏

          Jakarta Commons FileUpload 用戶指南

          本文是分享文檔站長胡蘿卜的作品。大家可以自由閱讀、在網(wǎng)絡(luò)上進行分發(fā),前提是必須保留本文檔的完整性。
          分享文檔是一家專業(yè)的Java技術(shù)網(wǎng)站,給中國Java 程序員提供各種Java資源如文檔,工具,教程,社區(qū)交流等。
          我們的官方網(wǎng)站是:http://chinesedocument.com
          我們的官方論壇是:http://bbs.chinesedocument.com
          請大家多多關(guān)注分享文檔,我們還會發(fā)布更多優(yōu)秀的文檔!

          第1章 使用FileUpload
          FileUpload能以多種方式使用,這取決于你的應用需求。舉個簡單的例子,你可能調(diào)用一個單獨的方法來解析servelt的請求,并且處理那些項目。 從另一個方面來講,你可能想自定義FileUpload來完全控制個別項目的存貯;例如,你想流化那些內(nèi)容,并存到數(shù)據(jù)庫里去。
          這里我們會介紹使用FileUpload的基礎(chǔ)原則,并描述一些簡單的通用的使用模式。我們會在在其它地方介紹關(guān)于FileUpload的自定義。
          FileUpload依賴于一些公用的IO,因此,要確保在你繼續(xù)之前,你的classpath里已經(jīng)有依賴頁面里提起的那些版本。


          第2章 FileUpload如何工作?
          一個上傳請求由一系列根據(jù)RFC1867("Form-based File Upload in HTML".)編碼的項目列表組成。FileUpload可以解析這樣的請求,并為你的應用提供那些已上傳的項目的列表。每一個這樣的項目都實現(xiàn)了FielItem接口,我們不用管它們的底層實現(xiàn)。
          這個頁面描述了commons fileupload庫的常用API。這些常用API是非常方便的途徑。然而,為了最好的性能,你可能更喜歡最快的Streaming API 。
          每一個文件項目有一些自己的屬性,這些屬性也許正是你的應用程序感興趣的地方。例如,每個項目有個一個名字和內(nèi)容類型,并且可以提供一個輸入流來訪問它們的數(shù)據(jù)。另一方面來看,你可能需要用不同方式來處理不同的項目,這就依賴于那些項目是否是一個正常的表單字域,也就是說,這些數(shù)據(jù)來自于一個普通的文本框或類似HTML的字域,還是一個要上傳文件字段。FileItem接口提供一些方法來做這樣一個決定,并且用最合適的方法訪問這些數(shù)據(jù)。
          FileUpload使用FileItemFactory創(chuàng)建一個新的文件項目。這將會給FileUpload最好的靈活性。工廠最終控制每個項目如何被創(chuàng)建。默認的工廠在內(nèi)存或者硬盤里存儲項目的數(shù)據(jù),這依賴于項目的大小(例如,有多少字節(jié)的數(shù)據(jù)。)。不過,為了適用于你的應用,你還是可以自定義這種行為的。


          第3章 servlets and portlets
          從V1.1版開始,F(xiàn)ileUpload就開始支持servlet和portlet的文件上傳請求。這兩種環(huán)境的用法基本上差不多,因此,文檔的剩下部分都將是在servlet環(huán)境里。
          如果你正在構(gòu)建一個portet應用,那么下面兩個差別是你在讀文檔時應注意的:
          你在哪里引用了ServletFileUpload類,就用PortletFileUpload類來替代它。
          你在哪里引用了HttpServletRequest類,就用ActionRequest類替代它。


          第4章 解析請求
          在你同那些上傳的項目一起工作前,你需要先解析請求本身。以確保這個請求確實是一個文件上傳請求。FileUpload是通過調(diào)用一個靜態(tài)方法來實現(xiàn)的。
          // Check that we have a file upload request
          boolean isMultipart = ServletFileUpload.isMultipartContent(request);
          現(xiàn)在,我們已經(jīng)準備好解析請求里的項目了。

          4.1 最簡單的例子
          下面是一些簡單的使用場景:
          ??   上傳項目只要足夠小,就應該保留在內(nèi)存里。
          ??   較大的項目應該被寫在硬盤的臨時文件上。
          ??   非常大的上傳請求應該避免。
          ??   限制項目在內(nèi)存中所占的空間,限制最大的上傳請求,并且設(shè)定臨時文件的位置。
          處理這個場景的請求很簡單:
          // Create a factory for disk-based file items
          FileItemFactory factory = new DiskFileItemFactory();
          // Create a new file upload handler
          ServletFileUpload upload = new ServletFileUpload(factory);
          // Parse the request
          List /* FileItem */ items = upload.parseRequest(request);
          這就是我們所需要的全部代碼了!
          解析的結(jié)果就是一個項目的List,每個項目都實現(xiàn)了FileItem接口。我們將在下面討論如何處理這些項目。
          4.2 訓練如何控制
          如果你的使用場景和上面那個簡單的例子很接近,但是你又需要一點點控制,那么你可以很容易地定義upload處理器或者文件項目工廠的行為。下面這個例子顯示了幾個配置選項。
          // Create a factory for disk-based file items
          DiskFileItemFactory factory = new DiskFileItemFactory();
          // Set factory constraints
          factory.setSizeThreshold(yourMaxMemorySize);
          factory.setRepository(yourTempDirectory);
          // Create a new file upload handler
          ServletFileUpload upload = new ServletFileUpload(factory);
          // Set overall request size constraint
          upload.setSizeMax(yourMaxRequestSize);
          // Parse the request
          List /* FileItem */ items = upload.parseRequest(request);
          當然,每個配置方法是獨立于其它任意一個的。但是如果你想一次性配置他們,你可以用parseRequest()的另一個重載方法,像這樣:
          // Create a factory for disk-based file items
          DiskFileItemFactory factory = new DiskFileItemFactory(
          yourMaxMemorySize, yourTempDirectory);
          如果你還想使用更多的控制,比如存儲項目到其它地方(如,數(shù)據(jù)庫),那么你可以看FileUpload自定義介紹。


          第5章 處理上傳的項目
          一旦解析完成,那么你會得到一個待處理的文件項目列表。很多的情況下,你會想用不同的方式來處理文件上傳域和正常的表單域,因此,你可以這樣做:
          // Process the uploaded items
          Iterator iter = items.iterator();
          while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField()) {
              processFormField(item);
            } else {
              processUploadedFile(item);
            }
          }
          對于普通的表單域來說,你可能對項目的名稱和字符型值 很感興趣。就像你希望的那樣,照下面的做:
          // Process a regular form field
          if (item.isFormField()) {
            String name = item.getFieldName();
            String value = item.getString();
            ...
          }
          對于上傳文件,這里就有很多不同啦~你可能想知道更多其它的內(nèi)容。下面是個例子,里面包含了不少你感興趣的方法。
          // Process a file upload
          if (!item.isFormField()) {
            String fieldName = item.getFieldName();
            String fileName = item.getName();
            String contentType = item.getContentType();
            boolean isInMemory = item.isInMemory();
            long sizeInBytes = item.getSize();
            ...
          }
          對于上傳的文件,你肯定不希望總是通過內(nèi)存來訪問它,除非它很小,或者你實在沒有別的選擇余地了。你很希望使用流來處理文件內(nèi)容或者將文件保存到它的最終位置。FileUpload提供簡單的方式來完成兩方面的需求。
          // Process a file upload
          if (writeToFile) {
            File uploadedFile = new File(...);
            item.write(uploadedFile);
          } else {
            InputStream uploadedStream = item.getInputStream();
            ...
            uploadedStream.close();
          }
          注意:在FileUpload的默認實現(xiàn)中wirte()方法應該值得關(guān)注,如果數(shù)據(jù)還在臨時文件里沒有移除,那么這個方法就會試圖重命名這個文件為相應的目標文件。事實上如果重命名失敗了的話,數(shù)據(jù)就僅僅被拷貝。
          如果你需要訪問內(nèi)存中的上傳數(shù)據(jù),你可以用get()方法來獲得數(shù)據(jù)的二進制數(shù)組形式。
          // Process a file upload in memory
          byte[] data = item.get();
          ...

          第6章 清除資源
          這一節(jié)只適用于你使用了DiskFileItem。換句話說,它只適用于你在處理上傳文件之前將上傳文件寫入過臨時文件這種情形。
          像這種臨時文件會被自動刪除, 如果它們不再被使用(更確切地說,java.io.File的實例已經(jīng)被GC掉了。 )這是由org.apache.commons.io.FileCleaner類在后臺完成的,它會啟動一個收割機線程。
          這個收割機線程在它不再被需要時會被停止。在servlet環(huán)境里,這是通過指定一個名叫FileCleanerCleanup的servlet上下文監(jiān)聽器來實現(xiàn)的。要做到這里,在你的web.xml增加下面的代碼:
          <web-app>
          ...
          <listener>
          <listener-class>
          org.apache.commons.fileupload.servlet.FileCleanerCleanup
          </listener-class>
          </listener>
          ...
          </web-app>
          不幸的是,事情到這里還沒完。如果你和下面的情況一樣,那么你就只需要按照上面的做,就可以清除資源了。
          你使用的是commons-io 1.3或者更晚的版本。
          你是從web應用的web-inf/lib里載入commons-io的,并不是從其它位置,如Tomcat的common/lib下。
          如果commons-io 1.3是從你的WEB容器的classpath里載入的,那么,下面的情況可能會出現(xiàn):
          建議你運行兩個應用,一個叫A,一個叫B。(這兩個應用可能是完全一樣,只不過上下文名稱不一樣。)這兩個應用都使用了FileCleanerCleanup。現(xiàn)在,如果你終止應用A,B還在運行,這時,A會終止B的收割機線程。換言之,你要十分仔細地考慮是使用FileCleanerCleanup,還是不使用。

          第7章 觀察上傳進度
          如果你希望可以上傳很大的文件,這時,你可能想將上傳的狀態(tài)告訴用戶,如已經(jīng)接收了多少。
          觀察上傳進度需要通過一個處理監(jiān)聽器來實現(xiàn)。
          //Create a progress listener
          ProgressListener progressListener = new ProgressListener(){
            public void update(long pBytesRead, long pContentLength, int pItems) {
              System.out.println("We are currently reading item " + pItems);
              if (pContentLength == -1) {
                System.out.println("So far, " + pBytesRead + " bytes have been read.");
              } else {
                System.out.println("So far, " + pBytesRead + " of " + pContentLength
                + " bytes have been read.");
              }
            }
          };
          upload.setProgressListener(progressListener);
          上面這個監(jiān)聽器是有問題的。因為它非常頻繁地被調(diào)用。這會帶來性能問題。一個比較好的解決辦法是,減少調(diào)用。例如,如果megabytes被改變,那么就發(fā)出一個消息。
          //Create a progress listener
          ProgressListener progressListener = new ProgressListener(){
            private long megaBytes = -1;
            public void update(long pBytesRead, long pContentLength, int pItems) {
              long mBytes = pBytesRead / 1000000;
              if (megaBytes == mBytes) {
                return;
              }
              megaBytes = mBytes;
              System.out.println("We are currently reading item " + pItems);
              if (pContentLength == -1) {
                System.out.println("So far, " + pBytesRead + " bytes have been read.");
              } else {
                System.out.println("So far, " + pBytesRead + " of " + pContentLength
                + " bytes have been read.");
              }
            }
          };

          posted @ 2007-09-25 13:15 卓韋 閱讀(682) | 評論 (0)編輯 收藏

          2007年9月24日

               摘要: Java 文件上傳 java文件上傳,介紹幾種常用的方法,也是經(jīng)過本人親手調(diào)試過的 1.jspsmartupload 這個組件用起來是挺方便的,不過就是只適合小文件上傳,如果大文件上傳的話就不行,查看了一下他的代碼,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];...  閱讀全文

          posted @ 2007-09-24 22:59 卓韋 閱讀(8669) | 評論 (1)編輯 收藏

          2007年9月23日

          配置文件

          介紹
              每個 Linux 程序都是一個可執(zhí)行文件,它含有操作碼列表,CPU 將執(zhí)行這些操作碼來完成特定的操作。例如,ls 命令是由 /bin/ls 文件提供的,該文件含有機器指令的列表,在屏幕上顯示當前目錄中文件的列表時需要使用這些機器指令。幾乎每個程序的行為都可以通過修改其配置文件來按照您的偏好或需要去定制。

          Linux 中有沒有一個標準的配置文件格式?
              一句話,沒有。不熟悉 Linux 的用戶(一定)會感到沮喪,因為每個配置文件看起來都象是一個要迎接的新挑戰(zhàn)。在 Linux 中,每個程序員都可以自由選擇他或她喜歡的配置文件格式。可以選擇的格式很多,從 /etc/shells 文件(它包含被一個換行符分開的 shell 的列表),到 Apache 的復雜的 /etc/httpd.conf 文件。

          什么是系統(tǒng)配置文件?
              內(nèi)核本身也可以看成是一個“程序”。為什么內(nèi)核需要配置文件?內(nèi)核需要了解系統(tǒng)中用戶和組的列表,進而管理文件權(quán)限(即根據(jù)權(quán)限判定特定用戶(UNIX_USERS)是否可以打開某個文件)。注意,這些文件不是明確地由程序讀取的,而是由系統(tǒng)庫所提供的一個函數(shù)讀取,并被內(nèi)核使用。例如,程序需要某個用戶的(加密過的)密碼時不應該打開 /etc/passwd 文件。相反,程序應該調(diào)用系統(tǒng)庫的 getpw() 函數(shù)。這種函數(shù)也被稱為系統(tǒng)調(diào)用。打開 /etc/passwd 文件和之后查找那個被請求的用戶的密碼都是由內(nèi)核(通過系統(tǒng)庫)決定的。

              除非另行指定,Red Hat Linux 系統(tǒng)中大多數(shù)配置文件都在 /etc 目錄中。

          更改配置文件
              在更改配置文件時,如果程序不是由系統(tǒng)管理員或內(nèi)核控制的,就要確保重新啟動過使用該配置的程序。普通用戶通常沒有啟動或停止系統(tǒng)程序和/或守護進程的權(quán)限。

          內(nèi)核
              更改內(nèi)核中的配置文件會立即影響到系統(tǒng)。例如,更改 passwd 文件以增加用戶將立即使該用戶變?yōu)榭捎谩6胰魏?nbsp;Linux 系統(tǒng)的 /proc/sys 目錄中都有一些內(nèi)核可調(diào)參數(shù)。只有超級用戶可以得到對所有這些文件的寫訪問權(quán)力;其它用戶只有只讀訪問權(quán)力。此目錄中文件的分類的方式和 Linux 內(nèi)核源代碼的分類方式一樣。此目錄中的每個文件都代表一個內(nèi)核數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)可以被動態(tài)地修改,從而改變系統(tǒng)性能。
          注意:在更改其中任何文件的任何值之前,您應該確保自己全面了解該文件,以避免對系統(tǒng)造成不可修復的損害。

          /proc/sys/kernel/ 目錄中的文件

          文件名 描述
          threads-max 內(nèi)核可運行的最大任務數(shù)。
          ctrl-alt-del 如果值為 1,那么順序按下這幾個鍵將“徹底地”重新引導系統(tǒng)。
          sysrq 如果值為 1,Alt-SysRq 則為激活狀態(tài)。
          osrelease 顯示操作系統(tǒng)的發(fā)行版版本號
          ostype 顯示操作系統(tǒng)的類型。
          hostname 系統(tǒng)的主機名。
          domainname 網(wǎng)絡(luò)域,系統(tǒng)是該網(wǎng)絡(luò)域的一部分。
          modprobe 指定 modprobe 是否應該在啟動時自動運行并加載必需的模塊。


          守護進程和系統(tǒng)程序
              守護進程是永遠運行在后臺的程序,它默默地執(zhí)行自己的任務。常見的守護進程有 in.ftpd(ftp 服務器守護進程)、in.telnetd(telnet 服務器守護進程)和 syslogd(系統(tǒng)日志記錄守護進程)。有些守護進程在運行時會嚴密監(jiān)視配置文件,在配置文件改變時就會自動重新加載它。但是大多數(shù)守護進程并不會自動重新加載配置文件。我們需要以某種方式“告訴”這些守護進程配置文件已經(jīng)被發(fā)生了改變并應該重新加載。可以通過使用服務命令重新啟動服務來達到這個目的(在 Red Hat Linux 系統(tǒng)上)。

              例如,如果我們更改了網(wǎng)絡(luò)配置,就需要發(fā)出:
              service network restart。

              注意:這些服務最常見的是 /etc/rc.d/init.d/* 目錄中存在的腳本,在系統(tǒng)被引導時由 init 啟動。所以,您也可以執(zhí)行如下操作來重新啟動服務:
                  /etc/rc.d/init.d/<script-for-the-service> start | stop | status
                  start、stop 和 status 是這些腳本接受的輸入值,用來執(zhí)行操作。
          [目錄]

          主機

          /etc/host.conf
              告訴網(wǎng)絡(luò)域名服務器如何查找主機名。(通常是 /etc/hosts,然后就是名稱服務器;可通過 netconf 對其進行更改)

          /etc/hosts
              包含(本地網(wǎng)絡(luò)中)已知主機的一個列表。如果系統(tǒng)的 IP 不是動態(tài)生成,就可以使用它。對于簡單的主機名解析(點分表示法),在請求 DNS 或 NIS 網(wǎng)絡(luò)名稱服務器之前,/etc/hosts.conf 通常會告訴解析程序先查看這里。

          /etc/hosts.allow
              請參閱 hosts_access 的聯(lián)機幫助頁。至少由 tcpd 讀取。

          /etc/hosts.deny
              請參閱 hosts_access 的聯(lián)機幫助頁。至少由 tcpd 讀取。


          [目錄]

          引導和登錄注銷

          /etc/issue & /etc/issue.net
              這些文件由 mingetty(和類似的程序)讀取,用來向從終端(issue)或通過 telnet 會話(issue.net)連接的用戶顯示一個“welcome”字符串。它們包括幾行聲明 Red Hat 版本號、名稱和內(nèi)核 ID 的信息。它們由 rc.local 使用。

          /etc/redhat-release
              包括一行聲明 Red Hat 版本號和名稱的信息。由 rc.local 使用。

          /etc/rc.d/rc
              通常在所有運行級別運行,級別作為參數(shù)傳送。例如,要以圖形(Graphics)模式(X-Server)引導機器,請在命令行運行下面的命令:init 5。運行級別 5 表示以圖形模式引導系統(tǒng)。
          /etc/rc.d/rc.local
              非正式的。可以從 rc、rc.sysinit 或 /etc/inittab 調(diào)用。

          /etc/rc.d/rc.sysinit
              通常是所有運行級別的第一個腳本。

          /etc/rc.d/rc/rcX.d
              從 rc 運行的腳本(X 表示 1 到 5 之間的任意數(shù)字)。這些目錄是特定“運行級別”的目錄。當系統(tǒng)啟動時,它會識別要啟動的運行級別,然后調(diào)用該運行級別的特定目錄中存在的所有啟動腳本。例如,系統(tǒng)啟動時通常會在引導消息之后顯示“entering run-level 3”的消息;這意味著 /etc/rc.d/rc3.d/ 目錄中的所有初始化腳本都將被調(diào)用。


          [目錄]

          文件系統(tǒng)

          /proc
              內(nèi)核提供了一個接口,用來顯示一些它的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對于決定諸如使用的中斷、初始化的設(shè)備和內(nèi)存統(tǒng)計信息之類的系統(tǒng)參數(shù)可能很有用。這個接口是作為一個獨立但虛擬的文件系統(tǒng)提供的,稱為 /proc 文件系統(tǒng)。很多系統(tǒng)實用程序都使用這個文件系統(tǒng)中存在的值來顯示系統(tǒng)統(tǒng)計信息。
              例如,/proc/modules 文件列舉系統(tǒng)中當前加載的模塊。lsmod 命令讀取此信息,然后將其以人們可以看懂的格式顯示出來。下面表格中指定的 mtab 文件以同樣的方式讀取包含當前安裝的文件系統(tǒng)的 /proc/mount 文件。

          /etc/mtab
              這將隨著 /proc/mount 文件的改變而不斷改變。換句話說,文件系統(tǒng)被安裝和卸載時,改變會立即反映到此文件中。

          /etc/fstab
              列舉計算機當前“可以安裝”的文件系統(tǒng)。這非常重要,因為計算機引導時將運行 mount -a 命令,該命令負責安裝 fstab 的倒數(shù)第二列中帶有“1”標記的每一個文件系統(tǒng)。

          /etc/mtools.conf
              DOS 類型的文件系統(tǒng)上所有操作(創(chuàng)建目錄、復制、格式化等等)的配置。


          [目錄]

          系統(tǒng)管理

          /etc/group
              包含有效的組名稱和指定組中包括的用戶。單一用戶如果執(zhí)行多個任務,可以存在于多個組中。例如,如果一個“用戶”是“project 1”工程組的成員,同時也是管理員,那么在 group 文件中他的條目看起來就會是這樣的:user: * : group-id : project1

          /etc/nologin
              如果有 /etc/nologin 文件存在,login(1) 將只允許 root 用戶進行訪問。它將對其它用戶顯示此文件的內(nèi)容并拒絕其登錄。

          /etc/passwd
              請參閱“man passwd”。它包含一些用戶帳號信息,包括密碼(如果未被 shadow 程序加密過)。

          /etc/rpmrc
              rpm 命令配置。所有的 rpm 命令行選項都可以在這個文件中一起設(shè)置,這樣,當任何 rpm 命令在該系統(tǒng)中運行時,所有的選項都會全局適用。

          /etc/securetty
              包含設(shè)備名稱,由 tty 行組成(每行一個名稱,不包括前面的 /dev/),root 用戶在這里被允許登錄。

          /etc/usertty

          /etc/shadow
              包含加密后的用戶帳號密碼信息,還可以包括密碼時效信息。包括的字段有:
                  ·登錄名
                  ·加密后的密碼
                  ·從 1970 年 1 月 1 日到密碼最后一次被更改的天數(shù)
                  ·距密碼可以更改之前的天數(shù) 
           ·距密碼必須更改之前的天數(shù)
                  ·密碼到期前用戶被警告的天數(shù)
                  ·密碼到期后帳戶被禁用的天數(shù)
                  ·從 1970 年 1 月 1 日到帳號被禁用的天數(shù)

          /etc/shells
              包含系統(tǒng)可用的可能的“shell”的列表。

          /etc/motd
              每日消息;在管理員希望向 Linux 服務器的所有用戶傳達某個消息時使用。


          [目錄]

          網(wǎng)絡(luò)

          /etc/gated.conf gated 的配置。
              只能被 gated 守護進程所使用。

          /etc/gated.version
              包含 gated 守護進程的版本號。

          /etc/gateway
              由 routed 守護進程可選地使用。

          /etc/networks
              列舉從機器所連接的網(wǎng)絡(luò)可以訪問的網(wǎng)絡(luò)名和網(wǎng)絡(luò)地址。通過路由命令使用。允許使用網(wǎng)絡(luò)名稱。

          /etc/protocols
              列舉當前可用的協(xié)議。請參閱 NAG(網(wǎng)絡(luò)管理員指南,Network Administrators Guide)和聯(lián)機幫助頁。C 接口是 getprotoent。絕不能更改。

          /etc/resolv.conf
              在程序請求“解析”一個 IP 地址時告訴內(nèi)核應該查詢哪個名稱服務器。

          /etc/rpc
              包含 RPC 指令/規(guī)則,這些指令/規(guī)則可以在 NFS 調(diào)用、遠程文件系統(tǒng)安裝等中使用。

          /etc/exports
              要導出的文件系統(tǒng)(NFS)和對它的權(quán)限。

          /etc/services
              將網(wǎng)絡(luò)服務名轉(zhuǎn)換為端口號/協(xié)議。由 inetd、telnet、tcpdump 和一些其它程序讀取。有一些 C 訪問例程。

          /etc/inetd.conf
              inetd 的配置文件。請參閱 inetd 聯(lián)機幫助頁。包含每個網(wǎng)絡(luò)服務的條目,inetd 必須為這些網(wǎng)絡(luò)服務控制守護進程或其它服務。注意,服務將會運行,但在 /etc/services 中將它們注釋掉了,這樣即使這些服務在運行也將不可用。格式為:<service_name> <sock_type> <proto> <flags> <user> <server_path> <args>

          /etc/sendmail.cf
              郵件程序 sendmail 的配置文件。比較隱晦,很難理解。

          /etc/sysconfig/network
              指出 NETWORKING=yes 或 no。至少由 rc.sysinit 讀取。

          /etc/sysconfig/network-scripts/if*
              Red Hat 網(wǎng)絡(luò)配置腳本。


          [目錄]

          系統(tǒng)命令

              系統(tǒng)命令要獨占地控制系統(tǒng),并讓一切正常工作。所有如 login(完成控制臺用戶身份驗證階段)或 bash(提供用戶和計算機之間交互)之類的程序都是系統(tǒng)命令。因此,和它們有關(guān)的文件也特別重要。這一類別中有下列令用戶和管理員感興趣的文件。

          /etc/lilo.conf
              包含系統(tǒng)的缺省引導命令行參數(shù),還有啟動時使用的不同映象。您在 LILO 引導提示的時候按 Tab 鍵就可以看到這個列表。

          /etc/logrotate.conf
              維護 /var/log 目錄中的日志文件。

          /etc/identd.conf
              identd 是一個服務器,它按照 RFC 1413 文檔中指定的方式實現(xiàn) TCP/IP 提議的標準 IDENT 用戶身份識別協(xié)議。identd 的操作原理是查找特定 TCP/IP 連接并返回擁有此連接的進程的用戶名。作為選擇,它也可以返回其它信息,而不是用戶名。請參閱 identd 聯(lián)機幫助頁。
          /etc/ld.so.conf
              “動態(tài)鏈接程序”(Dynamic Linker)的配置。

          /etc/inittab
              按年代來講,這是 UNIX 中第一個配置文件。在一臺 UNIX 機器打開之后啟動的第一個程序是 init,它知道該啟動什么,這是由于 inittab 的存在。在運行級別改變時,init 讀取 inittab,然后控制主進程的啟動。

          /etc/termcap
              一個數(shù)據(jù)庫,包含所有可能的終端類型以及這些終端的性能。


          [目錄]

          守護進程

              守護進程是一種運行在非交互模式下的程序。一般來說,守護進程任務是和聯(lián)網(wǎng)區(qū)域有關(guān)的:它們等待連接,以便通過連接提供服務。Linux 可以使用從 Web 服務器到 ftp 服務器的很多守護進程。

          /etc/syslogd.conf
              syslogd 守護進程的配置文件。syslogd 是一種守護進程,它負責記錄(寫到磁盤)從其它程序發(fā)送到系統(tǒng)的消息。這個服務尤其常被某些守護進程所使用,這些守護進程不會有另外的方法來發(fā)出可能有問題存在的信號或向用戶發(fā)送消息。

          /etc/httpd.conf
              Web 服務器 Apache 的配置文件。這個文件一般不在 /etc 中。它可能在 /usr/local/httpd/conf/ 或 /etc/httpd/conf/ 中,但是要確定它的位置,您還需要檢查特定的 Apache 安裝信息。

          /etc/conf.modules or /etc/modules.conf
              kerneld 的配置文件。有意思的是,kerneld 并不是“作為守護進程的”內(nèi)核。它其實是一種在需要時負責“快速”加載附加內(nèi)核模塊的守護進程。


          [目錄]

          用戶程序

              在 Linux(和一般的 UNIX)中,有無數(shù)的“用戶”程序。最常見的一種用戶程序配置文件是 /etc/lynx.cfg。這是著名的文本瀏覽器 lynx 的配置文件。通過這個文件,您可以定義代理服務器、要使用的字符集等等。下面的代碼樣本展示了 lynx.cfg 文件的一部分,修改這部分代碼可以改變 Linux 系統(tǒng)的代理服務器設(shè)置。缺省情況下,這些設(shè)置適用于在各自的 shell 中運行 lynx 的所有用戶,除非某個用戶通過指定 --cfg = "mylynx.cfg" 重設(shè)了缺省的配置文件。

          /etc/lynx.cfg 中的代理服務器設(shè)置

          .h1 proxy
          .h2 HTTP_PROXY
          .h2 HTTPS_PROXY
          .h2 FTP_PROXY
          .h2 GOPHER_PROXY
          .h2 NEWS_PROXY
          .h2 NNTP_PROXY
          # Lynx version 2.2 and beyond supports the use of proxy servers that can act as
          # firewall gateways and caching servers. They are preferable to the older
          # gateway servers. Each protocol used by Lynx can be mapped separately using
          # PROTOCOL_proxy environment variables (see Lynx Users Guide). If you have
          # not set them externally, you can set them at run time via this configuration file.
          # They will not override external settings. The no_proxy variable can be used
          # to inhibit proxying to selected regions of the Web (see below). Note that on
          http://os.rdxx.com/Linux/2005-9/13/175108935_6.shtml

          posted @ 2007-09-23 20:40 卓韋 閱讀(223) | 評論 (0)編輯 收藏

          1. 先從網(wǎng)上下載jdk(jdk-1_5_0_02-linux-i586.rpm) ,推薦SUN的官方網(wǎng)站www.sun.com,下載后放在/home目錄中,當然其它地方也行。
          進入安裝目錄
          #cd /home
          #cp jdk-1_5_0_02-linux-i586.rpm /usr/local
          #cd /usr/local
          給所有用戶添加可執(zhí)行的權(quán)限
          #chmod +x jdk-1_5_0_02-linux-i586.rpm.bin
          #./jdk-1_5_0_02-linux-i586.rpm.bin
          此時會生成文件jdk-1_5_0_02-linux-i586.rpm,同樣給所有用戶添加可執(zhí)行的權(quán)限
          #chmod +x jdk-1_5_0_02-linux-i586.rpm
          安裝程序
          #rpm -ivh jdk-1_5_0_02-linux-i586.rpm
          出現(xiàn)安裝協(xié)議等,按<Enter>接受即可。

          2.設(shè)置環(huán)境變量。
          #vi /etc/profile
          在最后面加入 
          #set java environment
          JAVA_HOME=/usr/java/jdk-1_5_0_02
          CLASSPATH=.:$JAVA_HOME/lib.tools.jar
          PATH=$JAVA_HOME/bin:$PATH
          export JAVA_HOME CLASSPATH PATH
          保存退出。

          要使JDK在所有的用戶中使用,可以這樣:
          vi /etc/profile.d/java.sh
          在新的java.sh中輸入以下內(nèi)容: 
          #set java environment
          JAVA_HOME=/usr/java/jdk-1_5_0_02
          CLASSPATH=.:$JAVA_HOME/lib.tools.jar
          PATH=$JAVA_HOME/bin:$PATH
          export JAVA_HOME CLASSPATH PATH
          保存退出,然后給java.sh分配權(quán)限:chmod 755 /etc/profile.d/java.sh

          3.在終端使用echo命令檢查環(huán)境變量設(shè)置情況。
          #echo $JAVA_HOME
          #echo $CLASSPATH
          #echo $PATH

          4.檢查JDK是否安裝成功。
          #java -version
          如果看到JVM版本及相關(guān)信息,即安裝成功!


          posted @ 2007-09-23 19:36 卓韋 閱讀(240) | 評論 (0)編輯 收藏

          2007年8月15日

          select node_num,report_time from app_standard where app_id='dzyy' and report_time between '2007-1-1' and '2008-1-1' order by report_time desc

          posted @ 2007-08-15 19:42 卓韋 閱讀(551) | 評論 (0)編輯 收藏

          2007年8月14日

               摘要: XSDL(XML Schema定義語言)由元素、屬性、命名空間和XML文檔種的其他節(jié)點構(gòu)成的。 一、XSD中的元素   XSD文檔至少要包含:schema根元素和XML模式命名空間的定義、元素定義。 1、schema根元素語法如下: <xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”&g...  閱讀全文

          posted @ 2007-08-14 16:06 卓韋 閱讀(3575) | 評論 (0)編輯 收藏

          正則表達式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”)。模式描述在搜索文本時要匹配的一個或多個字符串。

          下面是正則表達式的一些示例:

          表達式 匹配
          /^\s*$/ 匹配空行。
          /\d{2}-\d{5}/ 驗證由兩位數(shù)字、一個連字符再加 5 位數(shù)字組成的 ID 號。
          /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 標記。

          下表包含了元字符的完整列表以及它們在正則表達式上下文中的行為:

          字符 說明
          \ 將下一字符標記為特殊字符、文本、反向引用或八進制轉(zhuǎn)義符。例如,“n”匹配字符“n”。“\n”匹配換行符。序列“\\”匹配“\”,“\(”匹配“(”。
          ^ 匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 還會與“\n”或“\r”之后的位置匹配。
          $ 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會與“\n”或“\r”之前的位置匹配。
          * 零次或多次匹配前面的字符或子表達式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。
          + 一次或多次匹配前面的字符或子表達式。例如,“zo+”與“zo”和“zoo”匹配,但與“z”不匹配。+ 等效于 {1,}。
          ? 零次或一次匹配前面的字符或子表達式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。
          {n} n 是非負整數(shù)。正好匹配 n 次。例如,“o{2}”與“Bob”中的“o”不匹配,但與“food”中的兩個“o”匹配。
          {n,} n 是非負整數(shù)。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。'o{1,}' 等效于 'o+'。'o{0,}' 等效于 'o*'。
          {n,m} mn 是非負整數(shù),其中 n <= m。至少匹配 n 次,至多匹配 m 次。例如,“o{1,3}”匹配“fooooood”中的頭三個 o。'o{0,1}' 等效于 'o?'。注意:您不能將空格插入逗號和數(shù)字之間。
          ? 當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式是“非貪心的”。“非貪心的”模式匹配搜索到的、盡可能短的字符串,而默認的“貪心的”模式匹配搜索到的、盡可能長的字符串。例如,在字符串“oooo”中,“o+?”只匹配單個“o”,而“o+”匹配所有“o”。
          . 匹配除“\n”之外的任何單個字符。若要匹配包括“\n”在內(nèi)的任意字符,請使用諸如“[\s\S]”之類的模式。
          (pattern) 匹配 pattern 并捕獲該匹配的子表達式。可以使用 $0...$9 屬性從結(jié)果“匹配”集合中檢索捕獲的匹配。若要匹配括號字符 ( ),請使用“\(”或者“\)”。
          (?:pattern) 匹配 pattern 但不捕獲該匹配的子表達式,即它是一個非捕獲匹配,不存儲供以后使用的匹配。這對于用“或”字符 (|) 組合模式部件的情況很有用。例如,與“industry|industries”相比,“industr(?:y| ies)”是一個更加經(jīng)濟的表達式。
          (?=pattern) 執(zhí)行正向預測先行搜索的子表達式,該表達式匹配處于匹配 pattern 的字符串的起始點的字符串。它是一個非捕獲匹配,即不能捕獲供以后使用的匹配。例如,“Windows (?=95| 98| NT| 2000)”與“Windows 2000”中的“Windows”匹配,但不與“Windows 3.1”中的“Windows”匹配。預測先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預測先行的字符后。
          (?!pattern) 執(zhí)行反向預測先行搜索的子表達式,該表達式匹配不處于匹配 pattern 的字符串的起始點的搜索字符串。它是一個非捕獲匹配,即不能捕獲供以后使用的匹配。例如,“Windows (?!95| 98| NT| 2000)”與“Windows 3.1”中的“Windows”匹配,但不與“Windows 2000”中的“Windows”匹配。預測先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預測先行的字符后。
          x| y xy 匹配。例如,“z| food”與“z”或“food”匹配。“(z| f)ood”與“zood”或“food”匹配。
          [xyz] 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。
          [^xyz] 反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。
          [a-z] 字符范圍。匹配指定范圍內(nèi)的任何字符。例如,“[a-z]”匹配“a”到“z”范圍內(nèi)的任何小寫字母。
          [^a-z] 反向范圍字符。匹配不在指定的范圍內(nèi)的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范圍內(nèi)的任何字符。
          \b 匹配一個字邊界,即字與空格間的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。
          \B 非字邊界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。
          \cx 匹配由 x 指示的控制字符。例如,\cM 匹配一個 Control-M 或回車符。x 的值必須在 A-Z 或 a-z 之間。如果不是這樣,則假定 c 就是“c”字符本身。
          \d 數(shù)字字符匹配。等效于 [0-9]。
          \D 非數(shù)字字符匹配。等效于 [^0-9]。
          \f 換頁符匹配。等效于 \x0c 和 \cL。
          \n 換行符匹配。等效于 \x0a 和 \cJ。
          \r 匹配一個回車符。等效于 \x0d 和 \cM。
          \s 匹配任何空白字符,包括空格、制表符、換頁符等。與 [ \f\n\r\t\v] 等效。
          \S 匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。
          \t 制表符匹配。與 \x09 和 \cI 等效。
          \v 垂直制表符匹配。與 \x0b 和 \cK 等效。
          \w 匹配任何字類字符,包括下劃線。與“[A-Za-z0-9_]”等效。
          \W 任何非字字符匹配。與“[^A-Za-z0-9_]”等效。
          \xn 匹配 n,此處的 n 是一個十六進制轉(zhuǎn)義碼。十六進制轉(zhuǎn)義碼必須正好是兩位數(shù)長。例如,“\x41”匹配“A”。“\x041”與“\x04”&“1”等效。允許在正則表達式中使用 ASCII 代碼。
          \num 匹配 num,此處的 num 是一個正整數(shù)。到捕獲匹配的反向引用。例如,“(.)\1”匹配兩個連續(xù)的相同字符。
          \n 標識一個八進制轉(zhuǎn)義碼或反向引用。如果 \n 前面至少有 n 個捕獲子表達式,那么 n 是反向引用。否則,如果 n 是八進制數(shù) (0-7),那么 n 是八進制轉(zhuǎn)義碼。
          \nm 標識一個八進制轉(zhuǎn)義碼或反向引用。如果 \nm 前面至少有 nm 個捕獲子表達式,那么 nm 是反向引用。如果 \nm 前面至少有 n 個捕獲,那么 n 是反向引用,后面跟 m。如果前面的條件均不存在,那么當 n m 是八進制數(shù) (0-7) 時,\nm 匹配八進制轉(zhuǎn)義碼 nm
          \nml n 是八進制數(shù) (0-3),ml 是八進制數(shù) (0-7) 時,匹配八進制轉(zhuǎn)義碼 nml
          \un 匹配 n,其中 n 是以四位十六進制數(shù)表示的 Unicode 字符。例如,\u00A9 匹配版權(quán)符號 (©)。
          Java正則表達式詳解 :
          如果你曾經(jīng)用過Perl或任何其他內(nèi)建正則表達式支持的語言,你一定知道用正則表達式處理文本和匹配模式是多么簡單。如果你不熟悉這個術(shù)語,那么“正則表達式”(Regular Expression)就是一個字符構(gòu)成的串,它定義了一個用來搜索匹配字符串的模式。
          許多語言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達式處理文本,一些文本編輯器用正則表達式實現(xiàn)高級“搜索-替換”功能。那么Java又怎樣呢?本文寫作時,一個包含了用正則表達式進行文本處理的Java規(guī)范需求(Specification Request)已經(jīng)得到認可,你可以期待在JDK的下一版本中看到它。
          然而,如果現(xiàn)在就需要使用正則表達式,又該怎么辦呢?你可以從Apache.org下載源代碼開放的Jakarta-ORO庫。本文接下來的內(nèi)容先簡要地介紹正則表達式的入門知識,然后以Jakarta-ORO API為例介紹如何使用正則表達式。
          一、正則表達式基礎(chǔ)知識
          我們先從簡單的開始。假設(shè)你要搜索一個包含字符“cat”的字符串,搜索用的正則表達式就是“cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:
          1.1 句點符號
          假設(shè)你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結(jié)束。另外,假設(shè)有一本英文字典,你可以用正則表達式搜索它的全部內(nèi)容。要構(gòu)造出這個正則表達式,你可以使用一個通配符——句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符:
          1.2 方括號符號
          為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內(nèi)你只能匹配單個字符:
          1.3 “或”符號
          如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達式。這里不能使用方擴號,因為方括號只允許匹配單個字符;這里必須使用圓括號“()”。圓括號還可以用來分組,具體請參見后面介紹。
          1.4 表示匹配次數(shù)的符號
          表一顯示了表示匹配次數(shù)的符號,這些符號用來確定緊靠該符號左邊的符號出現(xiàn)的次數(shù):

          假設(shè)我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字符(“-”)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上一個轉(zhuǎn)義字符“\”。

          圖一:匹配所有123-12-1234形式的社會安全號碼

          假設(shè)進行搜索的時候,你希望連字符號可以出現(xiàn),也可以不出現(xiàn)——即,999-99-9999和999999999都屬于正確的格式。這時,你可以在連字符號后面加上“?”數(shù)量限定符號,如圖二所示:

          圖二:匹配所有123-12-1234和123121234形式的社會安全號碼

          下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數(shù)字加上二個字母。它的正則表達式前面是數(shù)字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。圖三顯示了完整的正則表達式。

          圖三:匹配典型的美國汽車牌照號碼,如8836KV

          1.5 “否”符號
          “^”符號稱為“否”符號。如果用在方括號內(nèi),“^”表示不想要匹配的字符。例如,圖四的正則表達式匹配所有單詞,但以“X”字母開頭的單詞除外。

          圖四:匹配所有單詞,但“X”開頭的除外

          1.6 圓括號和空白符號
          假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示:

          圖五:匹配所有Moth DD,YYYY格式的日期

          新出現(xiàn)的“\s”符號是空白符號,匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創(chuàng)建一個組,然后用ORO API(本文后面詳細討論)提取出它的值。修改后的正則表達式如圖六所示:

          圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個組

          1.7 其它符號
          為簡便起見,你可以使用一些為常見正則表達式創(chuàng)建的快捷符號。如表二所示:
          表二:常用符號

          例如,在前面社會安全號碼的例子中,所有出現(xiàn)“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達式如圖七所示:

          圖七:匹配所有123-12-1234格式的社會安全號碼

          二、Jakarta-ORO庫
          有許多源代碼開放的正則表達式庫可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達式語法。我在這里選用的是Jakarta-ORO正則表達式庫,它是最全面的正則表達式API之一,而且它與Perl 5正則表達式完全兼容。另外,它也是優(yōu)化得最好的API之一。
          Jakarta-ORO庫以前叫做OROMatcher,Daniel Savarese大方地把它贈送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。
          我首先將簡要介紹使用Jakarta-ORO庫時你必須創(chuàng)建和訪問的對象,然后介紹如何使用Jakarta-ORO API。
          ▲ PatternCompiler對象
          首先,創(chuàng)建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。Perl5Compiler是PatternCompiler接口的一個實現(xiàn),允許你把正則表達式編譯成用來匹配的Pattern對象。
          ▲ Pattern對象
          要把正則表達式編譯成Pattern對象,調(diào)用compiler對象的compile()方法,并在調(diào)用參數(shù)中指定正則表達式。例如,你可以按照下面這種方式編譯正則表達式“t[aeio]n”:
          默認情況下,編譯器創(chuàng)建一個大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要創(chuàng)建一個大小寫不敏感的模式,你應該在調(diào)用編譯器的時候指定一個額外的參數(shù):
          創(chuàng)建好Pattern對象之后,你就可以通過PatternMatcher類用該Pattern對象進行模式匹配。
          ▲ PatternMatcher對象
          PatternMatcher對象根據(jù)Pattern對象和字符串進行匹配檢查。你要實例化一個Perl5Matcher類并把結(jié)果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個實現(xiàn),它根據(jù)Perl 5正則表達式語法進行模式匹配:
          使用PatternMatcher對象,你可以用多個方法進行匹配操作,這些方法的第一個參數(shù)都是需要根據(jù)正則表達式進行匹配的字符串:
          · boolean matches(String input, Pattern pattern):當輸入字符串和正則表達式要精確匹配時使用。換句話說,正則表達式必須完整地描述輸入字符串。
          · boolean matchesPrefix(String input, Pattern pattern):當正則表達式匹配輸入字符串起始部分時使用。
          · boolean contains(String input, Pattern pattern):當正則表達式要匹配輸入字符串的一部分時使用(即,它必須是一個子串)。
          另外,在上面三個方法調(diào)用中,你還可以用PatternMatcherInput對象作為參數(shù)替代String對象;這時,你可以從字符串中最后一次匹配的位置開始繼續(xù)進行匹配。當字符串可能有多個子串匹配給定的正則表達式時,用PatternMatcherInput對象作為參數(shù)就很有用了。用PatternMatcherInput對象作為參數(shù)替代String時,上述三個方法的語法如下:
          · boolean matches(PatternMatcherInput input, Pattern pattern)
          · boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
          · boolean contains(PatternMatcherInput input, Pattern pattern)
          三、應用實例
          下面我們來看看Jakarta-ORO庫的一些應用實例。
          3.1 日志文件處理
          任務:分析一個Web服務器日志文件,確定每一個用戶花在網(wǎng)站上的時間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:
          分析這個日志記錄,可以發(fā)現(xiàn),要從這個日志文件提取的內(nèi)容有兩項:IP地址和頁面訪問時間。你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標記。
          首先我們來看看IP地址。IP地址有4個字節(jié)構(gòu)成,每一個字節(jié)的值在0到255之間,各個字節(jié)通過一個句點分隔。因此,IP地址中的每一個字節(jié)有至少一個、最多三個數(shù)字。圖八顯示了為IP地址編寫的正則表達式:

          圖八:匹配IP地址

          IP地址中的句點字符必須進行轉(zhuǎn)義處理(前面加上“\”),因為IP地址中的句點具有它本來的含義,而不是采用正則表達式語法中的特殊含義。句點在正則表達式中的特殊含義本文前面已經(jīng)介紹。
          日志記錄的時間部分由一對方括號包圍。你可以按照如下思路提取出方括號里面的所有內(nèi)容:首先搜索起始方括號字符(“[”),提取出所有不超過結(jié)束方括號字符(“]”)的內(nèi)容,向前尋找直至找到結(jié)束方括號字符。圖九顯示了這部分的正則表達式。

          圖九:匹配至少一個字符,直至找到“]”

          現(xiàn)在,把上述兩個正則表達式加上分組符號(圓括號)后合并成單個表達式,這樣就可以從日志記錄提取出IP地址和時間。注意,為了匹配“- -”(但不提取它),正則表達式中間加入了“\s-\s-\s”。完整的正則表達式如圖十所示。

          圖十:匹配IP地址和時間標記

          現(xiàn)在正則表達式已經(jīng)編寫完畢,接下來可以編寫使用正則表達式庫的Java代碼了。
          為使用Jakarta-ORO庫,首先創(chuàng)建正則表達式字符串和待分析的日志記錄字符串:
          這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(“\”)進行轉(zhuǎn)義處理。圖十不是Java的表示形式,所以我們要在每個“\”前面加上一個“\”以免出現(xiàn)編譯錯誤。遺憾的是,轉(zhuǎn)義處理過程很容易出現(xiàn)錯誤,所以應該小心謹慎。你可以首先輸入未經(jīng)轉(zhuǎn)義處理的正則表達式,然后從左到右依次把每一個“\”替換成“\\”。如果要復檢,你可以試著把它輸出到屏幕上。
          初始化字符串之后,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創(chuàng)建一個Pattern對象:
          現(xiàn)在,創(chuàng)建PatternMatcher對象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:
          接下來,利用PatternMatcher接口返回的MatchResult對象,輸出匹配的組。由于logEntry字符串包含匹配的內(nèi)容,你可以看到類如下面的輸出:
          3.2 HTML處理實例一
          下面一個任務是分析HTML頁面內(nèi)FONT標記的所有屬性。HTML頁面內(nèi)典型的FONT標記如下所示:
          程序?qū)凑杖缦滦问剑敵雒恳粋€FONT標記的屬性:
          在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從字體標記提取出“"face="Arial, Serif" size="+2" color="red"”。

          圖十一:匹配FONT標記的所有屬性

          第二個正則表達式如圖十二所示,它把各個屬性分割成名字-值對。

          圖十二:匹配單個屬性,并把它分割成名字-值對

          分割結(jié)果為:
          現(xiàn)在我們來看看完成這個任務的Java代碼。首先創(chuàng)建兩個正則表達式字符串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區(qū)分大小寫。
          接下來,創(chuàng)建一個執(zhí)行匹配操作的Perl5Matcher對象。
          假設(shè)有一個String類型的變量html,它代表了HTML文件中的一行內(nèi)容。如果html字符串包含F(xiàn)ONT標記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所有屬性:
          接下來創(chuàng)建一個PatternMatcherInput對象。這個對象允許你從最后一次匹配的位置開始繼續(xù)進行匹配操作,因此,它很適合于提取FONT標記內(nèi)屬性的名字-值對。創(chuàng)建PatternMatcherInput對象,以參數(shù)形式傳入待匹配的字符串。然后,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字符串對象)為參數(shù),反復地調(diào)用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內(nèi)部的指針向前移動,下一次檢測將從前一次匹配位置的后面開始。
          本例的輸出結(jié)果如下:
          3.3 HTML處理實例二
          下面我們來看看另一個處理HTML的例子。這一次,我們假定Web服務器從widgets.acme.com移到了newserver.acme.com。現(xiàn)在你要修改一些頁面中的鏈接:
          執(zhí)行這個搜索的正則表達式如圖十三所示:

          圖十三:匹配修改前的鏈接

          如果能夠匹配這個正則表達式,你可以用下面的內(nèi)容替換圖十三的鏈接:
          注意#字符的后面加上了$1。Perl正則表達式語法用$1、$2等表示已經(jīng)匹配且提取出來的組。圖十三的表達式把所有作為一個組匹配和提取出來的內(nèi)容附加到鏈接的后面。
          現(xiàn)在,返回Java。就象前面我們所做的那樣,你必須創(chuàng)建測試字符串,創(chuàng)建把正則表達式編譯到Pattern對象所必需的對象,以及創(chuàng)建一個PatternMatcher對象:
          接下來,用com.oroinc.text.regex包Util類的substitute()靜態(tài)方法進行替換,輸出結(jié)果字符串:
          Util.substitute()方法的語法如下:
          這個調(diào)用的前兩個參數(shù)是以前創(chuàng)建的PatternMatcher和Pattern對象。第三個參數(shù)是一個Substiution對象,它決定了替換操作如何進行。本例使用的是Perl5Substitution對象,它能夠進行Perl5風格的替換。第四個參數(shù)是想要進行替換操作的字符串,最后一個參數(shù)允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數(shù)。
          【結(jié)束語】在這篇文章中,我為你介紹了正則表達式的強大功能。只要正確運用,正則表達式能夠在字符串提取和文本修改中起到很大的作用。另外,我還介紹了如何在Java程序中通過Jakarta-ORO庫利用正則表達式。至于最終采用老式的字符串處理方式(使用StringTokenizer,charAt,和substring),還是采用正則表達式,這就有待你自己決定了。

          posted @ 2007-08-14 14:41 卓韋 閱讀(2229) | 評論 (0)編輯 收藏

          XMLBeans是Bea公司的一個項目,用于訪問和處理數(shù)據(jù)和文檔。使用XMLBeans可以讓您用面向?qū)ο蟮挠^點來對待和處理xml數(shù)據(jù)和文檔,同時又可以忠實于該xml數(shù)據(jù)對應的xml結(jié)構(gòu)和schema。本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans使它正常運行的全部過程。

           

          XMLBeans來自于Bea,是使用java技術(shù)訪問和處理XML數(shù)據(jù)和文檔技術(shù)的一次突破性進展。第一次,開發(fā)者可以用自己熟悉的、方便的、面向?qū)ο蟮囊晥D來看待XML數(shù)據(jù),同時又可以訪問該數(shù)據(jù)對應的結(jié)構(gòu)和schema。                                 ――來自于Bea的關(guān)于XMLBeans的介紹

          XMLBeansBea公司針對XML處理的一個項目,現(xiàn)在已經(jīng)提供免費下載和使用,目前的最新版本是1.0

          1 為什么使用XMLBeans

          XMLBeans之前,我們訪問xml數(shù)據(jù)和文檔有兩種選擇:

          1. 使用DOMSAX來訪問XML數(shù)據(jù)和文檔的內(nèi)容

          2. 使用JAXB等技術(shù)將XML映射為java

          不管你使用哪一種,你都無法完整的訪問該XML數(shù)據(jù)和對象的豐富內(nèi)容和Schema信息。產(chǎn)生的原因是因為java數(shù)據(jù)模型和XML之間不匹配造成的,所以應用中你要不就選擇了可擴展性,要不就只能選擇系統(tǒng)的強壯性。

          隨著XMLBeans的出現(xiàn),我們不需要再采取這種折衷的措施了。XMLBeans提供了更多的特性來訪問XML數(shù)據(jù)和文檔:

          1.   XMLBeans是基于標記流,因此可以輕松的使用指針在xml數(shù)據(jù)和文檔之間導航。指針接口適用于所有xml數(shù)據(jù)和文檔。

          2.   如果你的xml數(shù)據(jù)和文檔有一個schema的話,XMLBeans將給您生成這些XML數(shù)據(jù)和文檔的java類“視圖”(也就是訪問這些XML數(shù)據(jù)和文檔的java代碼)。

          3.   開發(fā)者可以使用這些java代碼輕松的讀/寫xml數(shù)據(jù)和文檔,而且被強制的執(zhí)行xml schema中規(guī)定的一些約束。

          4.   java類“視圖”都能夠忠實的表述原始xml數(shù)據(jù)和文檔的內(nèi)容,因為java類“視圖”都是基于受保護的、最基本的xml表現(xiàn)。

          所以使用XMLBeans來訪問xml 數(shù)據(jù)和文檔的好處是顯而易見的:

          1.   完全使用面向?qū)ο蟮挠^點來看待和處理數(shù)據(jù)和文檔

          2.   開發(fā)者不再需要編寫大量的代碼來訪問XML數(shù)據(jù)和文檔

          3.   可以使用schema中規(guī)定的對于數(shù)據(jù)的約束條件,而不需要自己去編寫實現(xiàn)這些約束的代碼

          4.   不需要解析所有的xml數(shù)據(jù)和文檔而僅僅是為了訪問其中的某個數(shù)據(jù)項

          關(guān)于XMLBeans更詳細的情況請大家訪問http://dev2dev.bea.com/technologies/xmlbeans/

          2 環(huán)境和工具準備

          XMLBeans中的大量工作使用了Ant工具,所以再開始工作之前請下載Ant工具并使它正常運行。

          XMLBeansjava實現(xiàn)請大家到bea的網(wǎng)站上下載:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp

          在執(zhí)行過程中,還需要用訪問xmldom組件,也就是xml-apis.jar文件,可到http://xml.apache.org/xerces2-j/index.html下載。附件中的test-XMLBeans.rar文件中也有這個jar文件。

          3 第一個例子

          3.1    實例說明

          我們這里使用一個訂單的例子,他的實例文檔如下:

          <po:purchase-order xmlns:po=" http://vivianj.go.nease.net/easypo ">

              <po:customer>

            <po:name>Gladys Kravitz</po:name>

            <po:address>Anytown, PA</po:address>

              </po:customer>

              <po:date>2003-01-07T14:16:00-05:00</po:date>

              <po:line-item>

            <po:description>Burnham's Celestial Handbook, Vol 1</po:description>

            <po:per-unit-ounces>5</po:per-unit-ounces>

            <po:price>21.79</po:price>

            <po:quantity>2</po:quantity>

              </po:line-item>

              <po:line-item>

            <po:description>Burnham's Celestial Handbook, Vol 2</po:description>

            <po:per-unit-ounces>5</po:per-unit-ounces>

            <po:price>19.89</po:price>

            <po:quantity>2</po:quantity>

              </po:line-item>

          <po:shipper>

            <po:name>ZipShip</po:name>

            <po:per-ounce-rate>0.74</po:per-ounce-rate>

              </po:shipper>

          </po:purchase-order>

          我們使用下面的schema來描述這個實例文檔:

          <xs:schema

             xmlns:xs="http://www.w3.org/2001/XMLSchema"

             xmlns:po="http://vivianj.go.nease.net/easypo"

             targetNamespace="http://vivianj.go.nease.net/easypo"

             elementFormDefault="qualified">

            <xs:element name="purchase-order">

              <xs:complexType>

                <xs:sequence>

            <xs:element name="customer" type="po:customer"/>

            <xs:element name="date" type="xs:dateTime"/>

            <xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/>

            <xs:element name="shipper" type="po:shipper" minOccurs="0" maxOccurs="1"/>

                </xs:sequence>

              </xs:complexType>

            </xs:element>

            <xs:complexType name="customer">

              <xs:sequence>

                <xs:element name="name" type="xs:string"/>

                <xs:element name="address" type="xs:string"/>

              </xs:sequence>

              <xs:attribute name="age" type="xs:int"/>

            </xs:complexType>

            <xs:complexType name="line-item">

              <xs:sequence>

                <xs:element name="description" type="xs:string"/>

                <xs:element name="per-unit-ounces" type="xs:decimal"/>

                <xs:element name="price" type="xs:decimal"/>

                <xs:element name="quantity" type="xs:integer"/>

              </xs:sequence>

            </xs:complexType>

            <xs:complexType name="shipper">

              <xs:sequence>

                <xs:element name="name" type="xs:string"/>

                <xs:element name="per-ounce-rate" type="xs:decimal"/>

              </xs:sequence>

            </xs:complexType>

          </xs:schema>

          現(xiàn)在,要訪問的xml數(shù)據(jù)已經(jīng)確定了,而且已經(jīng)用schema來描述他了,剩下的就是使用XMLBeans來輔助生成訪問XML數(shù)據(jù)的java代碼了,下面的章節(jié)將詳細的介紹這部分內(nèi)容

          3.2    ant輔助生成訪問XML數(shù)據(jù)的java代碼

          3.2.1      外部jar文件

          在使用XMLBeans生成訪問XML數(shù)據(jù)的java代碼時,我們需要用到xbean.jar文件,下載的XMLBeans里面有這個文件。

          3.2.2      增加的taskdef

          編譯腳本執(zhí)行時候必須增加一個XMLBeantaskdef,內(nèi)容如下:

          <taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="path/to/xbean.jar"/>

          3.2.3      xmlbean

          使用xmlbean標簽來生成訪問xml數(shù)據(jù)的java代碼,簡單的例子如下:

          <xmlbean schema="schemas" destfile="Schemas.jar"/>

          <xmlbean schema="schemaseasypo.xsd" destfile="Schemas.jar" srcgendir="." >

          第一個例子表示為schemas下面所有的*.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中。

          第二個例子表示為schemas下面所有的easypo.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中,而且將生成的。Java文件放在當前目錄下。

          其中的參數(shù)簡單的說明如下:

          xmlbean 標簽表示這是要生成指定schema文件的訪問代碼。

          Schema  屬性表示要生成訪問代碼的xsd文件的范圍,可以是一個目錄,也可以

          是一個文件或者使用fileset進行定義。

          Destfile  屬性定義了被生成的代碼編譯后將放在那個文件中。

          Rcgendir 屬性則表示生成的。Java文件將放在那個目錄中。

          Xmlbean標簽支持的其它參數(shù)和相關(guān)的說明請參考XMLBeans的幫助文檔,這里不作過多的說明。

          3.2.4      實際的build.xml

          <project name="MyProject" default="compile" basedir=".">

          <property name="src" value="."/>

          <property name="build" value="build"/>

          <property name="dist"  value="dist"/>

          <property name="classpath" value="./xkit/lib/xbean.jar "/>

          <target name="init">

              <!-- Create the build directory structure used by compile -->

              <mkdir dir="${build}"/>

          </target>

          <target name="compile" depends="init">

              <!-- Compile the java code from ${src} into ${build} -->

              <taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="${classpath}"/>

              <xmlbean schema="schemas/easypo.xsd" classpath="${classpath}" destfile="easypo.jar" srcgendir="${src}"/>

            </target>

          </project>

          3.2.5      生成jar文件

          現(xiàn)在你可以進入build.xml文件所在的目錄,執(zhí)行ant f build.xml來生成所有訪問該easypo.xml的代碼。

          執(zhí)行完以后,這個目錄下面會多出一個Schemas.jar文件,他包含了所有被生成和編譯了的、訪問xml文檔的.class文件。目錄下面會多出一個net目錄,他的子目錄下包含了所有被生成的.java文件.實際的jar文件構(gòu)成請大家參考作者提供的Schemas.jar文件.

          4 測試一下

          4.1    測試代碼

          好了,現(xiàn)在我們來寫個例子,測試一下是否可以成功的訪問xml數(shù)據(jù).完整的代碼請參看

          //解析xml實例文檔,他的參數(shù)poFile是一個file類型的參數(shù)

          //所以需要我們將3.1的實例文檔保存為一個.xml文檔

          PurchaseOrderDocument poDoc =

                PurchaseOrderDocument.Factory.parse(poFile);

          //創(chuàng)建一個訪問該xml實例文檔的接口PurchaseOrder

          /**[讓作者感到很意外的是,bea提供的例子代碼中這段的定義是這樣的:

          *PurchaseOrder po = poDoc.getPurchaseOrder();

          *也就是說PurchaseOrder這個接口應該是一個單獨的類,但是作者查看XMLBeans

          *最后生成的.java文件中,這個PurchaseOrder卻是作為PurchaseOrderDocument的一

          *個內(nèi)部類出現(xiàn)的

          */

          PurchaseOrderDocument.PurchaseOrder po = poDoc.getPurchaseOrder();

          //直接過去其中的所有lineitem子元素的所有內(nèi)容,他返回一個lineitem對象的數(shù)組.

            LineItem[] lineitems = po.getLineItemArray();

            System.out.println("Purchase order has " + lineitems.length + " line items.");

            double totalAmount = 0.0;

            int numberOfItems = 0;

          //直接使用對應的get方法來獲取對應屬性的值

            for (int j = 0; j < lineitems.length; j++)

            {

                System.out.println(" Line item: " + j);

                System.out.println(

              "   Description: " + lineitems[j].getDescription());

                System.out.println("   Quantity: " + lineitems[j].getQuantity());

                System.out.println("   Price: " + lineitems[j].getPrice());

                numberOfItems += lineitems[j].getQuantity().intValue();

                totalAmount += lineitems[j].getPrice().doubleValue() * lineitems[j].getQuantity().doubleValue();

            }

            System.out.println("Total items: " + numberOfItems);

            System.out.println("Total amount: " + totalAmount);

          4.2    測試結(jié)果

          運行這段代碼,應該在控制臺打印如下信息:

          Purchase order has 3 line items.

           Line item 0

             Description: Burnham's Celestial Handbook, Vol 1

             Quantity: 2

             Price: 21.79

           Line item 1

             Description: Burnham's Celestial Handbook, Vol 2

             Quantity: 2

             Price: 19.89

          Total items: 4

          Total amount: 41.68

          5 總結(jié)

          XMLBeansBea公司的一個公開源代碼項目,以Schema為基礎(chǔ)建立的、訪問xml的一種解決方法,提供了訪問和處理xml數(shù)據(jù)和文檔時既可以完全的訪問xml的內(nèi)容、又不丟失xmlschema信息的強大功能。使用XMLBeans可以讓您用面向?qū)ο蟮挠^點來對待和處理xml數(shù)據(jù)和文檔,同時又可以忠實于該xml數(shù)據(jù)對應的xml結(jié)構(gòu)和schema

          本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans,如何使用他的ant擴展輔助生成訪問xmljava代碼,如何編寫客戶端來測試該段代碼是否成功執(zhí)行的全過程。希望能夠讓大家掌握如何使用XMLBeans來簡化各自的開發(fā)工作、提高自己的開發(fā)速度。XMLBeans的高級應用將在接下來的文章中介紹。

          參考資料:

          1. ANT的幫助 http://ant.apache.org/

          2. XMLBeans的幫助 http://dev2dev.bea.com/technologies/xmlbeans/

          工具下載:

          1. ANT工具下載 http://archive.apache.org/dist/ant/binaries/

          2. XMLBeans下載  http://dev2dev.bea.com/technologies/xmlbeans/

          作者的所有工作文件: test-XMLBeans.rar

          作者信息:

          姓名: 肖菁

          聯(lián)系方式: 0731-6665772,jing.xiao@chinacreator.com

          簡介: 作者目前是湖南省長沙鐵道學院科創(chuàng)計算機系統(tǒng)集成有限公司軟件中心軟件工程師,IBM developerworksBEA dev2dev撰稿人,主要研究J2EE編程技術(shù)、Web Service技術(shù)以及他們在websphereweblogicapache平臺上的實現(xiàn),擁有IBM Developing With Websphere Studio證書。歡迎大家訪問作者的個人網(wǎng)站: vivianj.go.nease.net

          posted @ 2007-08-14 10:36 卓韋 閱讀(701) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 黔东| 徐汇区| 波密县| 普兰店市| 阜阳市| 文山县| 越西县| 磴口县| 大渡口区| 浦城县| 安仁县| 广元市| 泰顺县| 兴义市| 房山区| 阳曲县| 奈曼旗| 揭西县| 陆河县| 新蔡县| 玉林市| 富顺县| 眉山市| 广元市| 安陆市| 武陟县| 安义县| 和龙市| 肥东县| 忻州市| 合作市| 祁阳县| 阜平县| 雷波县| 巴林右旗| 河池市| 裕民县| 津市市| 同仁县| 东光县| 东莞市|