<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Emy</title>
    <description>天佑中华！</description>
    <link>http://emy.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>初探java内存机制</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/193577" style="color:red;">http://emy.javaeye.com/blog/193577</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>因为基础差，所以面对的问题都很低级<img src="../../../images/smiles/icon_sad.gif" alt="" /></p>
<p>问题的引入：</p>
<p>问题一：</p>
<p>String str1 = "abc"; <br />String str2 = "abc"; <br />System.out.println(str1==str2); //true </p>
<p>问题二：</p>
<p>String str1 =new String ("abc"); <br />String str2 =new String ("abc"); <br />System.out.println(str1==str2); // false </p>
<p>问题三：</p>
<p>String s1 = "ja";<br />String s2 = "va";<br />String s3 = "java";<br />String s4 = s1 + s2;<br />System.out.println(s3 == s4);//false<br />System.out.println(s3.equals(s4));//true</p>
<p>由于以上问题让我含糊不清，于是特地搜集了一些有关java内存分配的资料,以下是网摘：</p>
<p><strong>Java 中的堆和栈</strong><br />Java把内存划分成两种：一种是栈内存，一种是堆内存。 </p>
<p><span style="color: #ff0000;">在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配</span>。 <br /><br />&nbsp;&nbsp; 当在一段代码块定义一个变量时，Java就在栈中为这个变量分配内存空间，当超过变量的作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。 <br /><br />&nbsp;&nbsp; <span style="color: #ff0000;">堆内存用来存放由new创建的对象和数组。 <br /></span><br />&nbsp;&nbsp; 在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。 <br /><br />&nbsp;&nbsp; 在堆中产生了一个数组或对象后，还可以在栈中定义一个特殊的变量，让栈中这个变量的取值等于数组或对象在堆内存中的首地址，栈中的这个变量就成了数组或对象的引用变量。 <br /><br />&nbsp;&nbsp; 引用变量就相当于是为数组或对象起的一个名称，以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 <br />&nbsp; <br />具体的说：<br />栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br />&nbsp;&nbsp; &nbsp;&nbsp; Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br />&nbsp;&nbsp; &nbsp;&nbsp; 栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。 <br />&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #ff0000;"> 栈有一个很重要的特殊性，就是存在栈中的数据可以共享</span>。假设我们同时定义： <br />int a = 3; <br />int b = 3； <br />编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。这时，如果再令a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。 <br /><br />String是一个特殊的包装类数据。可以用： <br />String str = new String("abc"); <br />String str = "abc"; <br /><span style="color: #3366ff;">两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。 <br />而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向&rdquo;abc&rdquo;，如果已经有&rdquo;abc&rdquo; 则直接令str指向&ldquo;abc&rdquo;。 <br /></span><br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，</span>下面用例子说明上面的理论。 <br />String str1 = "abc"; <br />String str2 = "abc"; <br />System.out.println(str1==str2); //true <br />可以看出str1和str2是指向同一个对象的。 <br /><br />String str1 =new String ("abc"); <br />String str2 =new String ("abc"); <br />System.out.println(str1==str2); // false <br /><span style="color: #ff00ff;">用new的方式是生成不同的对象。每一次生成一个</span>。 <br />&nbsp;&nbsp; 因此用第二种方式创建多个&rdquo;abc&rdquo;字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。 <br />&nbsp;&nbsp; 另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。<br /><br /><br />java中内存分配策略及堆和栈的比较 <br />2.1 内存分配策略 <br />按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. <br />静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. <br />栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 <br />静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. <br /><br />2.2 堆和栈的比较 <br />上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈: <br />从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的，栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的: <br />在编程中，例如C/C++中，所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候，修改栈指针就可以把栈中的内容销毁.这样的模式速度最快, 当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时. <br />堆是应用程序在运行的时候请求操作系统分配给自己内存，由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间，因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间，也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中，要求创建一个对象时，只需用 new命令编制相关的代码即可。执行这些代码时，会在堆里自动进行数据的保存.当然，为达到这种灵活性，必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间！这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~). <br /><br />2.3 JVM中的堆和栈 <br />JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说，它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。 <br />我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的. <br />从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域，该区域具有先进后出的特性。 <br />每一个Java应用都唯一对应一个JVM实例，每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同，Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的，但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存，在堆中分配的内存实际建立这个对象，而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。</p>
<p>&nbsp;</p>
<p>&nbsp;从上面的讲述中大概明白是了最初三个问题怎么回事。<span style="font-size: medium; color: #993366;">希望高人能再补充下您觉得重要的知识点，谢谢</span></p>
<p>谢谢java明考了我这么一个问题<img src="../../../images/smiles/icon_cry.gif" alt="" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/193577#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 11:24:14 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/193577</link>
        <guid>http://emy.javaeye.com/blog/193577</guid>
      </item>
      <item>
        <title>【转】java学习书籍</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/191659" style="color:red;">http://emy.javaeye.com/blog/191659</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. Java语言基础 <br />谈到Java语言基础学习的书籍，大家肯定会推荐Bruce Eckel的《Thinking in Java》。它是一本写的相当深刻的技术书籍，Java语言基础部分基本没有其它任何一本书可以超越它。该书的作者Bruce Eckel在网络上被称为天才的投机者，作者的《Thinking in C++》在1995年曾获SoftwareDevelopment Jolt Award最佳书籍大奖，《Thinking in Java》被评为1999年Java World“最爱读者欢迎图书”，并且赢得了编辑首选图书奖。作者从1986年至今，已经发表了超过150篇计算机技术文章，出版了6本书（其中4本是关于C++的），并且在全世界做了数百次演讲。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者，同时还是《Black Belt C++》文集的编辑。他的书被读者称为“最好的Java参考书……绝对让人震惊”；“购买Java参考书最明智的选择”；“我见过的最棒的编程指南”。作者的非凡才华，极其跨越语言的能力，使作者被选为Java发展10年间与Java关系最密切的10个人物之一。 <br /><br />《Thinking in Java》讲述了Java语言的方方面面，很多Java语言的老手都评价“这是一本将Java语言讲得相当丑陋的书”。该书谈及了java语言的很多细节，每一个方面都是相当深刻的。通过本书你可以看到“丑陋的”java语言。 <br /><br />网络上关于java语言讲解的视频很多很多，其中不凡有垃圾。《翁恺—JAVA语言》可能是你学习java语言基础的唯一选择，该讲座基本按照《Thinking in Java》这本书讲解，其中不凡有翁老师的很多有意思的笑话。我很幸运学习就是从此视频开始的。内容包括30讲，我总共看了3遍。 <br /><br />不过，对于初学者我不太推荐使用《Thinking in Java》，我比较推荐Prentice Hall PTR 的《Core Java 2》国内称为《Java 2 核心技术》，目前是第七版。网络上大家都可以下载到电子版。Oreilly的《Java in a nutshell》也是一个不错的选择。读完以上两本后，你可以看看翁恺老师的视频，接着可以研究《Thinking in Java》了。 <br /><br /><br /><br />2. Java数据结构 <br />市面上关于Java数据结构的书本身就很少很少。大致有APress 的《Java Collections》，Jones 和Bartlett 的《Data Structures in Java》、《Object-oriented Data Structures Using Java》以及Prentice Hall 出版的《Data Structures and Algorithms in Java》 (Dec 19, 2005)还有一本就是《Data Structures And Algorithms With Object-oriented Design Patterns In Java》。很幸运我的第一本英文书就是APress 的《Java Collections》（本书在国内可能根本就没有中文版――只能下载英文版了），很不错，讲得很有条例、很简单，是一本完完全全Java Collections API介绍的书籍，其中不凡有扩展API的例子。这是我推荐你学习java数据结构的唯一一本好书。其它的Jones 和Bartlett的那两本国内好像有一本中文版，想看你也可以看看。 <br /><br />在学习完API后，你可以看看java.util包中对应的类了。不过只有在学习过设计模式后你才有可能完全理解整个Java Collections Framework。Java Collections Framework使用了很多著名的设计模式如：迭代器（Iterator）模式，工厂方法模式、装饰器模式、适配器模式等等。通过研究 java.util包中数据结构的源代码，你可以知道臭名昭著的Properties类的设计了，同时可能基本具备设计简单的数据结构的能力了。 <br /><br />所谓学习无止境，学习完Sun提供了Java Collections Framework后，你可以研究Apche的另一个Java Collections Framework，很有意思哦。互为补充的两个Framework。 <br /><br /><br /><br />在大家学习、研究Java Collections之前，我提示一下Java Collections主要包括以下三部分：接口（Interface）、实现（Implemention）和算法（Algorithm）。 <br /><br />1. 接口主要有List、Set、Queue和 Map。List 、Se t和Queue是 Collection接口的子接口。 <br /><br />2. 实现主要是实现这些接口的具体类。如实现List接口的ArrayList、LinkedList、Stack和Vector；实现Set接口的 HashSet、TreeSet 和LinkedHashSet；实现Queue接口的PriorityQueue、SynchronousQueue等等；实现Map接口的 HashMap、TreeMap、Hashtable、Properties、WeakHashMap等等。 <br /><br />3. 算法主要是由Arrays类和Collections类提供的，它是整个Java Collection Framework算法的核心。支持各种类型的排序，查找等常用操作。 <br /><br />Java Collections中包含两个版本的数据结构，主要是原先的支持同步的数据结构和后来不支持同步的数据结构。 <br /><br />Java Collection Framework在使用Comparator和Comparable接口支持排序。同时提供新旧两个版本的迭代器Iterator和Enumeraton，以及它们如何转换等等。 <br /><br />在java.util包中的Obserable接口和Observer类是考察者模式的核心。 <br /><br />…… <br /><br /><br /><br />3. Java IO <br />市面上关于IO的书籍也仅仅只有Oreilly出版社的两本，都是Elliotte Rusty Harold的著作。两本书的风格基本一致，推荐阅读是第一版的《Jvava I/O》，讲得比较浅显，内容相对比较集中，实例也很多。第二版今年5月国外才出版，很有幸我在网络上下载了第二版，讲得极其详细――726页的大块头（我化了两个星期），这次将NIO和IO和在一起，还包括J2ME部分的，不过串口、并口通信部分好像类库支持不够，自己不能实际操作。 <br /><br />与第一版的《Jvava I/O》一起的Oreilly还有一本《Jvava NIO》，也是很不错的哦。 <br /><br />大家在依次阅读完《Jvava I/O》以及《Jvava NIO》后，可以研究java.io包中的源代码了。在大家研究源代码前我给点提示： <br /><br />Java的io包主要包括： <br /><br />1. 两种流：字节流（byte Stream）和字符流（character stream），这两种流不存在所谓的谁代替谁、谁比谁高级之说，它们互为补充，只是侧重点不同而已。 <br /><br />2. 两种对称：1.字节流、字符流的对称；2.输入、输出的对称。 <br /><br />3. 一个桥梁：将字节流转变为字符流的InputStreamReader和OutputStreamWriter。 <br /><br />其中必须注意： <br /><br />1. PipedInputStream和PipedOutputStrem是两个比较有趣的类。 <br /><br />2. 支持Buffered的流是我们经常使用的类。 <br /><br />3. 装饰器（Decorator）模式在java最著名的应用就是用于io的设计。仔细研究各个Filter流与具体流的关系，多看设计模式的书籍。相信你会有所所获。 <br /><br />4. 学习好io包，是研究net包，rmi包……的基础哦！ <br /><br /><br /><br />4 . Java数据库 <br />数据库的书籍太多太多了，也是太烂太烂了！这方面的书我基本都研究过，推荐的你就看看Apress的《JDBC Recipes A Problem Solution Approach 》很不错，国外2005年底才出版，（国内好像没有中文版，不过出了中文版也不一定值得看――国内经常将国外的书翻译得一塌糊涂、不堪入目）不过我们真的很幸运，网络上有电子版的。值得一看。推荐我看的第一本比较满意的――Wiley出版的《Java Database Bible》，讲得很不错！Sun公司自己的关于JDBC API介绍的那一本《JDBC API Tutorial andRefernece》也不错。我第二本JDBC的就是研究的这套API。 <br /><br />不过目前这些书都是一些相对比较浮浅的API应用的书籍。有机会我会给大家带来介绍JDBC API以及JDBC实现内部细节的书！我尽快努力，同时希望得到大家的支持！ <br /><br />顺便给学习JDBC的朋友一点提示： <br /><br />JDBC的学习和使用主要是这套API，其使用过程也是极其简单，下面是使用JDBC的一般流程： <br /><br />1. 加载某个数据库的驱动（Driver类），通常使用Class.forName(“驱动的类名“); <br /><br />2. 连接数据库―― <br /><br />Connection con = DriverManager.getConnection(url,username,password)； <br /><br />3. 得到会话――Statement stmt = con.createStatement(); <br /><br />4. 执行操作――Result rs = stmt.executeQuery(“SQL查询语句”)； <br /><br />5. 处理结果―― <br /><br />while(rs.next()){ <br /><br />String col1 = rs.getString(1); <br /><br />…… <br /><br />} <br /><br />简单吧！整个JDBC中可以变化的一般是： <br /><br />1. 可以由Connection对象创建Statement、PreparedStatement和CallableStatement创建三种类型的Statement。 <br /><br />2. 可以创建多种类型的ResultSet：支持单向移动和个自由移动；可更新的和不可更新的；支持不同等级的交易的….. <br /><br />3. 数据输入的批处理。 <br /><br />4. 结果集中特殊类型（Blob、Clob、Arrary和Ref、Struct）列的操作。 <br /><br />5. 这些特殊类型的录入数据库。 <br /><br />6. javax.sql包中特殊结果集（CachedRowSet、JdbcRowSet、WebRowSet）的操作。 <br /><br />7. 其它的就是一个DataSource了，也很简单！一个J2EE中的被管理对象 <br /><br />简单吧！相信大家很快就会征服JDBC。 <br /><br /><br /><br />5. Java 网络编程 <br />网络编程――一个神秘的、充满挑战的方向。不过在谈Java网络编程之前首先感谢Sun公司的开发人员，因为它们天才的设想，充满智慧的架构，使广大java程序员学习java网络编程变得异常简单。 <br /><br />Java网络编程方面的书，我推荐O'Reilly的《Java Network Programming》，目前已经第三版了，以前的版本市面上肯定有！网络上早有第三版的电子版，国外2004年出版，706页哦！讲得很全，比较深入，太深入的可能由于Sun有些东西没有完全公开，所以也就不好讲了，有兴趣的可以下载看看！第二本还是O'Reilly 1998年出版的《Java distributed computing 》，基础部分写得比较详细，后面的实例还是值得研究的。 <br /><br />在大家阅读这些书之前，给大家一点提示： <br /><br />java网络编程其实相对比较简单，入门也很快很快。java网络编程主要包括两个部分：1.Socket；2.URL部分。不过第二部分也完全建立在第一部分的基础上。 <br /><br />1. Socket包括客户端的Socket和服务器端的ServerSocket。还有就是DatagramSocket和DatagramPacket，它对应于UDP通信协议。 总之，Socket部分是建立其它高级协议的基础。 <br /><br />2. URL类是一个网络资源定位器，通常和具体的网络协议如HTTP，FTP，Telnet……相关。通过该类可以连接网络上的资源，通过其 openStream可以以io包中的流（InputStream）的形式读取网络资源；通过其OpenConnection方法，可以打开一个连接，在此连接上可以不仅可以完成读的操作，还可以完成写的操作。 <br /><br />Java的网络编程大体包括以上两部分。网络编程和IO以及多线程部分非常密切，在学习此部分前大家一定对这两部分了解比较透彻。 <br /><br />学习了以上部分你可以研究java.net包中的与此相关的源代码了！研究所有的源代码还为时尚早。在整个net包中包含： ContentHandlerFactory、URLStreamHandlerFactory、URLStreamHandler、 URLClassLoader等辅助类，它们构成了java.net网络编程的框架，通过研究其源代码，你不仅可以快速理解java.net包，还可以为以后扩展该包打下基础，甚至可以将此思维方式运用到自己的项目中。 <br /><br />到此为止你对java.net包应该才了解60％，还有一部分你可以使用JDecompiler之类的反编译软件打开你JDK安装目录下\jdkxxx\ jre\lib目录中的rt.jar，用WinRAR之类的软件打开它的sun.net包，反编译所有的文件，它是URL类工作的细节。当研究完该 sun.net包，你就会对整个网络编程很熟悉很熟悉了。 <br /><br />一切看起来我们已经对网络编程很精通了。其实不然，刚刚开始而已，要想深入，请继续吧！网络上很多优秀的网络编程库甚至软件可以为我们“添加功力”。如 Apache的HttpCore和HTTPConnection 是两个和HTTP协议相关库；JGroups是研究分布式通信、群组通信的必读库；接着我们可以研究P2P的软件包，如Sun公司的JXTA，它可能是 java平台点对点通信未来的标准哦！接着你可以研究成熟得不得了，使用极其广泛得P2P软件Azureus！www.sourceforge.net可以下载到！ <br /><br />千里之行始于足下！Just do it ！（目前我也只研究了net包，其它的会在不久的将来继续深入。Sun公司因为某些原因没有公开net的其它实现细节，在其允许将其源代码以文字的形式加以研究，以及允许将其没有公开的实现写入书中时，我很希望能出一本java网络编程的书籍，以飧广大读者！！） <br /><br />6. Servlet和JSP <br />Servlet、JSP的书也是满地都是！值得推荐的也仅仅两三本。实推Addison Wiley的《Servlets and JavaServer pages ：The J2EE Technology Web Tier》，又是一本很厚的哦！国外2003年出版、784页，讲得比较全，例子也很多，特别是第八章Filter，举了几个不错的例子。其它所有我看到的关于Servlet和JSP的书都没有如此深入的！（可能有我没有看到而已）。O’reilly的《Java Servlet Programming》和《Java Server Pages》相对比较好懂一些，可以读读！ <br /><br />在大家学习Servlet和Jsp之前我还是要提醒一下： <br /><br />本质上说Servlet就是一个实现Servlet接口的、部署于服务器端的服务器端的程序罢了！它可以象写其它任何java应用程序一样编写，它可以操作数据库、可以操作本地文件、可以连接本地EJB……编写Servlet程序的一般流程为： <br /><br />1. 继承一个HttpServlet类； <br /><br />2. 覆盖其doGet、doPost方法； <br /><br />3. 在覆盖方法的内部操作方法参数HttpServletRequest和HttpServletResponse。 <br /><br />4. 读取请求利用HttpServletRequest。利用HttpServletRequest你可以操作Http协议的协议头、可以得到请求的操作方法、可以得到请求的路径、可以得到请求的字符串、以及和请求客户相关的信息，更主要的你可以得到Cookie和HttpSession这两个对象。 <br /><br />5. 利用Cookie你可以操作“甜心”对象或者将其写入HttpServletResponse中。 <br /><br />6. 向客户输出信息可以使用HttpServletResponse。使用HttpServletResponse可以写入各种类型的协议头、可以增加Cookie、可以重定向其它URL、可以向客户发送Http协议的状态码。 <br /><br />7. 利用HttpSession在会话内完成你想实现的任何功能。 <br /><br />同时Servlet还提供了一些事件和事件监听器（简单的观察者模式而已）。还有就是过滤器（Filter）和包装器（ServletRequestWrapper、ServletResponseWrapper）――简单的流的使用和装饰器模式的使用。 <br /><br />学习Sevlet、JSP必然要部署到服务器中，记住通常文件部署的步骤和参数的设置以及在程序中如何使用就可以了。 <br /><br />完全理解Servlet后，学习jsp相对比较容易了！Jsp完全建立在Servlet的基础上，它是为了迎合那些喜欢在Html文档中嵌入脚本（如：PHP之类的网页编程语言）的程序员的需要罢了！学起来也相当的容易！ <br /><br />一切看起来似乎那么的风平浪静，简单好学！简单的表象背后有其复杂的机理。要想对Servlet和Jsp彻底研究，你得研究Tomcat等开源软件的具体实现。它无非就是一个服务器，在客户利用网页通过HTTP协议向服务器发送请求后，服务器将此HTTP请求转化为相应的 HttpServletRequest对象，调用你编写的Servlet罢了，在你的Servlet中你肯定操作了此 HttpServletRequest了吧，同时操作了HttpServletResponse了吧，服务器就将此 HttpServletResponse按照HTTP协议的要求利用HTTP协议发送给你的浏览器了！在服务器端的Jsp网页在被客户请求后， Tomcat会利用编译软件，使用javax.servlet.jsp包中的模板，编译此jsp文件，编译后就是一个Servlet！以后的操作和 Servlet完全一样哦！ <br /><br />在Servlet和Jsp的基础上出现了，所谓的高级技术：JSTL，Struts……无非就是一些标签和MVC模式的使用。 <br /><br />继续前进吧！胜利就在前方！！ <br /><br /><br /><br />7. 多线程 <br />一个看起来很神秘，却很容易上手、很难精通的方向！ <br /><br />我推荐两本我感觉很好的书籍。首先是我第一本能上手看的这方面的书，Sams 1998年出版的《Java Thread Programming》，写得暴好，很容易读懂，我有空还时常看当时的笔记！要知道怎么好你自己看吧！第二本OReilly三次出版的《Java Threads》，最新是2004版，国内好像有中文版，推荐你还是看英文版的吧！书中谈到了与多线程相关的N个方向，如IO、Swing、 Collection等等。 <br /><br />给大家一点提示吧！java类库中与多线程相关的类不是很多，主要有：Thread、ThreadGroup以及ThreadLocal和 InheritableThreadLocal四个类和一个Runnable接口；关键字synchronize、volatile ；以及Object对象的wait、notify、notifyAll方法！ <br /><br />1 Thread是多线程的核心类，提供了一系列创建和操作多线程的方法。 <br /><br />2 ThreadGroup是一个管理Thread的工具类。 <br /><br />3 ThreadLocal和InheritableThreadLocal为Thread提供了一个类似保险箱功能的存储线程对象的类！ <br /><br />4 Runnable不用说了吧！ <br /><br />5 synchronize是同步方法和同步块的核心哦！多个线程调用此方法时，只有一个线程可以使用此方法，其它方法阻塞，从而保证被操作对象内部状态完整性。某个线程调用带有synchronize的方法或块时会得到该对象的对象锁，完成块中的操作后释放此对象锁，从而其它对象可以继续操作。 <br /><br />6 wait、notify、notifyAll提供了有效的等待/通知机制。Java语言中每一个对象都有一个休息室，任何线程在其操作的对象的状态不满足的情况下，在该对象的休息室中休息，释放对象锁；当其它线程操作该对象后，唤醒休息室中的线程，它们再检查条件，当条件满足后，执行相应的操作。 <br /><br />多线程大致就这么多基础的！简单吗！这对于一个真正的程序员应该是不够的，真正对多线程要有所掌握，请您研究java.util.concurrent包吧！大师Doug Lea的作品，原先是一个开源的一致性编程的库，后来被Sun公司并入java类库。作者的网站上也有另外一个版本的该类库！值得研究的好东西! Hibernation、OpenJMS等开源软件都使用了此包！ <br /><br /><br /><br />8. 设计模式 <br />谈到设计模式很多人多会推荐GOF的那本，该书在Amzon上是五星级的推荐书籍。不过对于学习java没多久的、特别是java初学者，我很不推荐这本书。主要是该书的例子基本都是C++的，很多细节没有讲述得足够清楚。 <br /><br />我给大家推荐的第一本是阎宏博士的《Java 与模式》，它是第一本中国人自己写的关于设计模式的书籍，写的比较有趣，融合了很多中华民族的文化和观念，例子、类图都比较多，且相对简单！非常不错的入门书籍――又是大块头哦！ <br /><br />其次我推荐Wiley出版社出版的《Pattern In Java》一套三本，我才看了第一本，好像第二本不怎么样，第三本还不错！ <br /><br />第三本是中文翻译版的关于多线程模式的（很难得的中文翻译版）中国铁道出版社2003年出版的《Java多线程设计模式》，将多线程模式讲得非常浅显，配有大量的图例，每章都有习题，最后有答案！我研究多线程模式就是由它开始的！ <br /><br />第四本，今年出版的Head First系列的《Head First Design Pattern》，秉承Head First系列图书的优点，大量的类图、丰富的实例、有趣的注解，值得购买！ <br /><br />其次在J2EE方向你可以研究阅读Addison Wesley 2002年出版的《Patterns of Enterprise Application Architecture》，众多大腕的作品，讲企业消息集成的！Sun提供的《J2EE PATTERNS SL500》也很好！晚了推荐那一本Amzon 4星半的《Holub on patterns》，大师的作品，提供了，很值得研究的例子，不过对上面四本不是很熟悉的读者，最好不要读它！可能会让你比较累！ <br /><br />我学习设计模式经过一段很曲折的路线，前前后后大约看了20本，阎宏博士的《Java 与模式》我看了4遍，还排除我第一次基本没看懂的看！记得研一时老师给我们讲了GOF的那本，作为选修课，我和它们计算机系的硕士、博士们一起，到最后一个班40－50个人，不超过3个人明白，我也没有明白任何一点（基础差吧――主要我对C++语言一点都不了解），凭我不伏输的性格，我认为我对java语言理解还可以，我就借了《Java 与模式》，结果还是基本没看懂。很有幸的是读研三时，听过了上交大饶若楠老师关于Java OOP语言的讲座，我懂了组合书籍模式等三种设计模式后，对其它模式有了强烈的兴趣和要征服它的愿望！工作后我买的第一本就是《Java 与模式》，第一遍花了2个月研究了这个1000多页的大块头，后来第三遍15天左右就可以搞定，笔记记了一大本！从此一发不可收拾。 <br /><br />选对书、埋头研究。相信很快就会入门的！ <br /><br /><br /><br />学习Java语言8个简单的部分，这只是我们研究Java语言的开始！这些都懂了充其量一个java程序员而已，后面的路很长很长！我们可以继续研究数据库实现的源代码、Servlet服务器的源代码、RMI、EJB、JNDI、面向方面编程、重构、ANT工具、Eclipse工具、Spring工具、 JBoss、JOnAS、Apache Geronimo等J2EE服务器！研究了这些你可能会成为一个出色的J2EE Architecture！你可以继续研究剖析器、编译器、JNODE（java写的操作系统）……
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/191659#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 May 2008 09:39:00 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/191659</link>
        <guid>http://emy.javaeye.com/blog/191659</guid>
      </item>
      <item>
        <title>java字体设置，包括大小，颜色，加粗，下划线，对齐，斜体的设置，很全!!</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/188913" style="color:red;">http://emy.javaeye.com/blog/188913</a>&nbsp;
          发表时间: 2008年05月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想做一个文本编辑器的朋友，来这里是找对了！！<br />下面的代码告诉我们该怎么在文本编辑器中设置字体大小，颜色，加粗，下划线等许多便捷操作~<br />花了很长的时间找了这么一个资料，真是累煞我了~~！！<br />差点都要放弃了，最后终于在网络中搜索到了这么一段十分有用、十分有价值的东东！<br />感谢网络java程序员精英的大公无私，为我们奉献了这么好的代码~~十分感谢！<br />若转载，请注明我在下面注明的转载出处，十分感谢~~~~<br />本文转自：http://www.blogjava.net/Swing/archive/2007/12/26/128965.html<br /><br /><br /><br />import java.awt.BorderLayout;<br />import java.awt.Color;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener; <br />import javax.swing.JButton;<br />import javax.swing.JEditorPane;<br />import javax.swing.JPanel;<br />import javax.swing.JScrollPane;<br />import javax.swing.JTextPane;<br />import javax.swing.UIManager;<br />import javax.swing.WindowConstants;<br />import javax.swing.text.AttributeSet;<br />import javax.swing.text.DefaultStyledDocument;<br />import javax.swing.text.Document;<br />import javax.swing.text.EditorKit;<br />import javax.swing.text.MutableAttributeSet;<br />import javax.swing.text.SimpleAttributeSet;<br />import javax.swing.text.StyleConstants;<br />import javax.swing.text.StyledDocument;<br />import javax.swing.text.StyledEditorKit;<br /><br />public class NewJFrame extends javax.swing.JFrame implements ActionListener {<br /> private JPanel jp1;<br /><br /> private JButton color;<br /><br /> private JTextPane jep;<br /><br /> private JScrollPane jsp;<br /><br /> private JButton font;<br /><br /> /**<br />  * Auto-generated main method to display this JFrame<br />  */<br /> public static void main(String[] args) {<br />  NewJFrame inst = new NewJFrame();<br />  inst.setVisible(true);<br /> }<br /><br /> public NewJFrame() {<br />  super();<br />  initGUI();<br /> }<br /><br /> private void initGUI() {<br />  try {<br />   BorderLayout thisLayout = new BorderLayout();<br />   getContentPane().setLayout(thisLayout);<br />   setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);<br />   {<br />    jp1 = new JPanel();<br />    getContentPane().add(jp1, BorderLayout.NORTH);<br />    {<br />     font = new JButton();<br />     font.addActionListener(this);<br />     jp1.add(font);<br />     font.setText("font");<br />    }<br />    {<br />     color = new JButton();<br />     jp1.add(color);<br />     color.addActionListener(this);<br />     color.setText("color");<br />    }<br />   }<br />   {<br />    jsp = new JScrollPane();<br />    getContentPane().add(jsp, BorderLayout.CENTER);<br />    {<br />     jep = new JTextPane();<br />     jsp.setViewportView(jep);<br />     jep.setDocument(new DefaultStyledDocument());<br />    }<br />   }<br />   pack();<br />   setSize(400, 300);<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }<br /><br /> public static void setFontSize(JEditorPane editor, int size) {<br />  if (editor != null) {<br />   if ((size > 0) && (size &lt; 512)) {<br />    MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontSize(attr, size);<br />    setCharacterAttributes(editor, attr, false);<br />   } else {<br />    UIManager.getLookAndFeel().provideErrorFeedback(editor);<br />   }<br />  }<br /> }<br /><br /> public static void setForeground(JEditorPane editor, Color fg) {<br />  if (editor != null) {<br />   if (fg != null) {<br />    MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setForeground(attr, fg);<br />    setCharacterAttributes(editor, attr, false);<br />   } else {<br />    UIManager.getLookAndFeel().provideErrorFeedback(editor);<br />   }<br />  }<br /> }<br /><br /> public static final void setCharacterAttributes(JEditorPane editor,<br />   AttributeSet attr, boolean replace) {<br />  int p0 = editor.getSelectionStart();<br />  int p1 = editor.getSelectionEnd();<br />  if (p0 != p1) {<br />   StyledDocument doc = getStyledDocument(editor);<br />   doc.setCharacterAttributes(p0, p1 - p0, attr, replace);<br />  }<br />  StyledEditorKit k = getStyledEditorKit(editor);<br />  MutableAttributeSet inputAttributes = k.getInputAttributes();<br />  if (replace) {<br />   inputAttributes.removeAttributes(inputAttributes);<br />  }<br />  inputAttributes.addAttributes(attr);<br /> }<br /><br /> protected static final StyledDocument getStyledDocument(JEditorPane e) {<br />  Document d = e.getDocument();<br />  if (d instanceof StyledDocument) {<br />   return (StyledDocument) d;<br />  }<br />  throw new IllegalArgumentException("document must be StyledDocument");<br /> }<br /><br /> protected static final StyledEditorKit getStyledEditorKit(JEditorPane e) {<br />  EditorKit k = e.getEditorKit();<br />  if (k instanceof StyledEditorKit) {<br />   return (StyledEditorKit) k;<br />  }<br />  throw new IllegalArgumentException("EditorKit must be StyledEditorKit");<br /> }<br /><br /> public void actionPerformed(ActionEvent e) {<br />  Object obj = e.getSource();<br />  if (obj == font) {<br />   JEditorPane editor = jep;<br />   setFontSize(editor, 20);<br />  }<br />  if (obj == color) {<br />   JEditorPane editor = jep;<br />   setForeground(editor, Color.red);<br />  }<br /> }<br /><br />}<br />其他操作如下：<br />1、对字体的操作 <br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontFamily(attr, family);<br />    setCharacterAttributes(editor, attr, false); <br />family为字体<br />2、对字体大小的操作<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setFontSize(attr, size);<br />    setCharacterAttributes(editor, attr, false);<br />size为字号<br />3、是否是粗体的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean bold = (StyleConstants.isBold(attr)) ? false : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setBold(sas, bold);<br />   setCharacterAttributes(editor, sas, false);<br />4、是否是斜体的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean italic = (StyleConstants.isItalic(attr)) ? false : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setItalic(sas, italic);<br />   setCharacterAttributes(editor, sas, false);<br />5、是否有下划线的操作<br />StyledEditorKit kit = getStyledEditorKit(editor);<br />   MutableAttributeSet attr = kit.getInputAttributes();<br />   boolean underline = (StyleConstants.isUnderline(attr)) ? false<br />     : true;<br />   SimpleAttributeSet sas = new SimpleAttributeSet();<br />   StyleConstants.setUnderline(sas, underline);<br />   setCharacterAttributes(editor, sas, false);<br />6、左中右对齐的处理<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />   StyleConstants.setAlignment(attr, a);<br />   setParagraphAttributes(editor, attr, false);<br />public static final void setParagraphAttributes(JEditorPane editor,<br />   AttributeSet attr, boolean replace) {<br />  int p0 = editor.getSelectionStart();<br />  int p1 = editor.getSelectionEnd();<br />  StyledDocument doc = getStyledDocument(editor);<br />  doc.setParagraphAttributes(p0, p1 - p0, attr, replace);<br /> }<br />a:0：左，1：中，2：右<br /><br />7、文本字体颜色的设置<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setForeground(attr, fg);<br />    setCharacterAttributes(editor, attr, false);<br />fg：为color<br />8、文本背景颜色的设置<br />MutableAttributeSet attr = new SimpleAttributeSet();<br />    StyleConstants.setBackground(attr, bg);<br />    setCharacterAttributes(editor, attr, false);
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/188913#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 May 2008 20:35:12 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/188913</link>
        <guid>http://emy.javaeye.com/blog/188913</guid>
      </item>
      <item>
        <title>pop3常用命令</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/187330" style="color:red;">http://emy.javaeye.com/blog/187330</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          pop3（post office protocol）：该程序定义了邮件客户端与pop3服务器进行通信的具体规则和细节，用于邮件的接收过程。<br /><br />rfc1939文档中对pop3进行了定义，它采用的网络监听端口默认为110.<br />pop3协议中共定义了12条命令。<br /><br />具体如下：<br />user username<br />该命令是pop3邮件客户端与邮件服务器建立链接后通常发送的第一条命令，username是收件人的帐户名称<br /><br />pass password<br />user成功登录后，pass命令用于传送用户明码<br /><br />apop name，digest<br />它一md5摘要的形式向pop3邮件服务器提交帐户密码，用于替代user、pass命令；<br /><br />stat<br />用于查询邮箱中的统计信息<br /><br />uidl msg#<br />用于查询某封邮件的唯一标识符，msg#表示邮件的序号<br /><br /><br />list【msg#】<br />用于列出邮箱中的邮件信息msg#是不可选的参数，就是列出所有邮件，并列出序列<br /><br />retr msg#<br />用于列出msg#所指的某封邮件的内容<br /><br />dele msg#<br />删除msg#所指的邮件，pop3执行该命令时并不是真正把邮件删除，只有pop3客户端发出quit命令后，pop3服务器才真正删除所有设置了标记的邮件<br /><br />rset <br />用于清除所有邮件的删除标记<br /><br /><br />top msg# n<br />用于获取某封邮件的邮件头和邮件体中的前n行内容，n表示要返回的邮件的前n行内容<br /><br />noop<br />用于检测客户端与服务器的链接情况<br /><br />quit <br />结束邮件接收过程，pop3接收到此命令后删除所有设置标记的邮件，并关闭与pop3客户端程序的网络链接。
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/187330#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Apr 2008 20:08:31 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/187330</link>
        <guid>http://emy.javaeye.com/blog/187330</guid>
      </item>
      <item>
        <title>SMTP常用命令</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/186955" style="color:red;">http://emy.javaeye.com/blog/186955</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          通过下面的介绍，相信你可以手动实现邮件的发送程序，但你必须先准备一个程序用来进行BASE64Encoder的转换。这个程序不是很麻烦，有兴趣可以自己动手做下。<img src="/images/smiles/icon_wink.gif"/><br /><br />不多说，下面开始这次的正文：<br /><br />SMTP（simple mail transfer protocl简单邮件传输协议)，定义了邮件客户端软件与smtp服务器之间，以及两来smtp服务器之间的通信规则。<br /><br />smtp协议中定义了18条命令，但常用的有如下6条命令：<br /><br /><br /><br />下面就回顾下今天重新复习了的smtp命令：<br /><br />smtp命令及格式：<br />ehlo &lt;domain> <br />该命令是smtp邮件发送程序与smtp邮件接收程序建立连接后必须发送的第一条smtp 命令，记着，一定是第一条，否则会有麻烦了<img src="/images/smiles/icon_cool.gif"/>.&lt;domain>表示smtp邮件发生者的主机名。<br />它替代了传统smtp协议中的helo命令。<br /><br />auth &lt;para><br />如果smtp邮件接收程序需要smtp邮件发送程序进行认证时，它会提示所采用的认证方式，smtp邮件发送程序应该使用这个命令回应smtp邮件接收程序<br /><br />mail From：&lt;reverse-path><br />用于指定邮件发送者的邮箱地址<br /><br />rcpt To：&lt;forword-path><br />用于指定邮件接收者的邮箱地址，如果有多个邮件接收者，应该多次使用该命令，每次指定一个接收者邮箱地址<br /><br />data <br />表示smtp邮件程序开始传送数据，知道遇见独立行的英文句号“.”结束<br /><br />quit<br />结束邮件发送，关闭smtp邮件发送程序的网络链接<br /><br />以上是常用的6个简单命令，读者要是想知道更多内容可以参考rfc821文档中定义的。<br /><br /><br /><br />ps：我已经手动尝试了，遇见了一个找不到base64encoder的问题，不知道有没有哪位大侠能指导下了···多谢了·！！~！<img src="/images/smiles/icon_cry.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/186955#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 22:49:01 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/186955</link>
        <guid>http://emy.javaeye.com/blog/186955</guid>
      </item>
      <item>
        <title>java开发测试工具</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/185612" style="color:red;">http://emy.javaeye.com/blog/185612</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我的第一份工作就是做软件测试，虽然现在还不是很明白是怎么回事，但是，遇见这方面的文章时 ，我也会特别的留意一下，用不用它，先收集了再说。<br /><br /><br /><br />JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架（regression testing framework）。Junit测试是程序员测试，即所谓白盒测试，因为程序员知道被测试的软件如何（How）完成功能和完成什么样（What）的功能。Junit是一套框架，继承TestCase类，就可以用Junit进行自动测试了。 <br /><br /><br /> Cactus  Cactus是一个基于JUnit框架的简单测试框架，用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等<br /><br /><br /> Abbot Abbot是一个用来测试Java GUIs的框架。用简单的基于XML的脚本或者Java代码，你就可以开始一个GUI。<br /><br /><br /> JUnitPerf Junitperf实际是junit的一个decorator，通过编写用于junitperf的单元测试，我们也可使测试过程自动化。<br /><br /><br /> DbUnit DbUnit是为数据库驱动的项目提供的一个对JUnit 的扩展，除了提供一些常用功能，它可以将你的数据库置于一个测试轮回之间的状态。 <br /><br /><br /><br /> Mockrunner Mockrunner用在J2EE环境中进行应用程序的单元测试。它不仅支持Struts actions, servlets，过滤器和标签类还包括一个JDBC和一个JMS测试框架，可以用于测试基于EJB的应用程序。<br /><br /><br /><br /> DBMonster DBMonster是一个用生成随机数据来测试SQL数据库的压力测试工具。<br /><br /><br /><br /> MockEJB MockEJB是一个不需要EJB容器就能运行EJB并进行测试的轻量级框架。<br /><br /><br /><br /> StrutsTestCase StrutsTestCase 是Junit TestCase类的扩展，提供基于Struts框架的代码测试。StrutsTestCase同时提供Mock 对象方法和Cactus方法用来实际运行Struts ActionServlet，你可以通过运行servlet引擎来测试。因为StrutsTestCase使用ActionServlet控制器来测试你的代码，因此你不仅可以测试Action对象的实现，而且可以测试mappings，from beans以及forwards声明。StrutsTestCase不启动servlet容器来测试struts应用程序（容器外测试）也属于Mock对象测试，但是与EasyMock不同的是，EasyMock是提供了创建Mock对象的API，而StrutsTest则是专门负责测试Struts应用程序的Mock对象测试框架。 <br /><br /><br /><br /> JFCUnit JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持；为在一个部件层次定位部件提供支持；为在部件中发起事件（例如按一个按钮）以及以线程安全方式处理部件测试提供支持。<br /><br /><br /><br /> JTestCase JTestCase 使用XML文件来组织多测试案例数据，声明条件（操作和期望的结果），提供了一套易于使用的方法来检索XML中的测试案例，按照数据文件的定义来声明结果。<br /><br /><br /><br /> SQLUnit SQLUnit是一个单元测试框架，用于对数据库存储过程进行加归测试。用 Java/JUnit/XML开发。 <br /><br /><br /><br /> JTR JTR (Java Test Runner)是一个开源的基于反转控制(IOC)的J2EE测试框架。它允许你构建复杂的J2EE测试套件(Test Suites)并连到应用服务器执行测试,可以包括多个测试实例。JTR的licensed是GPL协议。<br /><br /><br /> Marathon Marathon是一个针对使用Java/Swing开发GUI应用程序的测试框架，它由recorder, runner 和 editor组成，测试脚本是python代码。Marathon的焦点是放在最终用户的测试上。<br /><br /><br /><br /> TestNG TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架，但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如：<br />*支持JSR 175注释（JDK 1.4利用JavaDoc注释同样也支持）<br />*灵活的Test配置<br />*支持默认的runtime和logging JDK功能<br />*强大的执行模型（不再TestSuite）<br />*支持独立的测试方法。<br /><br /><br /><br /> Surrogate Test framework Surrogate Test framework是一个值得称赞单元测试框架，特别适合于大型，复杂Java系统的单元测试。这个框架能与JUnit,MockEJB和各种支持模拟对象（mock object ）的测试工具无缝给合。这个框架基于AspectJ技术。<br /><br /><br /><br /> MockCreator MockCreator可以为给定的interface或class生成模拟对象（Mock object）的源码。<br />更多MockCreator信息<br /><br /> jMock jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展，让你快速简单地定义mock objects,因此不必打破程序间的关联，让你定义灵活的超越对象之间交互作用而带来测试局限，减少你测试地脆弱性。<br /><br /><br /><br /><br /> EasyMock EasyMock为Mock Objects提供接口并在JUnit测试中利用Java的proxy设计模式生成它们的实例。EasyMock最适合于测试驱动开发。<br /><br /><br /><br /> Grinder Grinder是一个开源的Java负载测试框架，它通过很多负载注射器来为分布式测试提供了便利。<br /><br />支持用于执行测试脚本的Jython脚本引擎 <br />HTTP测试可通过HTTP代理进行管理。<br /><br /><br /><br /> XMLUnit XMLUnit不仅有Java版本的还有.Net版本的。Java开发的XMLUnit提供了两个JUnit 扩展类XMLAssert和XMLTestCase,和一组支持的类。这些类可以用来比较两张XML之间的不同之处，展示XML利用XSLT来,校验XML,求得XPath表达式在XML中的值,遍历XML中的某一节点利DOM展开,<br /><br /><br /><br /> Jameleon Jameleon一个自动化测试工具。它被用来测试各种各样的应用程序，所以它被设计成插件模式。为了使整个测试过程变得简单Jameleon提供了一个GUI,因此Jameleon实现了一个Swing 插件。<br /><br /><br /><br /> J2MEUnit J2MEUnit是应用在J2ME应用程序的一个单元测试框架。它基于JUnit.<br /><br /><br /><br /> Jetif Jetif是一个用纯Java实现的回归测试框架。它为Java程序单元测试以及功能测试提供了一个简单而且可 伸缩的架构，可以用于个人开发或企业级开发的测试。它容易使用，功能强大，而且拥有一些企业级测试的 重要功能。Jetif来源于JUnit, JTestCase以及TestNG的启发，有几个基本的概念直接来自于JUnit， 比如说断言机制，Test Listener的概念，因此从JUnit转到Jetif是非常容易的。<br /><br /><br /><br /> GroboUtils GroboUtils使得扩展Java测试变得可能。它包括用在Java不同方面测试的多个子项目。在GroboUtils中最常被到的工具是:多线程测试(multi-threaded tests),整体单元测试(hierarchial unit tests),代码覆盖工具(code coverage tool)。<br /><br /><br /><br /> Testare TESTARE是用来简化分布式应用程序(比如:在SERVLETS,JMS listeners, CORBA ORBs或RMI环境下)测试开发过程的一个测试框架.<br /><br /><br /><br /> MockLib MockLib是一个很小的包所以可容易地动态创建一个模拟对象.你可以从模拟的系统中抛出异常来确保你的系统能够正确处理错误.它同样也是一个线程安全的模拟对象库.<br /><br /><br /><br /> JellyUnit JellyUnit是一个基于Jelly的JUnit测试机制.它允许用Jelly脚本来完成单元测试.尤其是对于XML,XPath,SQL,HTTP,JMS和SOAP交互的测试特别有用.<br /><br /><br /><br /> Pisces 这个项目继承于JUnit目的是提供一个分布式的测试环境.它给开发者/测试人员一个运行远程JUnits和复杂测试案例的能力，这个案例由几个并行运行的远程JUnit测试组成。<br /><br /><br /><br /> JUnitEE JUnitEE是对JUnit的一个简单扩展，可以支持在一个J2EE应用程序服务器上执行标准的测试案例。它主要由一个把测试结果输出为html的servlet组成。<br /><br /><br /><br />XTest是一个新的测试框架,它主要是为NetBeans IDE提供测试功能而开发的.但它也可以用于测试其它Java产品.XTest是基于Ant的,这就意味着它允许用户使用所有Ant的tasks.<br /> <br /><br /> UISpec4J UISpec4J是专门用于Swing应用程序单元测试的一个开源组件,它构建在JUnit测试套件的基础之上.UISpec4J让Java GUI测试变得很简单.它的特殊之处在于它的APIs设计成尽可能地隐藏Swing的复杂性,因此易于测试脚本的读与写.以下这它的简单例子:<br /> public void testContacts() {<br />         Table contacts = getMainWindow().getTable();<br />          contacts.assertContentEquals(new Object[][]{<br />              {"John", "12", Boolean.FALSE},<br />              {"Sylvia", "43", Boolean.TRUE},<br />              {"Bill", "31", Boolean.FALSE}<br />          });<br />  }<br /><br /><br /><br /> iValidator iValidator是一个基于XML的方案自动测试与复杂环境中集成测试的框架。它的特性包括：单元测试的可重复使用性，代码与数据分离，提供Eclipse插件，支持所有测试levels等。<br /><br /><br /><br /> Jeté Jeté是一个系统集成测试框架。它让系统测试变得更容易并且采用非常易于理解与足够灵活的方式来测试现存的系统。这是因为Jeté：<br /> - 基于XML(Spring上下文文件)的系统测试定义文件,一个系统测试的定义是由在这些文件中定义的几个action和对每一个action定义的几个validators所组成。由于使用Spring context文件作为测试定义文件可把现存的POJOs无缝合线的结合到系统测试框架中；<br /> - 扩展了 JUnit,DbUnit和HttpUnit的基本功能来使用已知的测试概念。<br /> - 集成了JUnit、Ant提供测试状态的图形化报告。<br /><br /><br /><br /> MockCentral MockCentral提供一种利用mock对象进行测试的新方式。它把mock对象定义在测试代码之外的XML文件中并允许开发人员创建，访问这些mock对象，这能够让测试案例变得简洁并有利于组织和复用mock对象。<br /><br /><br /><br /><br /> STclass STclass是一个基于Contract(由于B. Meyer在Design by Contract：合约设计方式中定义)的单元测试框架，它是JUnit的一个克隆，但是可与JUnit相匹敌。该框架能够把测试结果生成XML的报表格式，然后加工处理成漂亮的HTML报表。STclass集成JIP剖析器，可以在测试期间进行statisitic与 profiling分析，并把结果加到HTML报表中。<br /><br /><br /><br /> SpringUnit SpringUnit用于Java软件单元和综合测试的开源框架。它把Spring的依赖注入容器与JUnit的测试框架相结合来实现数据驱动测试。<br /><br /><br /><br /> lattu lattu是一个用于测试Eclipse RCP应用程序的框架。它能够进行单元测试与功能测试。实质上，它是一个Eclipse插件提供适当的扩展来进行单元与确认测试。lattu使用JUnit来实单元测试，Abbot来实现GUI测试。<br /><br /><br /><br /> Unitils Unitils这个Java开源类包的目的是让单元测试变得更加容易和可维护。Unitils构建在DBUnit与EasyMock项目之上并与JUnit和TestNG相结合。支持数据库测试，支持利用mock对象进行测试并提供与Spring和Hibernate相集成。Unitils设计成以一种高度可配置和松散偶合的方式来添加这些服务到单元测试中。<br />在进行数据库测试时能够：<br />  <br />自动维护和强制关闭单元测试数据库（支持Oracle，Hsqldb，MySql，DB2），<br />  <br />简化单元测试数据库连接的设置，<br />  <br />简化利用DBUnit测试数据的插入，<br />  <br />简化Hibernate session管理，<br />  <br />自动测试与数据库相映射的Hibernate映射对象。<br />在利用Mock对象进行测试时能够：<br />  <br />简化EasyMock mock对象创建，<br />  <br />简化mock对象注入，利用反射等式匹配EasyMock参数。<br />在与Spring集成时易于把spring管理的bean注入到单元测试中，支持在单元测试中使用一个用Spring配置的Hibernate SessionFactory。<br /><br /><br /><br /> Ejb3Unit Ejb3Unit用于在容器外对EJB3实体（Entity）和会话（Session）Bean进行自动测试。 Ejb3Unit是JUnit的一个扩展并能对所有JEE或EJB3项目自动执行独立junit测试。其脱离容器的方式能够缩短构建-测试周期，因为不需要容器部署。EJb3Unit默认使用一个内置的内存数据库，但也可以指定自己定义的数据库。<br /><br /><br /><br /> p-unit p-unit是一款开放源码的性能测试框架，和JUnit不同，JUnit 关注的是测试案例的正确性，而p-unit不仅关注测试案例的正确性，还收集测试案例的性能参数，默认情况下，p-unit收集测试案例的时间和内存消耗情况，可以产生文件，图片，和PDF格式的报表。此外，p-unit 还支持参数化测试，多线程测试以及不同Java 虚拟机性能之间的比较。<br /><br /><br /><br /> JEasyTest  JEasyTest是一个Eclipse IDE插件开发用于简化那些难于用标准mock object框架进行单元测试的代码，比如使用继承关系的代码。<br /><br /><br /><br /> FEST-Swing FEST-Swing是一个用于Swing GUI应用程序功能测试的java开源类库。支持模拟用户交互（鼠标操作和键盘输入）。支持JDK中的所有Swing组件。提供简洁、强大的API来创建和维护GUI功能测试。支持在HTML测试报告中嵌入GUI测试失败的截屏。能够与JUnit或TestNG一起使用
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/185612#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 19:51:51 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/185612</link>
        <guid>http://emy.javaeye.com/blog/185612</guid>
      </item>
      <item>
        <title>java开源打包工具分类</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/185609" style="color:red;">http://emy.javaeye.com/blog/185609</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面是我收集的资料，用来制作jar的工具，自己动作做很麻烦，以前做过，没有想够要用工具来做，现在既然有工具可以使用，为什么不用更方便的方法呢~~~~<br /><br />JPackIt JPackIt可以把Java工程打包成一个可执行的包(如:jar,class或exe).包括所有Java应用程序资源如:代码,图片,属性文件和被引用的第三方包.<br /><br /><br /><br />IzPack<br />IzPack 是一个 Java 安装程序制作工具，能够制作一些简单的安装程序。制作出来的安装程序能在 Unix-like, MacOS X, Windows 等系统平台上运行。 <br /> <br /><br /><br />JSmooth<br /> JSmooth 使用JSmooth将做好的JAR包装成EXE。<br /><br /><br /><br /> launch4j launch4j是Java应用程序的Windows本地可执行文件 (.exe) 封装器。提供了本地弹出屏幕，应用程序图标，JRE搜索或使用绑定的JRE，启动失败反馈，传递命令行参数，ant脚本。 <br /><br /><br /><br /> VAInstall VAInstall是多平台的安装程序。你要包装起来的软件可以是可执行的 java class， Windows .EXE， Linux 可执行档，或者是 UNIX shell 档案。使用者可以选择四种安装的介面，graphic, xtra, text 或是 ansi。VAInstall 只需要很少的空间，他不会使用任何大的暂存档案，而且还可以很容易使用反安装功能。<br /><br /><br /><br /><br /><br /> Toolshed Toolshed是一个既小又简单的JAVA安装制作工具。<br /><br /><br /> AntInstaller AntInstaller通过XML文件定义UI，用Ant做后台。所以ANT所能做的事情AntInstaller同样也胜任。<br /><br /><br /> FreeInstaller FreeInstaller能够把JAVA程序打包成多种平台下的应用程序比如UNIX, LINUX 和 Windows NT.<br /><br /><br /> ROXES ANT Tasks 这个工具利用 ANT 来制作在 Windows, MacOS X, Unix 平台上可执行的文件，比如 exe，zip，jar。ROXES ANT Tasks 基于 GPL 发布。<br /><br /><br /> Mini Installer Mini Installer是用来构建JAVA安装程序一个简单类包。整个过程以脚本为驱动，最后结果是一个独特的JAR文件。用户可以通过双击来执行一个类似向导的安装过程。<br /><br /><br /> Antigen Antigen (Ant Installer Generator)这个工具结合一个ANT构建脚本与一个GUI来把Java文件打包成可执行的Jar文件。它的主要目的是从Ant脚本创造一个强大的图形安装工具。 <br /><br /><br /> Packlet Packlet是一个针对Java的简单安装工具。一个Packlet类似于一个zip或tgz文件。它把应用程序打包成一个单一的可分解的压缩文件。Packlet文件能够在任何有安装Java 2运行环境的机器上运行。<br /><br /><br /> Java Service Wrapper Java Service Wrapper可以把Java应用程序安装成一个Windows NT服务或Unix Daemon.它同时还为应用程序提供日记功能,灵活的配置,可靠的运行性能,按需求重新启动,简化应用程序的安装等,<br /><br /><br /><br /><br /> One-JAR One-JAR可以解决如何把一个依赖于多个其它jar文件的应用程序发布成一个单一的可执行Jar文件.它使用一个可定制的类装载器(classloader)来打开在主Jar中的Jar文件包. <br />更多One-JAR信息<br /><br /> Autojar Autojar帮助从不同的inputs(如：自身classes,外部文档等)制作最小的Jar文件。它从一个或多个给定的classes开始，依据字节码(bytecode)递归搜索相关联的classes，然后从input文档中提取这些Classes,并把它们拷贝到output中. 最终的文档将只包含真正需要的classes. 因而能够保持applet的大小并降低applet的加载时间或者让应用程序独立于第三方类库。<br />更多Autojar信息<br /><br /> MJAR MJAR(Managed Jar Framework)Java软件分发/打包框架。它允许在相同VM内并行部署classloader分离的应用程序。MJAR使用Spring框架来管理内部组件。<br />更多MJAR信息<br /><br /> NativeJ NativeJ是一个采用Java1.5开发的打包工具。利用NativeJ可把Java应用程序制作成真正独立不依赖于JRE的本地(windows,linux与mac)可执行程序(如Windows中的.exe) 。支持SWT,JFace,AWT和Swing 。 <br />更多NativeJ信息
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/185609#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 19:44:19 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/185609</link>
        <guid>http://emy.javaeye.com/blog/185609</guid>
      </item>
      <item>
        <title>GUI小程序【JTable】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/184712" style="color:red;">http://emy.javaeye.com/blog/184712</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          该程序用于窗口显示邮件帐户管理视图： <br /><br />import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br />import javax.swing.table.DefaultTableModel;<br />public class TableDemo extends JPanel {<br />	private JLabel jlabel1=null;<br />	private JButton jbt1=null,jbt2=null,jbt3=null,jbt4=null;<br />	private JScrollPane jscrollpane=null;<br />	private JTable table=null;<br />	private DefaultTableModel tableModel=null;<br />	<br />	<br />	public TableDemo(){<br />		super();<br />        CreateAndShow();<br />        }<br />	<br />	public void  CreateAndShow(){<br />		<br />		<br />		   JFrame frame=new JFrame("帐户管理");<br />		   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />		   <br />	<br />		   <br />		   frame.getContentPane().setLayout(null);<br />		   frame.getContentPane().add(getjlabel1(),null);<br />		   frame.getContentPane().add(getjbt1(),null);<br />		   frame.getContentPane().add(getjbt2(),null);<br />		   frame.getContentPane().add(getjbt3(),null);<br />		   frame.getContentPane().add(getjbt4(),null);<br />		   frame.getContentPane().add(getjscrollpane(),null);<br />		   <br />		   <br />		   <br />		<br /><br />		   frame.setSize(500,350);<br />		   frame.setLocation(250,200);<br />		   frame.setResizable(false);<br />		<br />		  <br />		<br />		   frame.setVisible(true); <br />	      <br />	}<br />	JLabel getjlabel1(){<br />		if(jlabel1==null){<br />			jlabel1=new JLabel("用户信息",JLabel.LEFT);<br />			jlabel1.setBounds(10,5,100,30);<br />			<br />		}<br />		return  jlabel1;<br />	}<br />	JButton getjbt1(){<br />		if(jbt1==null){<br />			jbt1=new JButton("新建");<br />			jbt1.setBounds(400,30,65,23);<br />			<br />		}<br />		return jbt1;<br />	}<br />	<br />	JButton getjbt2(){<br />		if(jbt2==null){<br />			jbt2=new JButton("删除");<br />			jbt2.setBounds(400,70,65,23);<br />		}<br />		return jbt2;<br />	}<br />	<br />	JButton getjbt3(){<br />		if(jbt3==null){<br />			jbt3=new JButton("修改");<br />			jbt3.setBounds(400,110,65,23);<br />			<br />		}<br />		return jbt3;<br />	}<br />	JButton getjbt4(){<br />		if(jbt4==null){<br />			jbt4=new JButton("关闭");<br />			jbt4.setBounds(400,150,65,23);<br />			<br />		}<br />		return jbt4;<br />	}<br />	JScrollPane getjscrollpane(){<br />		if(jscrollpane==null){<br />			final String[] columnName={"帐号名称","email地址"};<br />			final Object[][] data = null;<br />			DefaultTableModel tableModel=new DefaultTableModel(data,columnName);<br />		    JTable table=new JTable(tableModel);<br />		    table.setPreferredScrollableViewportSize(new Dimension(150, 70));<br />	        table.setFillsViewportHeight(true);<br />	        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);<br />			<br />			jscrollpane=new JScrollPane(table);<br />			jscrollpane.setBounds(10,30,370,250);<br />		}<br />		return jscrollpane;<br />	}<br />	<br />	<br />	<br />	<br />	<br />	public static void main(String[] args) {<br />		// TODO Auto-generated method stub<br />		new TableDemo();<br /><br />	}<br /><br />}
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/184712#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 09:30:11 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/184712</link>
        <guid>http://emy.javaeye.com/blog/184712</guid>
      </item>
      <item>
        <title>java程序员要掌握的东东【我的奋斗目标】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/184546" style="color:red;">http://emy.javaeye.com/blog/184546</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一：J2SE <br />面向对象－封装、继承、多态 <br />内存的分析 <br />递归 <br />集合类、泛型、自动打包与解包、Annotation <br />IO <br />多线程、线程同步 <br />TCP/UDP <br />AWT、事件模型、匿名类 <br />正则表达式 <br />反射机制 <br /><br />2：数据库（Oracle或者MySQL） <br />SQL语句 <br />多表连接，内外连接， 子查询等 <br />管理表、视图、索引、序列、约束等 <br />树状结构存储 <br />存储过程、触发器 <br />数据库设计三范式、 <br /><br />3：JDBC <br />JDBC基础 <br />连接池 <br />树状结构存储与展现 <br />DataSource & RowSet <br />JDBC连接Oracle及MySQL <br /><br />4：HTML_CSS_JAVASCRIPT <br />html、css、javascript基础语法 <br />JavaScript Form判断 <br />Dom编程基础（事件处理等） <br />JS常用效果如TreeView、下拉联动等 <br />JS学习方法 <br />JS调试方法 <br />DreamWeaver初步（建立HTML、Table、Form、CSS）等 <br /><br />5：Servlet & JSP <br /><br />tomcat基础 <br />servlet基础 <br />web.xml配置基础 <br />web application的结构 <br />servlet生命周期 <br />request response等常用方法 <br />ServletContext类 <br />HTTP协议基础（GET POST） <br />Cookie <br />Session <br />Application <br /><br />JSP的几种语法（包括JSTL等）注意在项目中练习，不要拘泥于语法细节而裹步不前。 <br /><br />6：Struts <br />多层架构理论 <br />Model 1 and Model 2 <br />Struts基本概念 <br />MVC <br />Action与业务逻辑类的关系 <br />在Struts与JSP之间传递数据 <br />Struts处理流程（控制流） <br />Struts TagLib（了解常用的） <br />JSTL <br />ActionForm <br />字段收集 <br />上传文件 <br />类型转换 <br />DTO <br />动态Action Form <br />验证框架 <br />ActionForward 转发与重定向 <br />动态生成ActionForward <br />全局与局部的ActionForward <br />Action Forward Scope <br />UnknownActionMapping <br />Action的线程安全 <br />I18N <br />如何切换语言环境 <br />Struts异常处理机制 程序处理 自动处理 自定义异常处理器 <br />Struts的多模块配置 <br /><br />7：XML <br />（XML/XSL、XSLT/DTD、SCHEMA等基础的概念、关于Java的编程可以暂时扔在一边） <br /><br />8：Hibernate <br />OR Mapping原理 <br />Hibernate基础开发步骤 <br />Hibernate基本接口（重点Session） <br />普通属性映射 <br />关联关系映射 <br />Native SQL <br />inverse lazy cascade <br />继承关系映射 <br />HQL <br />性能优化 一级缓存 二级缓存 查询缓存 <br />事务与并发 悲观锁、乐观锁 <br />OpenSessionInView <br />CurrentSession <br />（至于JTA、联合主键、自然主键、动态主键、Any类型 Creteria Queries Intercepter and Event 自定义类型等，可以暂时扔在一边） <br /><br />9：Spring <br />IOC/DI <br />Spring配置 <br />Spring架构 <br />AOP及Spring AOP <br />声明式事务（AOP） <br />Spring + Hibernate Spring支持Web <br />Scope <br />（其他的Spring模块对于自学来说可以暂时扔在一边） <br /><br />10：EJB3.0 <br />J2EE架构基础（JTA JMS等） <br />EJB基础（地位及基本理论、分类等） <br />Annotation <br />Ant编译与部署EJB <br />Session Bean <br />EJB的依赖注入 <br />Persistence API <br />（可以用JBoss学习EJB3.0） <br /><br />11:至于SOA，对于自学的同学来说，暂时不用特别关注。
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/184546#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 12:16:21 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/184546</link>
        <guid>http://emy.javaeye.com/blog/184546</guid>
      </item>
      <item>
        <title>GUI小程序【JTree】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/184522" style="color:red;">http://emy.javaeye.com/blog/184522</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          只对初学者或许有用<img src="/images/smiles/icon_wink.gif"/><br /><br />import java.awt.*;<br /><br />import javax.swing.*;<br />import javax.swing.tree.DefaultMutableTreeNode;<br />import javax.swing.JFrame;<br /><br /><br />public class Mytree extends JFrame{<br />     private DefaultMutableTreeNode root,red,green,blue;<br />     private JTree jtree1;<br /><br />  private JPanel jpanel1;<br /> //  private JLabel jlabel;<br /><br />     private JFrame frame;<br />     <br />     Mytree(){<br />    	 <br />    	 super();<br />    	<br />    	 <br />    	 initilize();<br /> 		<br /> 	}<br />     <br />     public void initilize(){<br />    	 frame=new JFrame("mytree");<br />    	 <br />    	 root=new DefaultMutableTreeNode("Color");<br />    	 red=new DefaultMutableTreeNode("red");<br />    	 blue=new DefaultMutableTreeNode("green");<br />    	 green=new DefaultMutableTreeNode("green");<br />    	 <br />    	 root.add(red);<br />    	 root.add(blue);<br />    	 root.add(green);<br />    	 <br />    	 jtree1=new JTree(root);<br />    	 <br />    	<br />    	// jlabel=new JLabel("123456789",JLabel.CENTER);<br />    	 <br />    	 jpanel1=new JPanel();<br />    <br />    	 <br />    	 <br />    	 JSplitPane jsplitpane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,<br />    			                           jtree1,jpanel1);<br />    	 jsplitpane.setOneTouchExpandable(true);<br />    	 jsplitpane.setMinimumSize(new Dimension(100,50));<br />    	 <br />    	 frame.getContentPane().add(jsplitpane);<br />    	<br />    	 <br />    	 <br /> <br />    	 <br />    	 frame.setSize(600,500);<br />    	 frame.setLocation(50,50);<br />    	 frame.setVisible(true);<br />    	 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);<br />    	<br /><br />    	 <br />    	 <br />    	 <br />    	 <br />     }<br />     <br />     public static void main(String[] args){<br />    	 new Mytree();<br />     }<br />      <br />     <br />     <br />	<br /><br />}
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/184522#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 09:24:21 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/184522</link>
        <guid>http://emy.javaeye.com/blog/184522</guid>
      </item>
      <item>
        <title>GUI小程序【splitpane】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/184519" style="color:red;">http://emy.javaeye.com/blog/184519</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          学习需要，想做一个可以改变大小的面板，java学的不是很好，<img src="/images/smiles/icon_sad.gif"/>不知道怎么弄后来搜索下了，可以使用JSplitPane，比较简单<img src="/images/smiles/icon_wink.gif"/>下面是一个简单演示： <img src="/images/smiles/icon_smile.gif"/><br /><br /><br /><br /><br />import java.awt.*;<br /><br />import javax.swing.*;<br /><br />public class MysplitpaneDemo extends JFrame{<br />	private JButton jb1,jb2;<br />	private JSplitPane jsplitpane1,jsplitpane2;<br />	private JScrollPane jsp;<br />	private JLabel jlabel1,jlabel2; <br />	<br />	public MysplitpaneDemo(){<br />		super();<br />		initilize();<br />		<br />	}<br />	<br />	public void initilize(){<br />		JFrame frame=new JFrame("splitpane");<br />		jlabel1=new JLabel("Emy_Love_javaeye_left",JLabel.CENTER);<br />		jlabel2=new JLabel("Emy_Love_javaeye_right",JLabel.CENTER);<br />		<br />		jsplitpane1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,<br />				                jlabel1,jlabel2);<br />		<br />		jsplitpane1.setOneTouchExpandable(true);<br />		jsplitpane1.setDividerLocation(150);<br />		<br />		jlabel1.setMinimumSize(new Dimension(100, 30));<br />		jlabel2.setMinimumSize(new Dimension(100,30));<br />		<br />		frame.getContentPane().add(jsplitpane1);<br />		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />		frame.setSize(700,600);<br />		frame.setLocation(100,100);<br />		frame.setVisible(true);<br />		<br />		<br />		<br />	}<br /><br />	/**<br />	 * @param args<br />	 */<br />	public static void main(String[] args) {<br />		// TODO Auto-generated method stub<br />		new MysplitpaneDemo();<br /><br />	}<br /><br />}
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/184519#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 09:11:21 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/184519</link>
        <guid>http://emy.javaeye.com/blog/184519</guid>
      </item>
      <item>
        <title>GUI小程序【GridBagLayout】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/184517" style="color:red;">http://emy.javaeye.com/blog/184517</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          自己做练习编写的小程序：GridBagLayout布局使用<br />下面是自己写的代码<br /><br />package layout;<br />import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br /><br />public class ShowGridBagLayout extends JApplet{<br />	private JLabel jbl1=new JLabel("resize the window and study gridbaglayout",JLabel.CENTER);<br />    private JTextArea jta1=new JTextArea("jtextarea1",5,15);<br />    private JTextArea jta2=new JTextArea("jtextarea2",5,15);<br />    private JTextField jtf=new JTextField("JTextField");<br />    private JPanel jp=new JPanel();<br />    private JButton jbt1=new JButton("jbutton1");<br />    private JButton jbt2=new JButton("jbutton2");<br />    private JFrame jf=new JFrame("GridBagLayout");<br />    <br />    public ShowGridBagLayout(){<br />    	Container c=jf.getContentPane();<br />    	c.setLayout(new GridBagLayout());<br />    	GridBagConstraints gbConstraints=new GridBagConstraints();<br />    	<br />    	gbConstraints.fill=GridBagConstraints.BOTH;<br />    	gbConstraints.anchor=GridBagConstraints.CENTER;<br />    	addComp(jta1,c,gbConstraints,0,0,1,4,0,0);<br />    	addComp(jta2,c,gbConstraints,1,0,2,1,5,1);<br />    	addComp(jtf,c,gbConstraints,1,3,1,1,5,1);<br />    	addComp(jbt1,c,gbConstraints,3,1,1,1,5,0);<br />    	addComp(jbt2,c,gbConstraints,3,2,1,1,5,0);<br />    	<br />    	jp.setBackground(Color.blue);<br />    	jp.setBorder(new javax.swing.border.LineBorder(Color.black));<br />    	gbConstraints.insets=new Insets(10,10,10,10);<br />    	addComp(jp,c,gbConstraints,1,1,2,2,10,1);<br />    	<br />    	jf.setSize(500,500);<br />    	jf.setLocation(200,200);<br />    	jf.setVisible(true);<br />    	<br />    	<br />    }<br />    <br />    public void addComp(Component c,Container container,<br />    		GridBagConstraints gbConstraints,<br />    		int row,int column,<br />    		int numberOfRows,int numberOfColumn,<br />    		double weightx,double weighty){<br />    	gbConstraints.gridx=column;<br />    	gbConstraints.gridy=row;<br />    	gbConstraints.gridwidth=numberOfColumn;<br />    	gbConstraints.gridheight=numberOfRows;<br />    	gbConstraints.weightx=weightx;<br />    	gbConstraints.weighty=weighty;<br />    <br />    	container.add(c,gbConstraints);<br />    }<br />}
          <br/>
          <span style="color:red;">
            <a href="http://emy.javaeye.com/blog/184517#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 09:00:25 +0800</pubDate>
        <link>http://emy.javaeye.com/blog/184517</link>
        <guid>http://emy.javaeye.com/blog/184517</guid>
      </item>
      <item>
        <title>【Java开源 J2EE框架】</title>
        <author>Emy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://emy.javaeye.com">Emy</a>&nbsp;
          链接：<a href="http://emy.javaeye.com/blog/178752" style="color:red;">http://emy.javaeye.com/blog/178752</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spring Framework 【Java开源 J2EE框架】<br />Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而，这仅仅是完整图景中的一部分：Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象，包括简单和有效率的JDBC框架，极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R mapping解决方案。Spring还提供了唯一的事务管理抽象，它能够在各种底层事务管理技术，例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架，它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的aspects。这个框架足够强大，使得应用程序能够抛开EJB的复杂性，同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。【SpringIDE：Eclipse平台下一个辅助开发插件】.<br /><br />WebWork 【Java开源 Web框架】<br />WebWork是由OpenSymphony组织开发的，致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1，现在的WebWork2.x前身是Rickard Oberg开发的WebWork，但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。 Xwork简洁、灵活功能强大，它是一个标准的Command模式实现，并且完全从web层脱离出来。 Xwork提供了很多核心功能：前端拦截机（interceptor），运行时表单属性验证，类型转换，强大的表达式语言（OGNL – the Object Graph Notation Language），IoC（Inversion of Control倒置控制）容器等。 WebWork2建立在Xwork之上，处理HTTP的响应和请求。WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类), session（会话）application（应用程序）范围的映射，request请求参数映射。WebWork2支持多视图表示，视图部分可以使用JSP, Velocity, FreeMarker, JasperReports，XML等。在WebWork2.2中添加了对AJAX的支持，这支持是构建在DWR与Dojo这两个框架的基础之上.【EclipseWork：用于WebWork辅助开发的一个Eclipse插件】<br /><br />Struts 【Java开源 Web框架】<br />Struts是一个基于Sun J2EE平台的MVC框架，主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求，简单易用，敏捷迅速，在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中，开发人员利用其进行开发时不用再自己编码实现全套MVC模式，极大的节省了时间，所以说Struts是一个非常不错的应用框架。【StrutsIDE：用于Struts辅助开发的一个Eclipse插件】<br /><br />Hibernate 【Java开源 持久层框架】<br />Hibernate是一个开放源代码的对象关系映射框架，它对JDBC进行了非常轻量级的对象封装，使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合，既可以在Java的客户端程序实用，也可以在Servlet/JSP的Web应用中使用，最具革命意义的是，Hibernate可以在应用EJB的J2EE架构中取代CMP，完成数据持久化的重任。Eclipse平台下的Hibernate辅助开发工具:【Hibernate Synchronizer】【MiddlegenIDE】<br /><br />Quartz 【Java开源 日程安排(Job Schedulers)】<br />Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个，百个，甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 1.5.0。<br /><br />Velocity 【Java开源 模板引擎】<br />Velocity是一个基于java的模板引擎（template engine）。它允许任何人仅仅简单的使用模板语言（template language）来引用由java代码定义的对象。 当Velocity应用于web开发时，界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点，也就是说，页面设计人员可以只关注页面的显示效果，而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来，这样为web站点的长期维护提供了便利，同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域，例如，它可以从模板（template）产生SQL和PostScript、XML，它也可以被当作一个独立工具来产生源代码和报告，或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务（template service）。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 【VeloEclipse ：Velocity在Eclipse平台下的一个辅助开发插件】<br /><br />IBATIS 【Java开源 持久层框架】<br />使用ibatis 提供的ORM机制，对业务逻辑实现人员而言，面对的是纯粹的Java对象， 这一层与通过Hibernate 实现ORM 而言基本一致，而对于具体的数据操作，Hibernate 会自动生成SQL 语句，而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等 “全自动”ORM机制而言，ibatis 以SQL开发的工作量和数据库移植性上的让步，为系统 设计提供了更大的自由空间。作为“全自动”ORM 实现的一种有益补充，ibatis 的出现显 得别具意义。<br /><br />Compiere ERP 【Java开源 ERP与客户关系管理】<br />这一高价值的商业应用程序，易于安装、易于实施、易于使用。只需要短短几个小时，您就可以使用申购-采购-发票-付款、报价-订单-发票-收款、产品与定价、资产管理、客户关系、供应商关系、员工关系、经营业绩分析等强大功能了！功能未减，实施时间缩减到 4 小时。最重要的是：这一高价值的商业应用程序是免费的！可以自行安装和实施这套系统（如果您略懂 Oracle 和 Java 技术）。<br />中文站点:http://www.compiere-china.com/<br /><br />Roller Weblogger   【Java开源 博客(Blog)】<br />这个weblogging 设计得比较精巧，源代码是很好的学习资料。它支持weblogging应有的特性如：评论功能，所见即所得HTML编辑，TrackBack，提供页面模板，RSS syndication,blogroll管理和提供一个XML-RPC 接口。<br /><br />displytag 【Java开源 Jsp标签库】<br />与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮、完善。 <br /><br />JFreeChart 【Java开源 报表制作】<br />JFreeChart它主要是用来制作各种各样的图表，这些图表包括：饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。<br /><br />Eclipse 【Java开源 开发工具】<br />Eclipse平台是IBM向开发源码社区捐赠的开发框架，它之所以出名并不是因为IBM宣称投入开发的资金总数 —4千万美元，而是因为如此巨大的投入所带来的成果：一个成熟的、精心设计的以及可扩展的体系结构。<br /><br />Liferay 【Java开源 门户系统】<br />代表了完整的J2EE应用，使用了Web、EJB以及JMS等技术，特别是其前台界面部分使用Struts 框架技术，基于XML的portlet配置文件可以自由地动态扩展，使用了Web Services来支持一些远程信息的获取，使用 Apahce Lucene实现全文检索功能。<br />主要特点：<br />  1、提供单一登陆接口，多认证模式（LDAP或SQL）;<br />  2、管理员能通过用户界面轻松管理用户，组，角色；<br />  3、用户能可以根据需要定制个性化的portal layout;<br />  4、能够在主流的J2EE应用服务器上运行，如JBoss+Jetty/Tomcat,JOnAS；<br />  5、支持主流的数据库，如PostgreSQL,MySQL；<br />  6、使用了第三放的开源项目，如Hibernate, Lucene, Struts；<br />  7、支持包括中文在内的多种语言；<br />  8、采用最先进的技术 Java, EJB, JMS, SOAP, XML；<br /><br />JetSpeed 【Java开源 门户系统】<br />Jetspeed是一个开放源代码的企业信息门户(EIP)的实现, 使用的技术是Java和XML. 用户可以使用浏览器, 支持WAP协议的手机或者其它的设备访问Jetspeed架设的信息门户获取信息. Jetspeed扮演着信息集中器的角色, 它能够把信息集中起来并且很容易地提供给用户. <br />Jetspeed具有如下的特征: <br /><br />* 即将成为标准化的Java Portlet API <br />* 基于模板的布局, 包括JSP和Velocity <br />* 通过开放的内容同步技术支持远程XML内容交换 <br />* 定制默认的主页 <br />* 使用数据库进行用户认证 <br />* 内存缓存技术, 加快页面的响应 <br />* 通过Rich Site Summary技术, 支持同步内容 <br />* 和Cocoon, WebMacro, Velocity集成. <br />* Wireless Markup Language (WML) 支持 <br />* 使用XML格式的配置文件注册portlet. <br />* 完整的Web Application Archive (WAR) 支持 <br />* Web应用程序开发的基础设施 <br />* 可以在本地缓存远程内容 <br />* 与Avantgo同步 <br />* 可移植到所有支持JDK1.2和Servlet 2.2的平台 <br />* 与Turbine模块和服务集成 <br />* 可以根据用户, 安装媒体类型和语言的不同设定, 产生不同的个性化服务 <br />* 持续化服务使得所由的portlet能够容易的存储每个用户的状态, 页面和portlet <br />* 使用皮肤技术使得用户可以选择portlet的颜色和显示属性 <br />* 自定义功能是的管理员可以选择portlet以及定义个人页面的布局 <br />* 在数据库中存储PSML <br />* 通过Jetspeed的安全portlets管理用户, 组,角色和权限 <br />* 基于角色对访问portlet进行控制 <br /><br /><br />JOnAS 【Java开源 EJB服务器】<br />JOnAS是一个开放源代码的J2EE实现，在ObjectWeb协会中开发。整合了Tomcat或Jetty成为它的Web容器，以确保符合Servlet 2.3和JSP 1.2规范。JOnAS服务器依赖或实现以下的Java API：JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。<br /><br />Turbine 【Java开源 Web框架】<br />Turbine是基于Servlet的框架包，也是开放源代码Jakarta项目。目前还没有关于Turbine的大量文档。它类似于Struts，但是有一些主要区别。突出的一点就是它并没有与JSP耦合。Turbine的特点是它提供了大量可重用的组件。此框架包中包含了大量组件，但是这些组件是离散的。它似乎应该给出更多的组件库，但是由于它缺少文档，所以很难掌握完整的体系结构。<br /><br />Tapestry 【Java开源 Web框架】<br />Tapestry是一个开源的基于servlet的应用程序框架，它使用组件对象模型来创建动态的，交互的web应用。一个组件就是任意一个带有jwcid属性的html标记。其中jwc的意思是Java Web Component。Tapestry使得java代码与html完全分离，利用这个框架开发大型应用变得轻而易举。并且开发的应用很容易维护和升级。Tapestry支持本地化，其错误报告也很详细。Tapestry主要利用javabean和xml技术进行开发。【Spindle:Tapestry辅助开发Eclipse插件】．<br /><br />Lucene 【Java开源 搜索引擎】<br />Apache Lucene是一个开放源程序的搜寻器引擎，利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引，索引让搜寻的效率比传统的逐字比较大大提高，Lucen提供一组解读，过滤，分析文件，编排和使用索引的API，它的强大之处除了高效和简单外，是最重要的是使使用者可以随时应自已需要自订其功能。 <br /><br />iText 【Java开源 PDF类库】<br />iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本，表格，图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。<br /><br />Beanshell 【Java开源 脚本语言】<br />Beanshell是用Java写成的，一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器，具有对象脚本语言特性。BeanShell执行标准Java语句和表达式，另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法（simple method closure）来支持，就如同在Perl和JavaScript中的一样。　它具有以下的一些特点：使用Java反射API以提供Java语句和表达式的实时解释执行；可以透明地访问任何Java对象和API；可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行；与在应用程序中一样，可以在小程序中（Applet）正常运行（无需编译器或者类装载器）；非常精简的解释器jar文件大小为175k<br /><br />OpenCms 【Java开源 内容管理系统(CMS)】<br />OpenCms是一个J2EE的产品，它是用Java写成的。它和Tomcat捆绑在一起。但是也能够使用ATG Dynamo、WebLogic和WebSphere。OpenCms支持多种RDBMS来保存内容，包括Oracle、SQL Server、Sybase和mySQL。新版本提供了一个新的模板引擎，JSP支持，一种新的连接管理系统，提高了稳定性。 <br /><br />JUnit 【Java开源 Java测试工具】<br />JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架（regression testing framework）。Junit测试是程序员测试，即所谓白盒测试，因为程序员知道被测试的软件如何（How）完成功能和完成什么样（What）的功能。Junit是一套框架，继承TestCase类，就可以用Junit进行自动测试了。 <br /><br />opencrx 【Java开源 ERP与客户关系管理】<br />opencrx很容易与你现存的系统集成 (ERP, IVR, CTI, ...)是你对你以前投资的最大保护而且openCRX支持大多数通用技术，例如 RMI, CORBA, JMS, SOAP, 以及 JCA; openCRX也包括了支持典型插件的智能前台，例如文档管理,库存跟踪, 设备管理,等. openCRX 可以运行于任意J2EE兼容的应用服务器 (e.g. JBoss, BEA WebLogic or IBM WebSphere) 和主流数据库 (e.g. MaxDB, Firebird, PostgreSQL, MS SQL, Oracle, or IBM DB2). 容易定制 基于 XML 的定制：径直的，迅速的以及可行的（包括多语言特性) 容易扩展写下你自己的工作流，或者发展可扩展的—得益于openCRX的基于组件的体系和像 J2EE,MDA 等的开放标准，这是一个很简单的任务。（摘自http://www.opencrx.com.cn/crx/） <br /><br />BlueJ 【Java开源 开发工具】<br />BlueJ是一个专门为入门级教学设计的JavaTM 开发环境。它是由澳大利亚墨尔本Monash大学BlueJ小组设计并开发的。<br /><br />XWiki 【Java开源 Wiki引擎】<br />XWiki是一个强大的Java开源的Wiki引擎。它支持一些受欢迎的特性如：<br />* 内容管理(浏览/编辑/预览/保存)，<br />* 支持附件，<br />* 版本控制，<br />* 全文本搜索，<br />* 权限管理<br />* 使用Hibernate进行数据存储，<br />* RSS输出与显示外部的RSS feeds，<br />* 多语言支持，<br />* 提供XML/RPC的API,<br />* WYSIWYG HTML编辑器,<br />* 导出为PDF<br />* Groovy脚本支持等等....。<br /><br />EJBCA 【Java开源 网络服务器】<br />EJBCA是一个全功能的CA系统软件，它基于J2EE技术，并提供了一个强大的、高性能并基于组件的CA。EJBCA兼具灵活性和平台独立性，能够独立使用，也能和任何J2EE应用程序集成。<br /><br />Laszlo 【Java开源 XML用户界面工具包】<br />利用OpenLaszlo免费平台可以快速地，简单地开发漂亮Web 应用程序。这些Web应用程序可以运行在当前任何流行的浏览器与桌面操作系统。它只需要一个XML文件。【IDE4Laszlo：Eclipse下的辅助开发工具】<br /><br />JXTA 【Java开源 其它开源项目】<br />Sun微系统公司公开了旨在建立P2P(Peer to Peer)通用技术基础的JXTA计划。JXTA技术是网络编程和计算的平台，用以解决现代分布计算尤其是点对点(P2P)计算中出现的问题。<br />JXTA将建立核心的网络计算技术，提供支持在任何平台、任何地方以及任何时间实现P2P计算的一整套简单、小巧和灵活的机制。JXTA首先将归纳目前P2P的功能特别，而后建立核心的技术来表达目前的P2P计算的局限性。其重点是创建基本的机制，而具体的策略选择权则交给应用的开发者。JXTA将充分利用XML、Java等开放技术，使得UNIX操作系统更强大和灵活，比如利用管道(Pipes)传输Shell命令实现复杂的计算任务。JXTA支持P2P应用的基本功能来建立一个P2P系统，还将努力证实这些可以成为建立更高层功能的基础构造模块。JXTA架构可以分为三个层面：JXTA核心层、JXTA业务层和JXTA应用层。 <br /><br />最近更新 <br /><br /><br />--------------------------------------------------------------------------------<br /><br />EcSplorer 【Java开源 Eclipse插件】<br />EcSplorer(Eclipse Simplified Explorer)是一个类似于 Windows Explorer的Eclipse插件，它可以帮助你在不退出Eclipse的环境下浏览本地文件系统。<br /><br />Echo2 【Java开源 AJAX开发】<br />Echo2是Echo Web框架的下一代版本。一个可以用于开发基于Web胖客户端应用程序的框架。 这2.0版还是沿用Echo的核心思想但Echo2通过它新的AJAX表现层引擎提供生动的用户界面而且还提高了整体性能和实用性．<br /><br /><br />OpenEdit 【Java开源 内容管理系统(CMS)】<br />OpenEdit包括三大模块Web内容管理，电子商务，博客。Web内容管理包括在线编辑，动态布局，拼写检查(英文)， 用户管理，文件管理，版本控制和通告工具。电子商务模块包括在线产品目录管理，购物车，电子付款，产品展示与产品高级搜索(利用Nutch/Lucene的web爬行与搜索功能进行高级搜索所以不需要用数据库的功能). Blog模块包括在线管理，评论，注册和RSS/Atom引擎。 OpenEdit运用到的开源组件有：Velocity,Dom4j,Spring,Lucene。<br /><br />Role Playing Tools 【Java开源 Java游戏】<br />这是一个为传统角色扮演游戏提供相关工具的开源项目。当前包括的工具有：MapTool：这是一个可在C/S架构上为多个玩家提供地图与地图数据共享的图形工具。DiceTool：这是一个能够在角色扮演游戏中推测死亡表达式的工具，它还可通过JavaScripts扩展各种计算。TokenTool：方便创建MapTool标记(tokens).<br /><br /><br />OpenToro 【Java开源 内容管理系统(CMS)】<br />OpenToro是一个可以让我们以灵活和自动的方式来开发web数据库应用程序的工具．利用OpenToro可以省掉在开发一个Web数据库应用程序时编写JSP与SQL代码这样辛苦乏味的工作．利用它就可以很容易地列出数据库中的表格与其它内容并生成可以新增,修改,删除的数据.OpenToro兼容所有支持SQL-92标准语法的数据库如:MySQL,Oracle,Access,与SQL-Server. <br /><br />HtmlSave 【Java开源 Eclipse插件】<br />这是一个可以把Eclipse编辑器中Java源代码或其它语言的源代码存为HTMl格式的插件。<br /><br />eZing Builder   【Java开源 Eclipse插件】<br />eZing Builder是一个可以帮助你在很短的时间内开发一个J2EE或MIS应用程序的插件。它类似于PowerBuilder与Visual Web Developer ,但是它使用XQuery来访问XML-DB。 <br /><br />SNMP4J 【Java开源 网络客户端】<br />SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。<br /><br />Sequoia ERP 【Java开源 ERP与客户关系管理】<br />Sequoia ERP是一个真正的企业级开源ERP解决方案。它提供的模块包括：电子商务应用(e-commerce), POS系统(point of sales),知识管理,存货与仓库管理，客户服务( customer service)等.Sequoia ERP采用Java开发可部署在Linux/Unix 与Windows平台上,并支持当前主流数据库如：MySQL, PostgreSQL,Oracle,Microsoft SQL Server等关系型数据库. <br /><br /><br />jenia4faces 【Java开源 其它开源项目】<br />jenia4faces是一个HTML JSF组件包.这个包主要由以下组件组成:Chart- 动态Chart生成。DataTools-DataTable扩展工具。 Dynamic- dhtml text effects。Popup-在html生成弹出式菜单。 Template-简单模板管理器。<br /><br />Tagit 【Java开源 Web测试】<br />Tagit是模拟对象(Mock Objects)测试模式的一个实现。它可用于在脱离容器的情况下对自定义JSP标签进行单元测试。<br /><br />AJAX-JSF Framework 【Java开源 AJAX开发】<br />这是一个利用AJAX技术并基于JSF来开发轻量级客户端的框架．它设计成可在现有的JSF组件上进行开发并最大限度的满足标准JSF Web流程.<br /><br />Ditchnet JSP Tabs Taglib 【Java开源 Jsp标签库】<br />这是一个可用来开发多页选项板（Tabbed Pane）的简单标签。以下是一个Demo:<br />&lt;tab:tabContainer id="foo-bar-container"><br /><br />&lt;tab:tabPane id="foo" tabTitle="Foo!"><br />Foo is cool!<br />&lt;/tab:tabPane><br /><br />&lt;tab:tabPane id="bar" tabTitle="Bar!"><br />&lt;c:out value="Bar is cooler!" /><br />&lt;/tab:tabPane><br /><br />&lt;/tab:tabContainer><br /><br /><br />SWATO 【Java开源 AJAX开发】<br />SWATO (Shift Web Application TO...)是一组可复用并且结合得很好的Java/JavaScript包.它通过AJAX来轻松转变你web应用程序的交互方式.它带的一些组件包括可以自动补全的文本框架,动态级联下拉列表,动态表单等.<br /><br />Simple Web Framework 【Java开源 Web框架】<br />Simple Web Framework (SWF)是一个基于事件的web框架.它很适合于那些想要开发胖客户端Web应用程序但又不想转向JSF的Struts开发人员。SWF跟Struts一样也是构建在Jakarta commons基础之上,但使用一个不同的request processor。SWF事件模型支持基于XmlHttpRequest的事件提交。<br /><br />Taconite   【Java开源 AJAX开发】<br />Taconite是一个基于J2EE的框架，可以利用这个框架来简化Ajax开发。Taconite包含一个客户端JavaScript包与一组能自动处理Ajax请求并生成动态内容的自定义JSP标签。 <br /><br />Sequoia 【Java开源 JDBC驱动器】<br />Sequoia是一个能够为任何数据库提供群集，负载平衡和容错服务的中间件。Sequoia是C-JDBC项目的扩展。<br /><br />RIFE/Crud 【Java开源 Web框架】<br />RIFE/Crud是RIFE Web框架的一个扩展模块，它可以用给定的POJOs自动生成CRUD web应用程序。它没有生成任何文件所有的事件都是在运行期进行．利用RIFE提供的 site-structure可以把它与你应用程序的数据流与逻辑流相结合．<br /><br />Tacos 【Java开源 AJAX开发】<br />Tacos类包项目为Tapestry Web框架提供一些高性能的组件,同时也为在页面或自己组件中使用的ajax框架(它当前支持的框架主要是dojo但也支持Prototype，script.aculo.us ，Rico)提供服务端Java支持。<br /><br />JSON-RPC-Java 【Java开源 AJAX开发】<br />JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在JBoss与其它J2EE应用服务器中因此可以在一个基于JavaScript与DHTML的Web应用程序中利用它来直接调用普通Java方法与EJB方法。JSON：JavaScript Object Notation <br /><br />Jofti 【Java开源 其它开源项目】<br />Jofti可对在缓存层中(支持EHCache，JBossCache和OSCache)的对象或在支持Map接口的存储结构中的对象进行索引与搜索。这个框架还为对象在索引中的增删改提供透明的功能同样也为搜索提供易于使用的查询功能。<br /><br />Yan 【Java开源 IOC容器】<br />Yan是一个非侵入式的对象反转控制容器（IOC容器）。它通过宣告式的方式把简单的组件组合起来从而构建出任意复杂的组件。这些简单的组件同样也有可能是由其它更简单的组件组合而成。Yan的特点包括开放式的结构，灵活的组件组合，宣告式API和插件式的生命周期管理。Yan对依赖注入的方法没有约束，它可以对商业对象的Public构造方法进行注入，也可以对java bean getter/setter，有规则的java method，任意变量及它们的任意组合进行注入。<br /><br />Continuum 【Java开源 系统构建】<br />Continuum可用于Java项目构建的持续集成，使用简单。它内置支持Maven 2,Maven 1, Ant和Shell Scripts. <br /><br />Winstone 【Java开源 Web服务器】<br />Winstone是一个Servlet容器,它的目的是提供Servlet功能但没有完全采用J2EE规范.如果有时你要想的只是一个简单的Servlet容器,Winstone是一个最好的解决方案.它支持servlet2.4与JSP2.0规范.<br /><br />Eclipse 3.1.1 translations 【Java开源 Eclipse插件】<br />Eclipse 3.1.1和其它Eclipse工具( Visual Editor (VE) , UML2,GEF,EMF / XSD ,WTP等)发布各种语言支持包。其中包括支持中文的NLpack1包。<br />详细可查看以下网址：<br />http://eclipse.org/org/press-release/20051012nlscb.html.<br /><br />下载地址：<br />Windows 98/ME/2000/XP<br />NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip <br />NLpack1-eclipse-SDK-3.1.1a-win32.zip <br /><br />Linux (x86/GTK 2)<br />NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip <br />NLpack1-eclipse-SDK-3.1.1a-gtk.zip <br /><br />Tonic Look & Feel 【Java开源 Swing外观】<br />这是Swing金属(Metal)外观的免费实现方案．<br /><br /><br />Commons-IO 【Java开源 Apache其它开源】<br />Commons IO是Jakarta Commons项目的一个子项目。用来帮助进行IO功能开发．它包含三个主要的领域:Utility classes-提供一些静态方法来完成公共任务．Filters-提供文件过滤器的各种实现．Streams-提供实用的Stream，reader与writer实现．<br /><br />Datastream Pro 【Java开源 SQL客户端】<br />Datastream Pro是一个数据库"浏览器"和数据操作工具．它易于使用,可靠,稳定,操作直观。Datastream Pro支持所有兼容JDBC的数据库(已经在Oracle,MySQL,postgreSQL和HSQLDb上测试成功).利用它可以浏览与编辑数据库中的数据，可在一个友好的界面中运行与编辑SQL脚本，可使用查询编辑器来编辑SQL查询，可同时连接到多个数据库和易于使用的连接向导等。<br /><br /><br />Viento 【Java开源 模板引擎】<br />Viento是一个用Java开发的模板语言。它在语句构成上很多情形下有点类于Velocity 。<br /><br />JBoss Microcontainer 【Java开源 IOC容器】<br />JBoss Microcontainer是一个轻量级IOC容器，它的思想类似于Spring,Pico Container与Plexus。JBoss Microcontainer可被用在任何应用程序中而不需要JBoss应用服务器。 它是JBoss Seam和JBoss Embeddable EJB 3.0项目的基础支柱。这里有一篇英文简介文章。<br /><br />RadRails 【Java开源 Eclipse插件】<br />RadRails是一个Ruby on Rails框架的IDE。Eclipse更新站点为http://www.radrails.org/update。<br /><br /><br />opencsv 【Java开源 其它开源项目】<br />opencsv一个简单的CSV解析Java包。<br /><br />Bugzilla 【Java开源 Bug追踪系统】<br />Bugzilla是一个Bug追踪系统设计用来帮助你管理软件开发。<br /><br />WebMacro 【Java开源 模板引擎】<br />WebMacro是一种Java开源的模板语言。对于表现web页面，它比JSP,PHP,与ASP效率更高。WebMacro是一些大网站后台的页面生成技术。<br /><br />ECP 【Java开源 Eclipse插件】<br />Eclipse CORBA Plugin (ECP)提供一个可针对CORBA IDL文件语法进行着色的编辑器。 <br /><br />RDT 【Java开源 Eclipse插件】<br />RDT是一个用于Ruby开发的Eclipse插件.它提供的功能包括：语法高亮显示，快速语法分析，图形大纲，单元测试，内容提示，源码格式和一个正则表达式插件等。 <br /><br /><br />Commons-Email 【Java开源 Apache其它开源】<br />Commons-Email的目的是提供一组用于发送Email的API,它基于Java Mail API基础之上并进行了简化。它提供的主要Java类有：SimpleEmail：这个类用于发送简单的文本类型email。MultiPartEmail：这个类允许发送文本消息并附带附件。HtmlEmail：用于发送Html格式的附件并支持内含图片。EmailAttachment：这是一个简单的容器类用于简化附件的处理。<br /><br />UISpec4J 【Java开源 Java测试工具】<br />UISpec4J是专门用于Swing应用程序单元测试的一个开源组件,它构建在JUnit测试套件的基础之上.UISpec4J让Java GUI测试变得很简单.它的特殊之处在于它的APIs设计成尽可能地隐藏Swing的复杂性,因此易于测试脚本的读与写.以下这它的简单例子:<br />public void testContacts() {<br />      Table contacts = getMainWindow().getTable();<br />      contacts.assertContentEquals(new Object[][]{<br />        {"John", "12", Boolean.FALSE},<br />        {"Sylvia", "43", Boolean.TRUE},<br />        {"Bill", "31", Boolean.FALSE}<br />      });<br />}<br /><br /><br />e-Gen Developer 【Java开源 开发工具】<br />e-Gen Developer是一个快速应用程序开发(RAD)环境。利用它能够进行Web应用程序的高产开发。e-Gen Developer完全采用Java开发并基于JSF2.8与Struts框架。e-Gen的主要目的是克服IT管理所面对的一些相关挑战如：提高开发效率，减少维护成本与减少训练团队成员所需要的时间。 <br /><br />JavaGroups 【Java开源 网络服务器】<br />JavaGroups是一个群组通讯工具包。它基于IP组播(multicast),但利用可靠性与群组从属关系对它进行扩展。<br /><br />UIState 【Java开源 其它开源项目】<br />UIState是一个非侵入式的用户界面状态(state)管理器用于Java Swing胖客户端应用程序中.UIState允许应用程序恢复它们的GUI状态当应用程序在使用或在多个应用程序之间进行对话时.比如:假如你的应用程序使用JInternalFrame来显示MDI界面的时候,UIState将会为你管理frame的位置和大小.<br /><br />XINS 【Java开源 其它开源项目】<br />XINS是一项规范技术用于定义，创建和调用远程APIs。当API规范在XML文档中定义好之后，XINS将会把它们转换成包括客户端与服务端的HTML文档与Java代码．XINS将与复杂的SOAP技术竞争，因为它被设计得具有简单性，可扩缩性与可测试性。简要地说就是：SOA+Java+XML+ 代码生成－复杂性 => XINS。 <br /><br /><br />Fujaba Tool Suite 【Java开源 UML建模】<br />Fujaba Tool Suite结合UML类图与UML行为视图来提供一个强大,易于使用,而且是整齐均称的系统设计与规范语言. 而且Fujaba Tool Suite还支持从整个系统设计生成Java源代码从完美地实现了一个可执行的模型．同样也支持相反操作，因此源代码可以被解析并被表现在UML中．<br /><br /><br />EJOE 【Java开源 网络服务器】<br />EJOE是一个轻量级C/S(client/server)组件用于发送与接收Java对象通过使用外挂式的序列化(serializing)机制.EJOE提供三种功能：1.一个多线程，高性能的网络IO服务器和一个相应的客户端组件。2.序列化所有通过客户端发送的输入对象和由你商业逻辑提供的返回对象。3.提供一个简单，清晰，唯一的接口来把一个对象请求代理集成到你的应用程序中。<br /><br />JWP 【Java开源 其它开源项目】<br />Java Web Parts为所有Web应用程序开发者提供了一些可以重复使用和几乎相互独立的Java组件。你可以把这个项目想象成类似于Jakarta Commons项目。JWP包括以下这些组件：AjaxTags一个标签库可以为一个页面轻松地添加AJAX 功能而几乎不用改变现存的JSP代码。DependencyFilter：这个一个简单易用并且是基于declarative（声明）模式的灵活IoC组件。此外它还包括一些过滤器（比如： CompressionFilter,SessionLimiterFilter,<br />RequestRecorderFilter,AppAvailabilityFilter,<br />ParameterMungerFilter等），各种用来处理Request, Response与Session的工具类与其它其它一些标签库。<br /><br />Jencks 【Java开源 