JavaExplore

一切像雾像雨又像风
posts - 19, comments - 45, trackbacks - 0, articles - 0

2005年9月1日

     摘要: 3 数据源处理 JFreeChart 中的数据源是DataSet接口类型。该接口有三个主要的子类接口:CategoryDataset、PieDataset、SeriesDataset CategoryDataset 接口的实现类基本上都维护了一...  阅读全文

posted @ 2006-09-12 23:36 JavaExplore 阅读(6530) | 评论 (15)编辑 收藏

1、策略:常用于算法族,将算法从依赖的环境中抽象出来形成
2、状态:和策略非常接近,使用于有明显状态变化的时候
3、命令:命令的发起与执行解藕,命令类可以独立演化,有助于做redo undo操作以及记录所执行的命令
4、解释:用于文法的解析
5、迭代子:java中有现成的实现,iterator
6、观察者:常见,类似与模型视图的关系,java中提供了oberver类和observable接口
7、调停者:处理混乱的类交互,抽象出中间类,将类间的交互都通过这个类完成
8、模版:将拥有同一父类的多个具体子类的共同操作提取出来形成抽象模版类
         原则:具体的私有属性应该放到具体类中,抽象类中调用属性通过属性方法而不是直接调用属性
               将私有属性放到具体的类中,才能方便对父类进行多个实现。
         将行为看作划分类的标准,以前我都是将数据模型看作划分类的思想,以后应该重新审视行为在类中的重要作用,特别是在的继承等级中。

posted @ 2006-09-12 23:33 JavaExplore 阅读(370) | 评论 (0)编辑 收藏

1 简介

JFreeChart SourceForge.net 上的一个开源项目,它的源码和 API 都可以免费获得。 JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三维 ) ,  柱状图  ( 水平 , 垂直 ), 线图 , 点图 , 时序图 , 甘特图 股票行情图 , 混和图 温度计图 刻度图等常用商用图表,   图形可以导出成 PNG JPEG 格式,同时还可以与 PDF EXCEL 关联,支持对图形的放大、缩小,支持常见图形的 3D 显示。

2 图形 对象的处理

2 1 JFreeChart对象

JFreeChart 可以生成很多图形对象,它的工厂类提供了 33 个工厂方法用于生成不同的图形对象(具体的工厂方法可以参见 JFreeChart API 手册或者源码中的 ChartFactory )。              JFreechart 对图形对象的抽象具体化。图形对象( JFreeChart ),由 Title( 主标题 ) SubTitle (子标题 ) Plot (图形的绘制结构)等几个主要对象组成。各个组成部分如下图所示:

这是一个 JFreeChart 对象,上面的“ chart 标题”是 Title 对象,中间区域是 Plot 对象(包括绘图区域和坐标轴区域),下面的区域是 LegendTitle 对象,是一种 SubTitle 对象。

每个 JFreeChart 对象只能有 1 Title 对象, 1 Plot 对象,可以有多个 SubTitle 对象。 JFreeChart 对象可以进行的操作有:背景的设置(背景颜色、背景图片、透明度等)、边框的设置(是否可见、笔画、 Paint 等)、渲染方式的设置、标题对象的设置、子标题对象的增删查操作。(本文中的所有操作都不提供代码级的介绍,可参见 API 手册或者源码)

2 2 主标题对象

主标题对象是 TextTitle 类型,可以进行的操作有:背景设置、字体设置(字体类型、颜色、内容、对齐方式等操作)、 tooltip 设置、 URL 设置。

2 3 Plot 对象

Plot 对象是图形的绘制结构对象。 JFreeChart 中含有很多不同的 Plot 对象,每一种图形对象中的 Plot 对象都在实例化的时候创建。所有的 Plot 共有的操作有:背景设置(背景颜色、背景图片、透明度等)、前景透明度设置、无数据存在情况的设置(显示的字符内容、显示的字体、显示的 Paint )、放大缩小比例的设置,大部分 Plot 对象还有设置 Datset 、设置 Renderer 对象操作。

