中文字幕亚洲一区二区av在线 ,2021中文字幕一区亚洲,亚洲国产精品久久久男人的天堂http://www.aygfsteel.com/hanbiaoo/zh-cnSun, 06 Jul 2025 02:53:39 GMTSun, 06 Jul 2025 02:53:39 GMT60java家族http://www.aygfsteel.com/hanbiaoo/archive/2007/11/03/157975.html卓韋卓韋Sat, 03 Nov 2007 14:01:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/11/03/157975.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/157975.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/11/03/157975.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/157975.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/157975.html
 什么是 Java 技術?  
Java 技術(版本 2)是一種面向對象的編程語言,是 Sun Microsystems 所開發的編程平臺。Java 技術基于單一 Java 虛擬機(JVM)的概念,JVM 是編程語言與機器底層軟件和硬件之間的翻譯器。編程語言的所有實現都必須模擬 JVM,從而使 Java 程序可以在具有 JVM 版本的任何系統上運行。

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

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

了解更多信息:

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

了解更多信息:

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


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


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

J2SE 中的技術:

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


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


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


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


Java Platform Debugger Architecture (JPDA) 是 Java 2 的調試支持基礎設施。JPDA 包括三層 API: 
JDI (Java Debug Interface)是一種支持遠程調試的高級別編程語言接口。 
JDWP (Java Debug Wire Protocol) 定義在調試過程和調試器前端之間傳輸的信息和請求的格式。 
JVMDI (Java Virtual Machine Debug Interface) 是低級別本地接口,定義了調試時 JVM 必須提供的服務。 
(請參閱“ 軟件開發的未來 ”。)

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


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


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


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


Java Advanced Imaging (JAI) 是一種 API,提供了面向對象的接口的集合,這些接口支持簡單的高級編程模型,使得開發人員可以很容易地操縱圖像。(請參閱“利用 JSP 代碼管理您的圖像”。)


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


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


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


Java Management Extensions (JMX) 提供的工具用于構建分布式、基于 Web 的、模塊化和動態應用程序,以便管理和監視設備、應用程序和服務驅動的網絡。(請參閱由三部分組成的“從黑箱到企業,第 1 部分:管理,JMX 1.1 樣式”。)


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


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


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


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


Java 3D 是一種 API,通過提供支持簡單高級編程模型的一組面向對象的接口,開發人員可以使用它容易地將可伸縮的平臺獨立的 3D 圖形合并到 Java 應用程序中。(請參閱教程“Java 3D 探奇 ”。) 
J2EE 中的技術:

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


Java API for XML Registries (JAXR) 為訪問不同種類的 XML 注冊中心提供了統一和標準的 API (用于構建、部署和發現 Web 服務的可用基礎設施)。(請參閱 Java 技術標準。)


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


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


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


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


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


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


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


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


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


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


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


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


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


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

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


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


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


developerWorks Wireless technology 專區包含了 J2ME 相關技術的多篇文章和教程。 
Java 網絡技術:

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



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


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


Jini 是一種開放體系結構,用于為硬件和軟件創建高適應性的以網絡為中心的服務。Jini 系統體系結構由三個類別組成:編程模型、基礎設施和服務。(請參閱“Jini networking technology, the next step”。)


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

了解更多信息:

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

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

了解更多信息:

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


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


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


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


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


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


將設計理論轉換為實際應用程序是 Java 理論與實踐 系列文章的出發點。


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


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


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

了解更多信息:

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


Java technology on alphaWorks 是 IBM 生成的 Java 相關技術的虛擬倉庫,包括 API、集成開發環境和 devkit、組件、參考實現和實用程序。


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

卓韋 2007-11-03 22:01 發表評論
]]>
使用apache-commons-fileupload上傳、下載文件http://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148038.html卓韋卓韋Tue, 25 Sep 2007 05:26:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148038.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/148038.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148038.html#Feedback1http://www.aygfsteel.com/hanbiaoo/comments/commentRss/148038.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/148038.html

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

%>

<%
   DiskFileUpload fu = new DiskFileUpload();
    // 設置允許用戶上傳文件大小,單位:字節
   fu.setSizeMax(200*1024*1024);
    // 設置最多只允許在內存中存儲的數據,單位:字節
   fu.setSizeThreshold(maxPostSize);
    // 設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬盤的目錄
   fu.setRepositoryPath("g:\\upload\\tmp\\");
    //開始讀取上傳信息 得到所有文件
   try{
      List fileItems = fu.parseRequest(request);
     }catch(FileUploadException e){
         //這里異常產生的原因可能是用戶上傳文件超過限制、不明類型的文件等
         //自己處理的代碼
     }
