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

          2007年9月25日


           什么是 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 的應用程序的集成開發環境。 

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

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

          實現文件的上傳,代碼如下:
          <%!
           //服務器端保存上傳文件的路徑
              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

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

          Jakarta 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.");
              }
            }
          };

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

          主站蜘蛛池模板: 南阳市| 德惠市| 建瓯市| 台山市| 房山区| 焦作市| 博湖县| 五峰| 迁西县| 阳城县| 长兴县| 晋城| 隆尧县| 保山市| 江津市| 沂水县| 金坛市| 宽甸| 壤塘县| 象山县| 台湾省| 祁阳县| 大庆市| 成都市| 吕梁市| 东安县| 湟源县| 湖口县| 民乐县| 海阳市| 雷山县| 囊谦县| 五峰| 汽车| 康平县| 龙岩市| 寿宁县| 丽水市| 东辽县| 三江| 弥渡县|