JFreeChart 中有 18 Plot 抽象类的具体实现类。 Plot 的具体实现类主要由以下重要对象组成: Renderer 对象(图形的绘制单元——绘图域) Datset (图形的数据源), DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)。不同的 Plot 对象组成方式不尽相同,有的不含有 Renderer 对象,比如 CompassPlot ContourPlot MultiplePiePlot PiePlot 等,有的不含有 DomainAxis RangeAxis 对象,另外除了 FastScatterPlot 类都含有 Datset 对象, FastScatterPlot 使用 float 的二维数组充当数据源。尤其说明一点,饼状图相关的 Plot 对象( MultiplePiePlot PiePlot PiePlot3D RingPlot )中都不含有 Renderer 对象、 DomainAxis 对象、 RangeAxis 对象。

一般来说, Datset 对象存储数据模型, Renderer 对象存储显示模型, Plot 对象根据 Datset 对象、 Renderer 对象完成画图操作。

仍以上面的图形讲解 Plot 对象的组成。

   上图的中间区域是是一个 XYPlot 对象。其中的折线部分即是图形的绘制单元 Renderer 对象。 X 轴是 DomainAxis y 轴是 RangeAxis ,其中 Datset 对象属于数据模型范畴,是 UI 不可见对象。该图中的 plot 背景色、网格线的各种设置可以通过 XYPlot 对象本身完成。

       下面讲解 Renderer 对象、 Axis 对象( X 轴、 y 轴都属于 Axis 对象), Datset 对象在后续章节中专门讲解。

2 31 Renderer对象

Renderer 对象是图形的绘制单元。 JFreeChart 提供了两个接口 CategoryItemRenderer XYItemRenderer 1 个抽象类 AbstractRenderer 供具体的 Renderer 类实现,给出了将近 50 种具体实现类。

一般来说 Renderer 对象可进行的操作有:对 item label (下图中的柱状图上的红色数字即为 item label 的示例)的默认设置( item label 的产生方式、是否可见、字体、 Paint 、正反向 item label 的位置设置等)、绘制图形的边框默认设置( Paint 、笔画、是否可见等)、绘制图形的默认设置(形状、笔画、是否可见、对应的图例中是否可见等,折线图还有线条是否可见、折点图形是否可见、折点图形是否填充、折点图形的形状、对应的图例中线条是否可见、图形是否可见、整体是否可见等)、以及对指定 item label 的设置、指定绘制图形的设置。可以说和具体绘制的图形相关的属性都可以通过 Renderer 对象设置。

不同的 Renderer 的实现类实现了不同的显示方式,在含有 Renderer 对象的 JFreeChart 对象中, R enderer 对象决定了JFreeChart对象的显示方式。例如:柱状图的Plot对象中默认的Renderer对象是 CategoryItemRenderer 对象,通过设置 Plot 对象的Renderer对象 LineAndShapeRenderer ,则柱状图变为线图。使用中一般不需要显式的实例化一个 R enderer 对象,一般通过 JFreeChart 对象的 Plot 对象调用现有的 R enderer 对象进行重新设置等操作。

2 32 Axis对象

JFreeChart 提供了两种类型的坐标轴: CategoryAxis (等级轴)和 ValueAxis (值轴), ValueAxis 又有 3 个子类: DateAxis (时间轴)、 NumberAxis (数字轴)、 PeriodAxis (时期轴)。这些坐标轴还有更详细的子类,不再一一列举

Axis 对象可进行的操作有:标题的设置(内容、字体、Paint、显示角度等)、坐标线的设置(笔画、Paint、是否可见等)、刻度线的设置(是否可见、笔画、Paint、位于绘图区域的长度、位于绘图区域外的长度等)、刻度标示的设置(笔画、Paint、字体、与轴的距离等)、坐标轴范围设置等。

CategoryAxis 对象还可以进行的操作有: 刻度标示间距 设置( 最小间距、最大间距、指定间距)等。

ValueAxis 对象可进行的操作有:轴端设置(显示的图形形状)、范围设置(是否自动产生范围、自动产生的最小范围、最大范围、指定确定范围、指定范围大小等)、间隔设置(是否自动产生间隔、指定间隔)等。

DateAxis 对象还有对时间刻度显示格式的设置操作。

2 4 子标题对象

    子标题对象是 Title 类型的对象,一个JFreeChart可以有多个子标题对象。JFreeChart提供了5Title的实现,可以是图片、文本、图例等的形式。

(数据源以及常用图形的处理以及进一步的讨论在后续文章中介绍)
 