%>
<%
   // 依次處理每個上傳的文件
   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、上傳項目只要足夠小,就應該保留在內存里。
 B、較大的項目應該被寫在硬盤的臨時文件上。
 C、非常大的上傳請求應該避免。
 D、限制項目在內存中所占的空間,限制最大的上傳請求,并且設定臨時文件的位置。
 
 可以根據具體使用用servlet來重寫,具體參數配置可以統一放置到一配置文件
 

 文件的下載用servlet實現
      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處理文件上傳
作者:◇ 劉冬 發文時間: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如何實現網頁的重定向 ,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日期--學習怎樣創建和使用日期,作者:Robert Nielsen ,http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=497

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

卓韋 2007-09-25 13:26 發表評論
]]>
[轉載]Jakarta Commons FileUpload 用戶指南 http://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148036.html卓韋卓韋Tue, 25 Sep 2007 05:15:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148036.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/148036.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/25/148036.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/148036.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/148036.htmlJakarta Commons FileUpload 用戶指南

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

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


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


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


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

4.1 最簡單的例子
下面是一些簡單的使用場景:
??   上傳項目只要足夠小,就應該保留在內存里。
??   較大的項目應該被寫在硬盤的臨時文件上。
??   非常大的上傳請求應該避免。
??   限制項目在內存中所占的空間,限制最大的上傳請求,并且設定臨時文件的位置。
處理這個場景的請求很簡單:
// 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);
這就是我們所需要的全部代碼了!
解析的結果就是一個項目的List,每個項目都實現了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);
如果你還想使用更多的控制,比如存儲項目到其它地方(如,數據庫),那么你可以看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();
  ...
}
對于上傳文件,這里就有很多不同啦~你可能想知道更多其它的內容。下面是個例子,里面包含了不少你感興趣的方法。
// 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();
  ...
}
對于上傳的文件,你肯定不希望總是通過內存來訪問它,除非它很小,或者你實在沒有別的選擇余地了。你很希望使用流來處理文件內容或者將文件保存到它的最終位置。FileUpload提供簡單的方式來完成兩方面的需求。
// Process a file upload
if (writeToFile) {
  File uploadedFile = new File(...);
  item.write(uploadedFile);
} else {
  InputStream uploadedStream = item.getInputStream();
  ...
  uploadedStream.close();
}
注意:在FileUpload的默認實現中wirte()方法應該值得關注,如果數據還在臨時文件里沒有移除,那么這個方法就會試圖重命名這個文件為相應的目標文件。事實上如果重命名失敗了的話,數據就僅僅被拷貝。
如果你需要訪問內存中的上傳數據,你可以用get()方法來獲得數據的二進制數組形式。
// Process a file upload in memory
byte[] data = item.get();
...

第6章 清除資源
這一節只適用于你使用了DiskFileItem。換句話說,它只適用于你在處理上傳文件之前將上傳文件寫入過臨時文件這種情形。
像這種臨時文件會被自動刪除, 如果它們不再被使用(更確切地說,java.io.File的實例已經被GC掉了。 )這是由org.apache.commons.io.FileCleaner類在后臺完成的,它會啟動一個收割機線程。
這個收割機線程在它不再被需要時會被停止。在servlet環境里,這是通過指定一個名叫FileCleanerCleanup的servlet上下文監聽器來實現的。要做到這里,在你的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里載入的,那么,下面的情況可能會出現:
建議你運行兩個應用,一個叫A,一個叫B。(這兩個應用可能是完全一樣,只不過上下文名稱不一樣。)這兩個應用都使用了FileCleanerCleanup。現在,如果你終止應用A,B還在運行,這時,A會終止B的收割機線程。換言之,你要十分仔細地考慮是使用FileCleanerCleanup,還是不使用。

第7章 觀察上傳進度
如果你希望可以上傳很大的文件,這時,你可能想將上傳的狀態告訴用戶,如已經接收了多少。
觀察上傳進度需要通過一個處理監聽器來實現。
//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);
上面這個監聽器是有問題的。因為它非常頻繁地被調用。這會帶來性能問題。一個比較好的解決辦法是,減少調用。例如,如果megabytes被改變,那么就發出一個消息。
//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.");
    }
  }
};



卓韋 2007-09-25 13:15 發表評論
]]>
Java 文件上傳 http://www.aygfsteel.com/hanbiaoo/archive/2007/09/24/147918.html卓韋卓韋Mon, 24 Sep 2007 14:59:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/24/147918.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/147918.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/24/147918.html#Feedback1http://www.aygfsteel.com/hanbiaoo/comments/commentRss/147918.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/147918.html閱讀全文

