web.xml續....<servlet-mapping> 
  <servlet-name>invoker</servlet-name>
  <url-pattern>/servlet/*</url-pattern>
 </servlet-mapping>

解决方案 »

  1.   

    Java 編程經驗總結
    1. 注意編程的規範性(如果注釋的書寫,變量的定義規範性)
    1. ArrayList類來取代Vector類的主要原因是:
    Vector類的方法是同步的,允許多線程同時訪問對象.因此,對於單線程的應用程序而言,采用ArrayList, 其運行效率會有所提高.
    經實驗測試:ArrayList與數組的運行效率(數組的75%) 幾乎相同.除非你是處理數百万的對象,否則你不必在乎這種細微的差別. Vector稍微有些慢,但也是數組的2/3
    List(interface) 次序(order)是List最重要的特征;它保証以某种特定次序來維護元素.List為Collection加入了一些函數,使它得以在List內進行安插和移除動作(建議你只在LinkedList上這么做).List會產生ListIterator,通過它你可以從兩個方向來對List進行走訪,也可以在List之內進行元素的安插和移除
    ArrayList 底層以Array實現完成的List.允許快速隨机訪問,但是當元素的安插或移除發生于List中央位置時,效率便很差.面對ArrayList.你應該只拿ListIterator來進行向后或向前走訪動作,而不應該拿它來進行元素安插和移除動作.因為後者所花費的代價遠較LinkedList高昂
    LinkedList 底層以一般的雙向鏈表(double-linkedlist)實現,提供最佳循序訪問,以及成本低廉的”List中央位置元素安插和移除”.隨机訪問動作則相對緩慢(如果想進行隨機訪問,請改用ArrayList).它還具備addFirst(),addLast(),getFirst(),getLast(),removeLast()(這些函數並未定義于任何一個interface或base class中),使其可被拿來當做stack,queue,或deque
    2. Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現,HashMap允許將null作為一個entry的key或者value,而Hashtable不允許,還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey .因為contains方法容易讓人引起誤解,最大的不同是: Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
    一些資料建議:當需要同步時,用Hashtable,反之用HashMap(因為同步增加了很多處理費用).但是,因為在需要時,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基於一陳舊的類的,所有有人認為,在各种情況下,HashMap都优于Hashtable。
    3. java.lang.String 類中的equals()方法和==之間的區別:
         Object 类中定义的 equals(Object) 方法是直接使用 "==" 比较的两个对象,所以在没有覆盖 (override,或称改写、重写) equals(Object) 方法的情况下,equals(Object) 与 "==" 一样是比较的引用.
         equals(Object) 方法与 "==" 相比的特殊之处就在于它可以覆盖,所以我们可以通过覆盖的办法让它不是比较引用而是比较数据内容。当然 JDK 中也有覆盖过 equals(Object) 方法的类,如 java.lang.String,它就覆盖了从 Object 继承来的的 equals(Object) 方法,用以比较字符串内容是否相同
    4. 1>int a=1;if(a){System.out.println("aa");}else{System.out.println("bb");}
    2>{int x = 12;{int x = 96;}}
    以上代碼在C/C++里面可能是被允許,但在JAVA里面是不被允許的
    5. switch()語句可以實現多路選擇,然而它需要一個能產生像int或char這樣的整數值的選擇條件,假如你用字符串或是浮點數作為選擇條件,那你只能用一連串的if語句了
    6. 可以通過參數個數或是參數類型,或是參數出現的先後順序來判斷兩個重載函數,但不能根據返回類型判斷兩個函數是不是重載函數(以上前提均是函數名完全相同)
    7. 類的static 方法只能訪問其它static方法和static數據成員
      

  2.   

    續.....
    對于static數據成員或方法即可通過類直接調用也可通過對象調用,而對于非static數據成員或方法則只能通過對象調用. .
    9. JAVA訪問控制:
    同一類 同一個包的子類 同一包的非子類 不同包的子類 不同包的非子類
    Private V
    Protected V V V V*
    Friendly V V V
    Public V V V V V
    Note:其中*表示只能通過子類對象訪問,不能通過父類對象訪問
    10. 派生類(subClass)對象賦給父類/基類(base Class)對象(此步操作通常也被稱為上傳upcasting)總是安全的,因為你是把一個具體的類型轉化為較為一般的類型.也就是派生類是基類的超集(superset),但是反過來(下傳downcasting)就不一定安全了
    11. final 修飾的類表示:此類不可再派生出子類(final類的數據可以是final的,也可以不是final的,由于final類禁止了繼承,覆寫方法已經不可能了,因此所有的方法的都隱含的變成了final,你可以為final類的方法加一個final修飾符,但是這樣已沒什麼意義). final修飾的方法在派生過程中不能被覆蓋
    12. 如果類中包含一個或多個abstract method,那麼這個類就必須定義成abstract.但用abstract聲明的類
    不一定包含abstract method.
    如果繼承了abstract類,而且還打算創建這個新類的object,那么新類就必須實現基類定義的全部abstract method,如果不這麼做,那么新繼承的新類也成了抽象類了,編譯器會強制你用abstract關鍵詞來聲明這個新類
    13. 複雜對象构造函數的調用順序:
    首先調用基類的构造函數,這是一個遞歸的過程,因此會先創建繼承體系的根,然後是下一級派生類,
    依此類推,直到最後一個繼承類的构造函數
    成員對象按其聲明順序進行初始化.
    執行繼承類的構造函數的正文
    14. Interface的數據成員自動就是static和final的,方法自動就是public的
    15. 一旦将变量作为类成员使用,就要特别注意由Java分配的默认值。这样做可保证主类型的成员变量肯定得到了初始化(C++不具备这一功能),可有效遏止多种相关的编程错误。然而,这种保证却并不适用于“局部”变量,那些变量并非一个类的字段。所以,假若在一个函数定义中写入下述代码:
    int x;那么x会得到一些随机值(这与C和C++是一样的),不会自动初始化成零。我们责任是在正式使用x前分配一个适当的值。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。这种处理正是Java优于C++的表现之一。许多C++编译器会对变量未初始化发出警告,但在Java里却是错误。
    16. 将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。若在程序运行以前执行绑定(由编译器和链接程序,如果有的话),就叫作“早期绑定”. 后期绑定也叫作“动态绑定”或“运行期绑定”。
    17. java i/o:
    public class FileCopy{
      public static void main(String args[]){
    /******首先定義兩個file實例*******/
    File inputFile=new File(“E://files//partnovel.txt”);
    File outputFile=new File(“E://files//target.txt”);
    /***********然後在兩個文件上建立輸入輸出流***********/