posted @ 2006-09-01 23:21 JavaExplore 阅读(9934) | 评论 (1)编辑 收藏

1、代理模式:参与角色:代理与真实实体共同的抽象角色、代理角色、真实实体角色
       远程代理:封装对与远程对象复杂的调用通讯过程,象调用本地对象一样
       虚拟代理:真实实体加载时间过长的,使用虚拟代理提供友好的显示方式,一边加载实际的对象
       安全代理:调用真实的对象之前插入权限验证模块
       智能引用代理:调用真实的对象之后调用统计等相关操作模块

2、享元模式:参与对象:建造工厂、抽象享元、具体享元
       分析对象的内蕴与外蕴状态,即不变的私有属性与变化的私有属性。建造工厂使用备忘录模式存储已经建造的对象,建造对象的时候,以参数的形式传递享元对象的内蕴属性。实际调用中,使用传递外部参数的方法使用外蕴变量。

   复合的享元对象组成的对象,不可以整体使用享元模式,但可以单个的享元对象属性使用该模式
   优点:降低内存中的对象  缺点:设计复杂性
       

3、门面模式:结构模式。为包含有很多对象的子系统提供统一的操作接口类,所有对该子系统的调用都通过这个类,降低子系统之间调用的复杂度,也符合笛比特法则(一个对象的朋友尽量少,只与朋友说话)

4、桥梁模式:参与角色:抽象化角色、抽象化的具体角色、实现化角色、实现化的具体角色
 两个有继承等级的对象群,一个对象群对另一个对象群有调用关系的时候使用
        目的:使抽象化与实现化解藕