卓韋 2007-09-24 22:59 發表評論
]]>
Linux安裝配置http://www.aygfsteel.com/hanbiaoo/archive/2007/09/23/147615.html卓韋卓韋Sun, 23 Sep 2007 12:40:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/23/147615.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/147615.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/09/23/147615.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/147615.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/147615.html
介紹
    每個 Linux 程序都是一個可執行文件,它含有操作碼列表,CPU 將執行這些操作碼來完成特定的操作。例如,ls 命令是由 /bin/ls 文件提供的,該文件含有機器指令的列表,在屏幕上顯示當前目錄中文件的列表時需要使用這些機器指令。幾乎每個程序的行為都可以通過修改其配置文件來按照您的偏好或需要去定制。

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

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

    除非另行指定,Red Hat Linux 系統中大多數配置文件都在 /etc 目錄中。

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

內核
    更改內核中的配置文件會立即影響到系統。例如,更改 passwd 文件以增加用戶將立即使該用戶變為可用。而且任何 Linux 系統的 /proc/sys 目錄中都有一些內核可調參數。只有超級用戶可以得到對所有這些文件的寫訪問權力;其它用戶只有只讀訪問權力。此目錄中文件的分類的方式和 Linux 內核源代碼的分類方式一樣。此目錄中的每個文件都代表一個內核數據結構,這些數據結構可以被動態地修改,從而改變系統性能。
注意:在更改其中任何文件的任何值之前,您應該確保自己全面了解該文件,以避免對系統造成不可修復的損害。

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

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


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

    例如,如果我們更改了網絡配置,就需要發出:
    service network restart。

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

主機

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

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

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

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


[目錄]

引導和登錄注銷

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

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

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

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

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


[目錄]

文件系統

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

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

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

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


[目錄]

系統管理

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

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

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

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

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

/etc/usertty

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

/etc/shells
    包含系統可用的可能的“shell”的列表。

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


[目錄]

網絡

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

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

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

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

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

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

/etc/rpc
    包含 RPC 指令/規則,這些指令/規則可以在 NFS 調用、遠程文件系統安裝等中使用。

/etc/exports
    要導出的文件系統(NFS)和對它的權限。

/etc/services
    將網絡服務名轉換為端口號/協議。由 inetd、telnet、tcpdump 和一些其它程序讀取。有一些 C 訪問例程。

/etc/inetd.conf
    inetd 的配置文件。請參閱 inetd 聯機幫助頁。包含每個網絡服務的條目,inetd 必須為這些網絡服務控制守護進程或其它服務。注意,服務將會運行,但在 /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 網絡配置腳本。


[目錄]

系統命令

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

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

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

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

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

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


[目錄]

守護進程

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

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

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

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


[目錄]

用戶程序

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

/etc/lynx.cfg 中的代理服務器設置

.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

卓韋 2007-09-23 20:40 發表評論
]]>
linux下安裝JDKhttp://www.aygfsteel.com/hanbiaoo/articles/147608.html卓韋卓韋Sun, 23 Sep 2007 11:36:00 GMThttp://www.aygfsteel.com/hanbiaoo/articles/147608.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/147608.htmlhttp://www.aygfsteel.com/hanbiaoo/articles/147608.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/147608.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/147608.html 進入安裝目錄
#cd /home
#cp jdk-1_5_0_02-linux-i586.rpm /usr/local
#cd /usr/local
給所有用戶添加可執行的權限
#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,同樣給所有用戶添加可執行的權限
#chmod +x jdk-1_5_0_02-linux-i586.rpm
安裝程序
#rpm -ivh jdk-1_5_0_02-linux-i586.rpm
出現安裝協議等,按<Enter>接受即可。

2.設置環境變量。
#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中輸入以下內容: 
#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分配權限:chmod 755 /etc/profile.d/java.sh

3.在終端使用echo命令檢查環境變量設置情況。
#echo $JAVA_HOME
#echo $CLASSPATH
#echo $PATH

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




卓韋 2007-09-23 19:36 發表評論
]]>
MySQL中包含日期的查詢http://www.aygfsteel.com/hanbiaoo/archive/2007/08/15/137014.html卓韋卓韋Wed, 15 Aug 2007 11:42:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/08/15/137014.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/137014.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/08/15/137014.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/137014.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/137014.html

卓韋 2007-08-15 19:42 發表評論
]]>
關于XML Schema的基本語法http://www.aygfsteel.com/hanbiaoo/archive/2007/08/14/136707.html卓韋卓韋Tue, 14 Aug 2007 08:06:00 GMThttp://www.aygfsteel.com/hanbiaoo/archive/2007/08/14/136707.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/136707.htmlhttp://www.aygfsteel.com/hanbiaoo/archive/2007/08/14/136707.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/136707.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/136707.html閱讀全文

