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 卓韦 阅读(605) | 评论 (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 卓韦 阅读(5500) | 评论 (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 卓韦 阅读(668) | 评论 (0)编辑 收藏