posted @ 2006-09-01 23:08 JavaExplore 阅读(719) | 评论 (0)编辑 收藏

         今天去jdon,看了它的设计研究栏目,bang有几篇评论单例模式的文章,声称“Singleton is evil”(见http://www.jdon.com/jive/article.jsp?forum=91&thread=17578),并且引用几篇外文页面佐证自己的观点,其中有一篇文章更是说,单例不仅不是一种模式,而是一种反模式。
        下面我谈谈我对单例模式的看法。逐一分析单例模式的陷阱,帮助大家正确使用单例模式。
(1) 陷阱一:调用函数的性能瓶颈
        在c++中,单例只有一种实现方式——LazySingleton, 实现如下(本文全部使用java代码):

public   class  LazySingleton {
    
private   static  LazySingleton m_instance = null ;
     private LazySingleton(){};
     synchronized public static LazySingleton getInstance(){
        
if(m_instance==null)
            m_instance
=new LazySingleton();
        
return m_instance;
    }

}

LazySingleton将对象的初始化推迟到调用的时候。并且为了防止多线程环境下产生多个实例,使用synchronized关键字保证函数getInstance调用的线程安全。synchronized关键字的存在保证了只会产生一个对象,但也成了多线程环境下的性能瓶颈。一个多线程的程序,到了这里却要排队等候成了一个单线程式的执行流程,这在高并发环境下是不可容忍的。而c++中可以使用双重检查机制将这种性能问题仅仅限制在第一次构造对象的时候,而java中不可以使用双重检查机制。
        但是java可以实现EagerSingleton,实现如下:

public   class  EagerSingleton {
    
private   static  EagerSingleton m_instance = new  EagerSingleton();
     private EagerSingleton(){};
     public static agerSingleton getInstance(){
        
return m_instance;
    }

}
与LazySingleton相比,EagerSingleton将对象的初始化放到了类加载的时候。这样就避免了synchronized关键字的性能瓶颈。
(2)陷阱二:访问互斥共享资源
         EagerSingleton中访问互斥资源也要考虑线程安全问题。下面看一个例子:
public class EagerSingleton{
    
private static EagerSingleton m_instance=new EagerSingleton();
    
private HashMap map=new HashMap();
   
private EagerSingleton(){};
   
public static agerSingleton getInstance(){
        
return m_instance;
    }

       
public void refreshMap(Object key){
        
synchronized(map){
            
if(!map.contains(key))
                map.put(key,value);
//value为此时的实时数据
        }
 
    }

}
因为该类是单例,可能多线程并发访问map,map非线程安全,需要加线程安全关键字,否则就掉入了访问互斥资源的陷阱。
(3)陷阱三:非法逻辑陷阱
        这种情况一般是滥用单例模式造成的,下面考虑一种滥用单例的情况。下面的代码的作用是getValueByName后,马上printValue即完成操作流程。
public class EagerSingleton{
    
private static EagerSingleton m_instance=new EagerSingleton();
    
private String value=null;
   
private EagerSingleton(){};
   
public static agerSingleton getInstance(){
        
return m_instance;
    }

    
synchronized public void getValueByName(String name){
        value
=getByNameFromDateBase(name);
        
    }

    
public viod printValue(){
        System.out.println(
this.vaue);
    }

}

该类含有一私有属性value,在多线程环境下不能保证value值的合理逻辑,一线程getValueByName后,马上printValue,也有可能value的值已经被其他线程修改。这种情况就属于单例模式的滥用,该类根本不适合做成单例。
        消除非法逻辑的陷阱,可以通过将该类重构为纯粹的行为类完成。重构后的代码如下:

public class EagerSingleton{
    
private static EagerSingleton m_instance=new EagerSingleton();
   
private EagerSingleton(){};
   
public static agerSingleton getInstance(){
        
return m_instance;
    }

    
private String getValueByName(String name){
        
return getByNameFromDateBase(name);
        
    }

    
public viod printName(String name){
        String value
=getValueByName(String name);
        System.out.println(value);
    }

}

通过调用printName(String name)直接完成操作流程,将其中的私有属性处理成过程式的参数传递,将该类修改成纯粹的行为类。

        含有私有属性并且含有对它赋值操作的类并非都会调入该陷阱,构造函数里进行对私有属性赋值不会引起非法逻辑,如下代码

public class EagerSingleton{
    
private static EagerSingleton m_instance=new EagerSingleton();
    
private HashMap map==new HashMap();
    
    private
 EagerSingleton(){
        map.put(key,value);
//value为此时的实时数据
    }

   
public static agerSingleton getInstance(){
        
return m_instance;
    }

}

构造函数里不必要加线程安全关键字也可以保证线程安全,因为类加载器是线程安全的,EagerSingleton只会在类加载的时候实例化一次,这样不会出现单例模式的线程不安全,也不会造成非法逻辑。
(4)陷阱四:单例陷阱的传递
        当含有对象作为单例类的私有属性时,陷阱不仅会出现在该类本身,还会传递到私有对象所在的类中。看如下代码:

public class EagerSingleton{
    
private static EagerSingleton m_instance=new EagerSingleton();
    
private NewClass newClass=nll;
   
private EagerSingleton(){
        newClass
=new NewClass();
    }
;
   
public static agerSingleton getInstance(){
        
return m_instance;
    }

   
public viod printName(String name){
        String value
=newClass.operationByNameAndReturnValue(String name);
        System.out.println(value);
    }

}
乍一看,代码中除了构造函数对私有属性进行了初始化操作,其他地方没有对私有属性的赋值,不会引起非法逻辑陷阱。其实这个赋值操作可能隐含在newClass.operationByNameAndReturnValue(String name)操作,只有保证了NewClass的operationByNameAndReturnValue操作不会对它的私有属性赋值操作,才能保证真正的合理逻辑。同样,只有保证NewClass的operationByNameAndReturnValue操作没有掉入访问互斥资源陷阱,才能真正保证EagerSingleton没有掉入该陷阱。
        消除该陷阱的方法:(1)类方法的名称要合理,比如纯粹的行为方法名:interprete,excute,operation之类的方法中就不该含有对私有属性直接或者间接的赋值操作,每个方法的责任要明确。(2)单例类中尽量不要含有非单例类的实例作为私有属性(容器类除外),一定要有类的实例作为私有属性的时候,重新审视这个作为私有属性的类,是不是也应该设计成单例类;或者保证对它的初始化赋值限制在构造函数内。

posted @ 2006-08-26 11:26 JavaExplore 阅读(4882) | 评论 (13)编辑 收藏

最近发现一本<java与模式>,正好再温故一下当年的专业课内容,下面是这几天记的笔记.(并不是系统的讲解书中的内容)
一  综述:
1、不要使用接口定义常量
2、自己少用标志接口
3、不要继承具体类
4、类层次的中间节点应该是接口或者抽象类,叶子是具体类
5、子类应当扩展父类的责任,而不是覆写父类的责任
6、面向接口编程
7、不要滥用继承,组合优先于继承

java中设计不当的类:calendar:作为接口,含有与具体的历法(罗马历法)相关的常量,不能扩展到中国的阴历历法(不符合开闭原则)
                    properies类:滥用继承,继承至hashtable,应当使用聚合

8、笛比特法则:只与自己的直接朋友通信,不与陌生人通信(1)狭义笛比特法则:只与朋友通讯,通过自己的朋友传递间接的调用(2)结合依赖倒转原则修改:不必通过朋友传递间接的调用,通过陌生人的抽象接口调用陌生人的行为(依旧不能与具体的陌生人发生通信)
9、尽量降低类中成员的访问权限,不要设计退化类(类似c中struct)。
        java中的point2D以及Dinmension2D类有这种设计缺陷(不过这种情况问题不大)
10、如果多个具体的产品类没有共同的商业逻辑,就可以把它们抽象到一个接口中,如果有共同的商业逻辑,就把共同的部分抽象到抽象类中,共同的部分尽量向类继承层次的上层移动,以达到复用的目的
二   工厂模式
1、简单工厂模式:参与角色:工厂/抽象产品类/具体产品类

   缺点:添加新产品的时候,虽然产品相关代码符合开闭原则,但对工厂类本身并不符合,需要修改其中的产生产品方法或者添加新的产生方法(工厂里实现的不同造成的修改不同)来支持新的产品类
   退化方式:省略掉工厂角色,抽象产品类担任具体产品类的工厂角色:提供静态的getInstance方法,比如java类库中的DateFormat类,(本人认为这样很不符合开闭原则,父类中出现与具体子类相关的代码,不方便扩展,添加新产品的时候,修改的时候缺点与原简单工厂的工厂角色类似)

2、工厂方法模式:参与角色:抽象工厂类/具体工厂类/抽象产品类/具体产品类
     消除了简单工厂的缺点


3、抽象工厂模式:简单工厂模式与工厂方法模式的结合

4、单例模式:饿汉和懒汉两种,前者将本身对象作为静态私有属性事先生成,后者推迟到调用的时候,后者需要考虑多线程的时候,前面需要加线程安全关键字(注意),java中还是前者为优。
   不要滥用单例,只有系统要求只有一个类的实例的时候才调用
   有的单例可能有状态属性,这就为多例模式提供了可能
   含有私有属性的类作成单例的时候尤其要注意:一是私有属性的线程安全,确实需要的时候可以加线程安全关键字,比如系统中的log类,二是确认这些属性是不是可以所有线程共享的,类似普通类的static
三   各种具体模式(1)
1、建造模式:参与角色4个:指导者、抽象建造对象、具体建造对象、产品
      一个复杂的产品有很多的零部件,就可以使用具体的建造对象来一一构造
2、原始模式:深拷贝、浅拷贝
3、适配器模式:将adaptee类适配成目标接口
4、合成模式:参与角色:composite接口、树枝节点类、树叶节点类
      分成透明式和安全式两种,各有优缺点
      (1)前者将管理子对象的方法放到接口中,这样树型结构中的所有对象都是透明的,都可以统一调用,但是叶节点并没有管理子对象的能力,因此透明但不安全
      (2)后者将管理子对象的方法下放到树枝节点类中,这样安全但不透明
5、装饰模式:继承已有类的接口,提供和已有类相同的方法,并对已有类的功能提供扩展(通过组合已有对象,调用已有对象方法的时候加入新的代码)
      (1)透明的装饰模式(纯粹的装饰模式):装饰类、被装饰类继承于同一接口,而且装饰类只实现接口的方法,不提供额外方法的实现,调用该类的时候使用接口声明调用(实例化当然还是自己的构造函数),即该类的所有方法都是透明的
      (2)半透明的装饰模式(退化的装饰模式):装饰类、被装饰类继承于同一接口,装饰类不仅实现接口的方法,还提供额外方法的实现,这样要调用它独特的方法的时候就必须使用它本身来调用,退化到一半装饰模式、一半适配器模式。

posted @ 2006-08-24 21:25 JavaExplore 阅读(2105) | 评论 (6)编辑 收藏

花了很长时间,终于在Jboss部署成功了第一个EJB。
Eclipse:3.1
EJB:2.0
JBoss:4.0.2
关于如何部署EJB,网上有不少详细介绍的文章。在这里我不在重复ejb的细枝末节。大体说一下,一个简单的EJB包括:一个继承SessionBean的类、一个继承EJBObject接口的Remote接口、一个继承EJBHome的Home接口、调用该EJB的一个类(网上的教程一般起名为XXXClient)。
组织好这些类的目录结构,写好ejb-jar.xml,基本上就完成了。
说明几点:
1、编译类的时候,引入jboss-j2ee.jar与jbossall-client.jar包;
2、ejb-jar.xml的DOCTYPE处一定要如此(针对EJB2.0,我部署的时候时间都浪费在这儿了):
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd">
3、继承SessionBean的那个类至少要有一个ejbCreate()方法;
4、应该抛出的异常一定不能漏掉,特别是那两个接口里面的方法应该抛出的异常(都应该有java.rmi.RemoteException);
5、部署后以dos方式重启jboss,若部署失败,可以在dos窗口中看到出错的原因。

posted @ 2005-09-20 21:29 JavaExplore 阅读(1305) | 评论 (0)编辑 收藏

代码中经常会出现枚举性的变量,比如血型、性别之类。
以血型为例:

class Blood {
public final static 
int  o = 0 ;
public final static 
int  A = 1 ;
public final static 
int  B = 2 ;
public final static 
int  AB = 3 ;

private Blood();
}



class person
{
private 
int  _blood;
public 
void  setBlood( int  b) {
   _blood
= b;
}

如果要给一个person的实例设置血型,代码如此:person.setBlood(Blood.A);
这个写法的代码中,setBlood的参数为整型,如果如此调用person.setBlood(9);
编译器无法发现错误,只能靠人为控制,如果在方法setBlood中检测参数的有效性,又超越了该方法的职责。

重构后的代码如下:

final class Blood{
public final static Blood O
=new Blood(0);
public final static Blood A
=new Blood(1);
public final static Blood B
=new Blood(2);
public final static Blood AB
=new Blood(3);
private 
int _bloodCode;
private Blood(
int b){
    _bloodCode
=b;
  }

public 
int getCode(){
    
return _bloodCode;
  }

}


class person
{
private Blood _blood;
public setBlood(Blood b)
{
    _blood
=b;
  }

}

如此,(1)隐藏了血型的编码细节
            (2)方便编译期间发现错误
            (3)避免使用超越数据范围的参数

posted @ 2005-09-17 21:24 JavaExplore 阅读(1458) | 评论 (7)编辑 收藏

1、变量、对象声明语法<%!.....%>
2、嵌入java语句语法<%......%>
3、调用javabean语法<jsp:useBean id="zong" scope="page" class="test.Hello"/>
     文件Hello.class位于目录web-inf\classes\test下,该jsp页面与文件夹web-inf位于同一目录下。
4、调用javabean的属性语法<jsp:getProperty id="zong" property="A"/>
   类Hello中要有方法getA();
5、javabean 的一般语法,构造函数为public,所有属性为private,每个属性对应get,set方法,boolean类型属性的对应get方法可以用is替换。

posted @ 2005-09-17 20:47 JavaExplore 阅读(1878) | 评论 (3)编辑 收藏

这是我以前在http://bbs.chinajavaworld.com上发的一个帖子

初来论坛,见大家一些基础问题反复的问,很是浪费时间与精力,下面将常见问题逐一解答,并欢迎各位同道跟帖写出常见问题以及解答方法。
(1)、何处下载jdk?网址:java.sun.com/downloads
何处下载tomcat?网址:http://jakarta.apache.org/site/binindex.cgi这个页面很长,往下拉找到tomcat,有很多版本,现在最新的是 5.5.5-alpha exe PGP MD5
(2)、为何安装tomcat的时候停在using jvm?关掉瑞星,然后打开 控制面板-》管理工具-》服务,找到瑞星对应的全部服务都停止。然后重新安装即可成功。
(3)、安装后需要如何配置环境变量?右键单击"我的电脑",在弹出菜单中选择"属性"→"系统特性" →"高级" →"环境变量", 弹出环境变量对话框,就可以编辑系统的环境变量了。添加PATH、JAVA_HOME、CLASSPATH、TOMCAT_HOME四个变量。PATH=你的jdk目录\bin;JAVA_HOME=你的jdk安装目录;CLASSPATH=你的jdk安装目录\lib\tools.jar;TOMCAT_HOME=你的tomcat安装目录。开启tomcat服务,然后使用:http://localhost:8080/就可以测试是不是配置成功。
(4)、tomcat的目录结构是什么样子的?下面说一下我们会经常接触到的目录与文件。bin目录下的tomcat5.exe是tomcat服务的启动文件;logs目录是一些日志文件,其中stdout.log是你的System.out.println打印的目的地(当你打开tomcat服务地dos界面时,向该dos界面打印);webapps目录是我们的网站文件放置的地方,webapps\ROOT是tomcat的默认主页目录,可以使用http://localhost:8080来访问该目录。webapps下其他目录下的文件,我们可以使用http://localhost:8080/目录名来访问。
(5)、为何我得jsp不能正确显示中文?这个不是配置的问题,大家都知道我们可以在html文件里通过设置<meta http-equiv="Content-Type" content="text/html; charset=gb2312">让html显示中文,jsp也是一样,你设置<%@page contentType="text/html; charset=gb2312" %>就可以显示中文。
(6)、如何新建虚拟目录?
修改 Tomcat安装目录\conf\server.xml ,在下列行前
</Host>
</Engine>
添加下列行:
<Context path="/my" docBase="c:\myjsp\test" debug="0" reloadable="true">
</Context>
表示增加虚拟目录 my,对应物理目录位置c:\myjsp\test,若存在c:\myjsp\test\hello.jsp,则下列地址可访问:
htpp://localhost:8080/my/hello.jsp
修改server.xml后,需要重新启动tomcat. (转mouseLee回帖,测试正确)
(7)、如何配置servlet?
以(6)建立的虚拟目录为例。假如你有一个servlet:MyFirstServlet。该servlet第一行代码为:package com.myservlet;
将MyFirstServlet.class复制到c:\myjsp\test\WEB-INF\classes\com\myservlet下面,无目录的自己新建。然后打开c:\myjsp\test\WEB-INF\web.xml(该文件可以从tomcat的安装目录\webapps\ROOT\WEB-INF下面复制),在<!-- JSPC servlet mappings end -->前面加入<servlet>
<servlet-name>newServlet</servlet-name>
<servlet-class>com.myservlet.MyFirstServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>newServlet</servlet-name>
<url-pattern>/ceshi</url-pattern>
</servlet-mapping>
然后你就可以通过htpp://localhost:8080/my/ceshi来访问你的servlet了。

posted @ 2005-09-17 20:14 JavaExplore 阅读(1209) | 评论 (0)编辑 收藏

java 开始版本的IO有两个基本的面向byte类:InputStream、OutputStream
为了扩展输入输出的功能并且避免类的爆炸性增长,java语言使用修饰模式扩展这两个类的功能。
常用的类有:DataInputStream、BufferedInputStream、FileInputStream、StringBufferInputString
            DataOutputStream、BufferedOutputStream、FileOutputStream、PrintStream
     StringBufferInputString主要用于读去内存中的字符串
     FileInputStream主要用于读取文件
     BufferedInputStream用于修饰上两中InputStream
如果要读取文件并且要原样复原文件,要用DataInputStream/DataOutputStream用字节读写

java 后来的版本加入了很多面向Unicode的类:Reader、Writer
仍旧使用模式扩展这两个类的功能。
常用的类有:FileReader、StringReader、BufferedReader
            FileWriter、StringWriter、PrintWriter、BufferedWriter

一般使用中都是多个类同时使用的,一般都使用缓存类用以提高io性能
比如(1)读文件,根据文件名先生成FileInputStream,在用BufferedInputStream、DataInputStream修饰
(2)读取内存中的文件,先生成StringBufferInputString,在用BufferedInputStream、DataInputStream修饰
(3)写文件,根据文件名生成FileWriter,再用BufferedWriter、PrintWriter修饰

posted @ 2005-09-06 21:06 JavaExplore 阅读(694) | 评论 (0)编辑 收藏

以前写程序没有处理异常的习惯。即便是一个大的系统,除了少数情况(比如发送邮件方法)之外,基本上看不见捕捉异常的代码。现在学习java,保留了这个坏习惯。今天学习使用类FileInputStream和FileOutputStream,eclipse总是提示“Unhandled exception type FileNotFoundException”,浪费了很多时间找不到问题所在,后来发现是因为这两个类的构造函数定义中有“throws FileNotFoundException”,而我的程序中没有捕捉也没有继续向外抛出异常。

posted @ 2005-09-06 16:41 JavaExplore 阅读(1137) | 评论 (0)编辑 收藏

Java Learning Path (一)、工具篇

一、 JDK (Java Development Kit)

JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 (rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的 JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。


1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ;,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html

下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\ j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\ bin。这样JDK就安装好了。

2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。

二、 JDK Documentation

Documentation 在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。

三、 应用服务器(App Server)

App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的 Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:

1、 Tomcat
Tomcat严格意义上并不是一个真正的 App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如 JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置 Tomcat的介绍:

Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ;,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ ;。

下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:

JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录

这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。

Tomcat提供了两个Web界面的管理工具,URL分别是:
http://localhost:8080/admin/index.jsp ;
http://localhost:8080/manager/html ;
在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:

<role rolename="manager"/>
<role rolename="admin"/>
<user username="robbin" password="12345678" roles="admin,manager,tomcat"/>

这样用户"robbin"就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

2、 BEA Weblogic
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp,Weblogic的在线文档:http://edocs.bea.com/ ;。

3、 IBM Webshpere
Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ;,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html ;。

4、 Jboss
Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然而Jboss的文档是不免费,需要花钱购买,所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档,可以用来参考:http://www.jdon.com/idea.html ;

四、 Java应用的运行环境

Java的应用可以简单分为以下几个方面:

1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。

2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务

3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务

4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。

Java Learning Path(二)、书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

在所有的Java书籍当中,其实最最有用的,并不是O'reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外, Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的 Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个 Documentation,什么其他的书籍都不需要了。

对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是 Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。

EJB的书籍当中,《Enterprise JavaBeans,  2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是 Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而 Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

如果是结合Weblogic来学习J2EE的话,《J2EE应用与 BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是 BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习"设计模式"。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

Java Learning Path(三)过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习Java的第一步是安装好JDK,写一个Hello World,? 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是 package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法, public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;

这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住 3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。

第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步, Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

第六步,Java Web 编程,Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好 Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。

在Servlet/JSP 的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对 JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。

此外Java Web编程学习的重点要放在 Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。

第七步,J2EE编程
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。

首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。

然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用 JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit (false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。

在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。

在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。

J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。

另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

Java Learning Path(四) 方法篇

Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。

举个例子,我们都编过Hello World


public class HelloWorld {  public static void main(String[] args) {    System.out.println("Hello World");  }}


很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把 main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把 String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。

我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。

此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。

其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose
java ?verbose
javac ?verbose 以及其它很多JDK工具都有这个选项
-verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。

另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。

所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个 src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。

Java Learning Path(五)资源篇

1、 http://java.sun.com/ (英文)
Sun的Java网站,是一个应该经常去看的地方。不用多说。

2、http://www-900.ibm.com/developerWorks/cn/ ;
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!

3、http://www.javaworld.com/ (英文)
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。

4、http://dev2dev.bea.com.cn/index.jsp ;
BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。

5、http://www.huihoo.com/ ;
灰狐动力网站,一个专业的中间件网站,虽然不是专业的Java网站,但是在J2EE企业应用技术方面有深厚的造诣。

6、http://www.theserverside.com/ (英文)
TheServerSide是一个著名的专门面向Java Server端应用的网站。

7、http://www.javaresearch.org/ ;
Java研究组织,有很多优秀的Java方面的文章和教程,特别是在JDO方面的文章比较丰富。

8、http://www.cnjsp.org/ ;
JSP技术网站,有相当多的Java方面的文章和资源。

9、http://www.jdon.com/ ;
Jdon论坛,是一个个人性质的中文J2EE专业技术论坛,在众多的Java的中文论坛中,Jdon一个是技术含量非常高,帖子质量非常好的论坛。

10、http://sourceforge.net/
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件

posted @ 2005-09-01 20:30 JavaExplore 阅读(487) | 评论 (0)编辑 收藏