卓韋 2007-08-14 16:06 發表評論
]]>
正則表達式語法http://www.aygfsteel.com/hanbiaoo/articles/136668.html卓韋卓韋Tue, 14 Aug 2007 06:41:00 GMThttp://www.aygfsteel.com/hanbiaoo/articles/136668.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/136668.htmlhttp://www.aygfsteel.com/hanbiaoo/articles/136668.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/136668.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/136668.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

圖八:匹配IP地址

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

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

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

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

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

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

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

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

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

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

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



卓韋 2007-08-14 14:41 發表評論
]]>
使用XMLBeans處理XML數據和文檔入門(轉載)http://www.aygfsteel.com/hanbiaoo/articles/136586.html卓韋卓韋Tue, 14 Aug 2007 02:36:00 GMThttp://www.aygfsteel.com/hanbiaoo/articles/136586.htmlhttp://www.aygfsteel.com/hanbiaoo/comments/136586.htmlhttp://www.aygfsteel.com/hanbiaoo/articles/136586.html#Feedback0http://www.aygfsteel.com/hanbiaoo/comments/commentRss/136586.htmlhttp://www.aygfsteel.com/hanbiaoo/services/trackbacks/136586.html數據和文檔,同時又可以忠實于該xml數據對應的xml結構和schema。本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans使它正常運行的全部過程。

 

XMLBeans來自于Bea,是使用java技術訪問和處理XML數據和文檔技術的一次突破性進展。第一次,開發者可以用自己熟悉的、方便的、面向對象的視圖來看待XML數據,同時又可以訪問該數據對應的結構和schema。                                 ――來自于Bea的關于XMLBeans的介紹

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

1 為什么使用XMLBeans

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

1. 使用DOMSAX來訪問XML數據和文檔的內容

2. 使用JAXB等技術將XML映射為java

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

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

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

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

3.   開發者可以使用這些java代碼輕松的讀/寫xml數據和文檔,而且被強制的執行xml schema中規定的一些約束。

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

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

1.   完全使用面向對象的觀點來看待和處理數據和文檔

2.   開發者不再需要編寫大量的代碼來訪問XML數據和文檔

3.   可以使用schema中規定的對于數據的約束條件,而不需要自己去編寫實現這些約束的代碼

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

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

2 環境和工具準備

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

XMLBeansjava實現請大家到bea的網站上下載:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp

在執行過程中,還需要用訪問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>

現在,要訪問的xml數據已經確定了,而且已經用schema來描述他了,剩下的就是使用XMLBeans來輔助生成訪問XML數據的java代碼了,下面的章節將詳細的介紹這部分內容

3.2    ant輔助生成訪問XML數據的java代碼

3.2.1      外部jar文件

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

3.2.2      增加的taskdef

編譯腳本執行時候必須增加一個XMLBeantaskdef,內容如下:

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

3.2.3      xmlbean

使用xmlbean標簽來生成訪問xml數據的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文件放在當前目錄下。

其中的參數簡單的說明如下:

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

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

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

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

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

Xmlbean標簽支持的其它參數和相關的說明請參考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文件

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

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

4 測試一下

4.1    測試代碼

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

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

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

PurchaseOrderDocument poDoc =

      PurchaseOrderDocument.Factory.parse(poFile);

//創建一個訪問該xml實例文檔的接口PurchaseOrder

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

*PurchaseOrder po = poDoc.getPurchaseOrder();

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

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

*個內部類出現的

*/

PurchaseOrderDocument.PurchaseOrder po = poDoc.getPurchaseOrder();

//直接過去其中的所有lineitem子元素的所有內容,他返回一個lineitem對象的數組.

  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    測試結果

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

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 總結

XMLBeansBea公司的一個公開源代碼項目,以Schema為基礎建立的、訪問xml的一種解決方法,提供了訪問和處理xml數據和文檔時既可以完全的訪問xml的內容、又不丟失xmlschema信息的強大功能。使用XMLBeans可以讓您用面向對象的觀點來對待和處理xml數據和文檔,同時又可以忠實于該xml數據對應的xml結構和schema

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

作者信息:

姓名: 肖菁

聯系方式: 0731-6665772,jing.xiao@chinacreator.com

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



卓韋 2007-08-14 10:36 發表評論
]]>
主站蜘蛛池模板: 大姚县| 蒙自县| 沐川县| 抚顺市| 东乌珠穆沁旗| 宁都县| 襄城县| 环江| 吉木乃县| 祁东县| 崇左市| 尉犁县| 肃北| 平顶山市| 简阳市| 永新县| 张家界市| 诸暨市| 肇州县| 磐石市| 普兰店市| 辽宁省| 兴海县| 西贡区| 绥宁县| 凌源市| 新竹市| 九江县| 高尔夫| 双流县| 兴和县| 汉中市| 芜湖县| 仲巴县| 奎屯市| 南乐县| 平利县| 浮山县| 怀集县| 郓城县| 嘉禾县|