隨筆 - 18, 文章 - 0, 評論 - 8, 引用 - 0
          數據加載中……

          我的eclipse插件

          1.MyEclipse
             新出的GA4.0,功能非常強大,是我的首先。
             http://www.myeclipseide.com
          2.Log4E
             配合和Log4j日志功能
             http://log4e.jayefem.de/update
          3.i18n
             編輯國際化資源文件,省得寫native2ascii了
             http://propedit.sourceforge.jp/eclipse_plugins/
          4.FreeMen
              隨時知道內存使用情況
              http://www.junginger.biz/eclipse/

          posted @ 2005-09-04 16:13 丑男 閱讀(400) | 評論 (0)編輯 收藏

          [轉帖]學習Reflection

          Reflection 是 Java 程序開發語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,并能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱并顯示出來。
          Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
          JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過 reflection 動態的載入并取得 Java 組件(類) 的屬性。
           
          1. 一個簡單的例子
          考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。
          import java.lang.reflect.*;
          public class DumpMethods {
             public static void main(String args[]) {
                 try {
                     Class c = Class.forName(args[0]);
                     Method m[] = c.getDeclaredMethods();
                     for (int i = 0; i < m.length; i++)
                         System.out.println(m[i].toString());
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          按如下語句執行:
          java DumpMethods java.util.Stack
          它的結果輸出為:
          public java.lang.Object java.util.Stack.push(java.lang.Object)
          public synchronized java.lang.Object java.util.Stack.pop()
          public synchronized java.lang.Object java.util.Stack.peek()
          public boolean java.util.Stack.empty()
          public synchronized int java.util.Stack.search(java.lang.Object)
          這樣就列出了java.util.Stack 類的各方法名以及它們的限制符和返回類型。
          這個程序使用 Class.forName 載入指定的類,然后調用 getDeclaredMethods 來獲取這個類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個類中單個方法的一個類。
          2.開始使用 Reflection
          用于 reflection 的類,如 Method,可以在 java.lang.relfect 包中找到。使用這些類的時候必須要遵循三個步驟:第一步是獲得你想操作的類的 java.lang.Class 對象。在運行中的 Java 程序中,用 java.lang.Class 類來描述類和接口等。
          下面就是獲得一個 Class 對象的方法之一:
          Class c = Class.forName("java.lang.String");
          這條語句得到一個 String 類的類對象。還有另一種方法,如下面的語句:
          Class c = int.class;
          或者
          Class c = Integer.TYPE;
          它們可獲得基本類型的類信息。其中后一種方法中訪問的是基本類型的封裝類 (如 Integer) 中預先定義好的 TYPE 字段。
          第二步是調用諸如 getDeclaredMethods 的方法,以取得該類中定義的所有方法的列表。
          一旦取得這個信息,就可以進行第三步了——使用 reflection API 來操作這些信息,如下面這段代碼:
          Class c = Class.forName("java.lang.String");
          Method m[] = c.getDeclaredMethods();
          System.out.println(m[0].toString());
          它將以文本方式打印出 String 中定義的第一個方法的原型。
          在下面的例子中,這三個步驟將為使用 reflection 處理特殊應用程序提供例證。
          模擬 instanceof 操作符
          得到類信息之后,通常下一個步驟就是解決關于 Class 對象的一些基本的問題。例如,Class.isInstance 方法可以用于模擬 instanceof 操作符:
          class A {
          }
          public class instance1 {
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("A");
                     boolean b1 = cls.isInstance(new Integer(37));
                     System.out.println(b1);
                     boolean b2 = cls.isInstance(new A());
                     System.out.println(b2);
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          在這個例子中創建了一個 A 類的 Class 對象,然后檢查一些對象是否是 A 的實例。Integer(37) 不是,但 new A() 是。
          3.找出類的方法
          找出一個類中定義了些什么方法,這是一個非常有價值也非常基礎的 reflection 用法。下面的代碼就實現了這一用法:
          import java.lang.reflect.*;
          public class method1 {
             private int f1(Object p, int x) throws NullPointerException {
                 if (p == null)
                     throw new NullPointerException();
                 return x;
             }
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("method1");
                     Method methlist[] = cls.getDeclaredMethods();
                     for (int i = 0; i < methlist.length; i++) {
                         Method m = methlist[i];
                         System.out.println("name = " + m.getName());
                         System.out.println("decl class = " + m.getDeclaringClass());
                         Class pvec[] = m.getParameterTypes();
                         for (int j = 0; j < pvec.length; j++)
                             System.out.println("param #" + j + " " + pvec[j]);
                         Class evec[] = m.getExceptionTypes();
                         for (int j = 0; j < evec.length; j++)
                             System.out.println("exc #" + j + " " + evec[j]);
                         System.out.println("return type = " + m.getReturnType());
                         System.out.println("-----");
                     }
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          這個程序首先取得 method1 類的描述,然后調用 getDeclaredMethods 來獲取一系列的 Method 對象,它們分別描述了定義在類中的每一個方法,包括 public 方法、protected 方法、package 方法和 private 方法等。如果你在程序中使用 getMethods 來代替 getDeclaredMethods,你還能獲得繼承來的各個方法的信息。
          取得了 Method 對象列表之后,要顯示這些方法的參數類型、異常類型和返回值類型等就不難了。這些類型是基本類型還是類類型,都可以由描述類的對象按順序給出。
          輸出的結果如下:
          name = f1
          decl class = class method1
          param #0 class java.lang.Object
          param #1 int
          exc #0 class java.lang.NullPointerException
          return type = int
          -----
          name = main
          decl class = class method1
          param #0 class [Ljava.lang.String;
          return type = void
          -----

          4.獲取構造器信息
          獲取類構造器的用法與上述獲取方法的用法類似,如:
          import java.lang.reflect.*;
          public class constructor1 {
             public constructor1() {
             }
             protected constructor1(int i, double d) {
             }
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("constructor1");
                     Constructor ctorlist[] = cls.getDeclaredConstructors();
                     for (int i = 0; i < ctorlist.length; i++) {
                         Constructor ct = ctorlist[i];
                         System.out.println("name = " + ct.getName());
                         System.out.println("decl class = " + ct.getDeclaringClass());
                         Class pvec[] = ct.getParameterTypes();
                         for (int j = 0; j < pvec.length; j++)
                             System.out.println("param #" + j + " " + pvec[j]);
                         Class evec[] = ct.getExceptionTypes();
                         for (int j = 0; j < evec.length; j++)
                             System.out.println("exc #" + j + " " + evec[j]);
                         System.out.println("-----");
                     }
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          這個例子中沒能獲得返回類型的相關信息,那是因為構造器沒有返回類型。
          這個程序運行的結果是:
          name = constructor1
          decl class = class constructor1
          -----
          name = constructor1
          decl class = class constructor1
          param #0 int
          param #1 double
          -----
          5.獲取類的字段(域)
          找出一個類中定義了哪些數據字段也是可能的,下面的代碼就在干這個事情:

          import java.lang.reflect.*;
          public class field1 {
             private double d;
             public static final int i = 37;
             String s = "testing";
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("field1");
                     Field fieldlist[] = cls.getDeclaredFields();
                     for (int i = 0; i < fieldlist.length; i++) {
                         Field fld = fieldlist[i];
                         System.out.println("name = " + fld.getName());
                         System.out.println("decl class = " + fld.getDeclaringClass());
                         System.out.println("type = " + fld.getType());
                         int mod = fld.getModifiers();
                         System.out.println("modifiers = " + Modifier.toString(mod));
                         System.out.println("-----");
                     }
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          這個例子和前面那個例子非常相似。例中使用了一個新東西 Modifier,它也是一個 reflection 類,用來描述字段成員的修飾語,如“private int”。這些修飾語自身由整數描述,而且使用 Modifier.toString 來返回以“官方”順序排列的字符串描述 (如“static”在“final”之前)。這個程序的輸出是:
          name = d
          decl class = class field1
          type = double
          modifiers = private
          -----
          name = i
          decl class = class field1
          type = int
          modifiers = public static final
          -----
          name = s
          decl class = class field1
          type = class java.lang.String
          modifiers =
          -----
          和獲取方法的情況一下,獲取字段的時候也可以只取得在當前類中申明了的字段信息 (getDeclaredFields),或者也可以取得父類中定義的字段 (getFields) 。

          6.根據方法的名稱來執行方法
          文本到這里,所舉的例子無一例外都與如何獲取類的信息有關。我們也可以用 reflection 來做一些其它的事情,比如執行一個指定了名稱的方法。下面的示例演示了這一操作:
          import java.lang.reflect.*;
          public class method2 {
             public int add(int a, int b) {
                 return a + b;
             }
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("method2");
                     Class partypes[] = new Class[2];
                     partypes[0] = Integer.TYPE;
                     partypes[1] = Integer.TYPE;
                     Method meth = cls.getMethod("add", partypes);
                     method2 methobj = new method2();
                     Object arglist[] = new Object[2];
                     arglist[0] = new Integer(37);
                     arglist[1] = new Integer(47);
                     Object retobj = meth.invoke(methobj, arglist);
                     Integer retval = (Integer) retobj;
                     System.out.println(retval.intvalue());
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          假如一個程序在執行的某處的時候才知道需要執行某個方法,這個方法的名稱是在程序的運行過程中指定的 (例如,JavaBean 開發環境中就會做這樣的事),那么上面的程序演示了如何做到。
          上例中,getMethod 用于查找一個具有兩個整型參數且名為 add 的方法。找到該方法并創建了相應的 Method 對象之后,在正確的對象實例中執行它。執行該方法的時候,需要提供一個參數列表,這在上例中是分別包裝了整數 37 和 47 的兩個 Integer 對象。執行方法的返回的同樣是一個 Integer 對象,它封裝了返回值 84。
          7.創建新的對象
          對于構造器,則不能像執行方法那樣進行,因為執行一個構造器就意味著創建了一個新的對象 (準確的說,創建一個對象的過程包括分配內存和構造對象)。所以,與上例最相似的例子如下:
          import java.lang.reflect.*;
          public class constructor2 {
             public constructor2() {
             }
             public constructor2(int a, int b) {
                 System.out.println("a = " + a + " b = " + b);
             }
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("constructor2");
                     Class partypes[] = new Class[2];
                     partypes[0] = Integer.TYPE;
                     partypes[1] = Integer.TYPE;
                     Constructor ct = cls.getConstructor(partypes);
                     Object arglist[] = new Object[2];
                     arglist[0] = new Integer(37);
                     arglist[1] = new Integer(47);
                     Object retobj = ct.newInstance(arglist);
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          根據指定的參數類型找到相應的構造函數并執行它,以創建一個新的對象實例。使用這種方法可以在程序運行時動態地創建對象,而不是在編譯的時候創建對象,這一點非常有價值。
          8.改變字段(域)的值
          reflection 的還有一個用處就是改變對象數據字段的值。reflection 可以從正在運行的程序中根據名稱找到對象的字段并改變它,下面的例子可以說明這一點:
          import java.lang.reflect.*;
          public class field2 {
             public double d;
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("field2");
                     Field fld = cls.getField("d");
                     field2 f2obj = new field2();
                     System.out.println("d = " + f2obj.d);
                     fld.setDouble(f2obj, 12.34);
                     System.out.println("d = " + f2obj.d);
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          這個例子中,字段 d 的值被變為了 12.34。
          9.使用數組
          本文介紹的 reflection 的最后一種用法是創建的操作數組。數組在 Java 語言中是一種特殊的類類型,一個數組的引用可以賦給 Object 引用。觀察下面的例子看看數組是怎么工作的:
          import java.lang.reflect.*;
          public class array1 {
             public static void main(String args[]) {
                 try {
                     Class cls = Class.forName("java.lang.String");
                     Object arr = Array.newInstance(cls, 10);
                     Array.set(arr, 5, "this is a test");
                     String s = (String) Array.get(arr, 5);
                     System.out.println(s);
                 } catch (Throwable e) {
                     System.err.println(e);
                 }
             }
          }
          例中創建了 10 個單位長度的 String 數組,為第 5 個位置的字符串賦了值,最后將這個字符串從數組中取得并打印了出來。
          下面這段代碼提供了一個更復雜的例子:
          import java.lang.reflect.*;
          public class array2 {
             public static void main(String args[]) {
                 int dims[] = new int[]{5, 10, 15};
                 Object arr = Array.newInstance(Integer.TYPE, dims);
                 Object arrobj = Array.get(arr, 3);
                 Class cls = arrobj.getClass().getComponentType();
                 System.out.println(cls);
                 arrobj = Array.get(arrobj, 5);
                 Array.setInt(arrobj, 10, 37);
                 int arrcast[][][] = (int[][][]) arr;
                 System.out.println(arrcast[3][5][10]);
             }
          }
          例中創建了一個 5 x 10 x 15 的整型數組,并為處于 [3][5][10] 的元素賦了值為 37。注意,多維數組實際上就是數組的數組,例如,第一個 Array.get 之后,arrobj 是一個 10 x 15 的數組。進而取得其中的一個元素,即長度為 15 的數組,并使用 Array.setInt 為它的第 10 個元素賦值。
          注意創建數組時的類型是動態的,在編譯時并不知道其類型。

          posted @ 2005-08-07 01:02 丑男 閱讀(427) | 評論 (0)編輯 收藏

          [轉帖]Eclipse快捷鍵

          作用域
          功能
          快捷鍵
          全局
          查找并替換
          Ctrl+F
          文本編輯器
          查找上一個
          Ctrl+Shift+K
          文本編輯器
          查找下一個
          Ctrl+K
          全局
          撤銷
          Ctrl+Z
          全局
          復制
          Ctrl+C
          全局
          恢復上一個選擇
          Alt+Shift+↓
          全局
          剪切
          Ctrl+X
          全局
          快速修正
          Ctrl1+1
          全局
          內容輔助
          Alt+/
          全局
          全部選中
          Ctrl+A
          全局
          刪除
          Delete
          全局
          上下文信息
          Alt+?
          Alt+Shift+?
          Ctrl+Shift+Space
          Java編輯器
          顯示工具提示描述
          F2
          Java編輯器
          選擇封裝元素
          Alt+Shift+↑
          Java編輯器
          選擇上一個元素
          Alt+Shift+←
          Java編輯器
          選擇下一個元素
          Alt+Shift+→
          文本編輯器
          增量查找
          Ctrl+J
          文本編輯器
          增量逆向查找
          Ctrl+Shift+J
          全局
          粘貼
          Ctrl+V
          全局
          重做
          Ctrl+Y
           
          查看
          作用域
          功能
          快捷鍵
          全局
          放大
          Ctrl+=
          全局
          縮小
          Ctrl+-
           
          窗口
          作用域
          功能
          快捷鍵
          全局
          激活編輯器
          F12
          全局
          切換編輯器
          Ctrl+Shift+W
          全局
          上一個編輯器
          Ctrl+Shift+F6
          全局
          上一個視圖
          Ctrl+Shift+F7
          全局
          上一個透視圖
          Ctrl+Shift+F8
          全局
          下一個編輯器
          Ctrl+F6
          全局
          下一個視圖
          Ctrl+F7
          全局
          下一個透視圖
          Ctrl+F8
          文本編輯器
          顯示標尺上下文菜單
          Ctrl+W
          全局
          顯示視圖菜單
          Ctrl+F10
          全局
          顯示系統菜單
          Alt+-
           
          導航
          作用域
          功能
          快捷鍵
          Java編輯器
          打開結構
          Ctrl+F3
          全局
          打開類型
          Ctrl+Shift+T
          全局
          打開類型層次結構
          F4
          全局
          打開聲明
          F3
          全局
          打開外部javadoc
          Shift+F2
          全局
          打開資源
          Ctrl+Shift+R
          全局
          后退歷史記錄
          Alt+←
          全局
          前進歷史記錄
          Alt+→
          全局
          上一個
          Ctrl+,
          全局
          下一個
          Ctrl+.
          Java編輯器
          顯示大綱
          Ctrl+O
          全局
          在層次結構中打開類型
          Ctrl+Shift+H
          全局
          轉至匹配的括號
          Ctrl+Shift+P
          全局
          轉至上一個編輯位置
          Ctrl+Q
          Java編輯器
          轉至上一個成員
          Ctrl+Shift+↑
          Java編輯器
          轉至下一個成員
          Ctrl+Shift+↓
          文本編輯器
          轉至行
          Ctrl+L
           
          搜索
          作用域
          功能
          快捷鍵
          全局
          出現在文件中
          Ctrl+Shift+U
          全局
          打開搜索對話框
          Ctrl+H
          全局
          工作區中的聲明
          Ctrl+G
          全局
          工作區中的引用
          Ctrl+Shift+G
           
          文本編輯
          作用域
          功能
          快捷鍵
          文本編輯器
          改寫切換
          Insert
          文本編輯器
          上滾行
          Ctrl+↑
          文本編輯器
          下滾行
          Ctrl+↓
           
          文件
          作用域
          功能
          快捷鍵
          全局
          保存
          Ctrl+X
          Ctrl+S
          全局
          打印
          Ctrl+P
          全局
          關閉
          Ctrl+F4
          全局
          全部保存
          Ctrl+Shift+S
          全局
          全部關閉
          Ctrl+Shift+F4
          全局
          屬性
          Alt+Enter
          全局
          新建
          Ctrl+N
           
          項目
          作用域
          功能
          快捷鍵
          全局
          全部構建
          Ctrl+B
           
          源代碼
          作用域
          功能
          快捷鍵
          Java編輯器
          格式化
          Ctrl+Shift+F
          Java編輯器
          取消注釋
          Ctrl+
          Java編輯器
          注釋
          Ctrl+/
          Java編輯器
          添加導入
          Ctrl+Shift+M
          Java編輯器
          組織導入
          Ctrl+Shift+O
          Java編輯器
          使用try/catch塊來包圍
          未設置,太常用了,所以在這里列出,建議自己設置。
          也可以使用Ctrl+1自動修正。
           
          運行
          作用域
          功能
          快捷鍵
          全局
          單步返回
          F7
          全局
          單步跳過
          F6
          全局
          單步跳入
          F5
          全局
          單步跳入選擇
          Ctrl+F5
          全局
          調試上次啟動
          F11
          全局
          繼續
          F8
          全局
          使用過濾器單步執行
          Shift+F5
          全局
          添加/去除斷點
          Ctrl+Shift+B
          全局
          顯示
          Ctrl+D
          全局
          運行上次啟動
          Ctrl+F11
          全局
          運行至行
          Ctrl+R
          全局
          執行
          Ctrl+U
           
          重構
          作用域
          功能
          快捷鍵
          全局
          撤銷重構
          Alt+Shift+Z
          全局
          抽取方法
          Alt+Shift+M
          全局
          抽取局部變量
          Alt+Shift+L
          全局
          內聯
          Alt+Shift+I
          全局
          移動
          Alt+Shift+V
          全局
          重命名
          Alt+Shift+R
          全局
          重做
          Alt+Shift+Y

          posted @ 2005-08-06 00:02 丑男 閱讀(444) | 評論 (0)編輯 收藏

          簡單應用日期類

          1.自定義格式
          ?? 用到java.text.SimpleDateFormat,其中參數如下:
          ???ss:秒
          ???mm:分
          ???hh:小時
          ???EEEE:星期
          ???MMMM:月份
          ?? dd:日期
          ?? yyyy:年份
          ????????Date?d?=?new?Date();
          ????????SimpleDateFormat?sdf?
          =?new?SimpleDateFormat("ss-mm-hh-EEEE-MMMM-dd-yyyy");
          ????????System.
          out.println(sdf.format(d));

          運行結果
          58-21-11-星期五-七月-22-2005

          2.DateFormat自帶格式
          ??????? Date?date?=?new?Date();?

          ????????DateFormat?shortDateFormat?
          =?DateFormat.getDateTimeInstance(?DateFormat.SHORT,?
          ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? DateFormat.SHORT);?
          ???????????System.out.println(shortDateFormat.format(date));
          ?????????? //輸出結果????? 05-7-22 下午11:47


          ?????????? DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(?DateFormat.MEDIUM,
          ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? DateFormat.MEDIUM);?
          ?????????? System.out.println?(mediumDateFormat.format(date));
          ?????????? //輸出結果?????? 2005-7-22 23:48:11


          ?????????? DateFormat longDateFormat =?DateFormat.getDateTimeInstance(?DateFormat.LONG,?
          ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? DateFormat.LONG);
          ?????????? System.out.println(longDateFormat.format(date));
          ?????????? //輸出結果????? 2005年7月22日 下午11時48分45秒


          ?????????? DateFormat fullDateFormat = DateFormat.getDateTimeInstance( DateFormat.FULL,
          ?????????????????????????????????????????????????????????????????????????????????????????????????????????????? DateFormat.FULL);
          ?????????? System.out.println?(fullDateFormat.format(date));
          ?????????? //輸出結果????? Saturday, September 29, 2001 8:44:45 PM EDT

          posted @ 2005-08-05 23:31 丑男 閱讀(434) | 評論 (0)編輯 收藏

          [轉帖]Log4j比較全面的配置

          LOG4J的配置之簡單使它遍及于越來越多的應用中了:Log4J配置文件實現了輸出到控制臺、文件、回滾文件、發送日志郵件、輸出到數據庫日志表、自定義標簽等全套功能。擇其一二使用就夠用了,

           

          log4j.rootLogger=DEBUG,CONSOLE,A1,im
          log4j.addivity.org.apache=true

           

          # 應用于控制臺

          log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
          log4j.appender.Threshold=DEBUG
          log4j.appender.CONSOLE.Target=System.out
          log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
          log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


          #應用于文件

          log4j.appender.FILE=org.apache.log4j.FileAppender
          log4j.appender.FILE.File=file.log
          log4j.appender.FILE.Append=false
          log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
          log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          # Use this layout for LogFactor 5 analysis

           

          # 應用于文件回滾

          log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
          log4j.appender.ROLLING_FILE.Threshold=ERROR
          log4j.appender.ROLLING_FILE.File=rolling.log
          log4j.appender.ROLLING_FILE.Append=true
          log4j.appender.ROLLING_FILE.MaxFileSize=10KB
          log4j.appender.ROLLING_FILE.MaxBackupIndex=1
          log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
          log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


          #應用于socket
          log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
          log4j.appender.SOCKET.RemoteHost=localhost
          log4j.appender.SOCKET.Port=5001
          log4j.appender.SOCKET.LocationInfo=true
          # Set up for Log Facter 5
          log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
          log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


          # Log Factor 5 Appender
          log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
          log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

           

          # 發送日志給郵件

          log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
          log4j.appender.MAIL.Threshold=FATAL
          log4j.appender.MAIL.BufferSize=10
          log4j.appender.MAIL.From=xxx@www.xxx.com
          log4j.appender.MAIL.SMTPHost=www.wusetu.com
          log4j.appender.MAIL.Subject=Log4J Message
          log4j.appender.MAIL.To=xxx@www.xxx.com
          log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
          log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

           

          # 用于數據庫
          log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
          log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
          log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
          log4j.appender.DATABASE.user=root
          log4j.appender.DATABASE.password=
          log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
          log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
          log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


          log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A1.File=SampleMessages.log4j
          log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
          log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout


          輸出到2000NT日志
           把Log4j壓縮包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目錄下

           log4j.logger.NTlog=FATAL, A8
           # APPENDER A8
           log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
           log4j.appender.A8.Source=JavaTest
           log4j.appender.A8.layout=org.apache.log4j.PatternLayout
           log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

          #自定義Appender

          log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

          log4j.appender.im.host = mail.cybercorlin.net
          log4j.appender.im.username = username
          log4j.appender.im.password = password
          log4j.appender.im.recipient = xxx@xxx.net

          log4j.appender.im.layout=org.apache.log4j.PatternLayout
          log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

          posted @ 2005-07-24 22:25 丑男 閱讀(661) | 評論 (0)編輯 收藏

          學習Log4j筆記

          今天花了一天的時間來配置Log4j,沒想到要那么多時間,還問了不少人,帖子也發了不少,不過最終還是搞定了,不過還有些問題,請高手幫我看看,多謝了。

          1.首先是配置簡單java project
          現在來看log4j.propertise
          #級別為DEBUG,二個輸出端,分別為stdout,R
          log4j.logger.helloappLogger=DEBUG, stdout, R

          #控制臺輸出
          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n

          #保存到helloappLoggerlog.txt日志中,大小為100KB
          log4j.appender.R=org.apache.log4j.RollingFileAppender
          log4j.appender.R.File=F:/code/eclipse/workspace/TestLo4j/log/helloappLoggerlog.txt
          log4j.appender.R.MaxFileSize=100KB
          log4j.appender.R.MaxBackupIndex=1
          log4j.appender.R.layout=org.apache.log4j.PatternLayout
          log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n

          java文件中用到日志
          package com;
          import org.apache.log4j.*;
          public class TestLog4j {
              static Logger logger = Logger.getLogger("helloappLogger");
              public static void main(String[] args) {
          //      PropertyConfigurator.configure("log4j.properties");
          //      如果.properties在當前目錄下可以省略,我放在項目根目錄下,和com包同目錄
                  logger.debug("Debug ...");
                  logger.info("Info ...");
                  logger.warn("Warn ...");
                  logger.error("Error ...");
              }
          }

          2.web project中配置log4j

          還是先來看log4j.perproties

          #級別為DEBUG,三個輸出端,分別為stdout,FILE,R
          log4j.logger.hello=DEBUG, stdout, FILE, R

          #stdout是在控制臺輸出
          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n

          #保存在rolling_log_file.log日志中,appender是RollingFileAppender
          #需要注意的是File=F:/code/...,不要寫成\,這就一點害死我了
          log4j.appender.R=org.apache.log4j.RollingFileAppender
          log4j.appender.R.File=F:/code/eclipse/workspace/TestCvs/WebRoot/WEB-INF/rolling_log_file.log
          log4j.appender.R.MaxFileSize=100KB
          log4j.appender.R.MaxBackupIndex=1
          log4j.appender.R.layout=org.apache.log4j.PatternLayout
          log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n

          #保存在log_file.log日志中,appender是FileAppender
          log4j.appender.FILE=org.apache.log4j.FileAppender
          log4j.appender.FILE.File=F:/code/eclipse/workspace/TestCvs/WebRoot/WEB-INF/log_file.log
          log4j.appender.FILE.Append=false
          log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
          log4j.appender.FILE.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n

          之后要把它加入serlet中,和服務器一起啟動,方便其他程序使用

          public class Log4jServlet extends HttpServlet {
              public void init() throws ServletException {
                  ServletContext sct = getServletContext();
                  System.out.println("[Log4j]: The Root Path: " + sct.getRealPath("/"));
                  System.out.println("[Log4j]: InitServlet init start...");
                  PropertyConfigurator.configure(sct.getRealPath("/")
                        +getServletConfig().getInitParameter("propfile"));
                  System.out.println("[Log4j]: InitServlet init over.");
              }
          }

          <servlet>
              <description>init log4j of servlet</description>
              <display-name>log4j servlet</display-name>
              <servlet-name>Log4jServlet</servlet-name>
              <servlet-class>com.testCvs.Log4jServlet</servlet-class>
              <init-param>
               <param-name>propfile</param-name>
               <param-value>/WEB-INF/log4j.properties</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>

          注:log4j.properties放在/WEB-INF下,servlet自動加載這個文件

          至此所有配置應該成功了,不過還是有些問題沒有解決好,問了幾個朋友也沒有得到好的答復,但是現在可以在控制臺和文件中輸出日志,基本功能達到了。還請各位有空給我看看這個錯誤,歡迎指正。

          錯誤如下:
          log4j:WARN No appenders could be found for logger (org.apache.jasper.compiler.JspRuntimeContext).
          log4j:WARN Please initialize the log4j system properly.

          posted @ 2005-07-24 22:10 丑男 閱讀(9670) | 評論 (8)編輯 收藏

          CVS配置學習筆記

          本文很簡單,CVS的配置,做個學習筆記吧,省得忘了
          1.首先要下載cvsnt,是windows平臺下cvs服務器端軟件。http://www.cvsnt.com/cvspro/

          2.安裝軟件并查看服務是否啟動

          3.建立Repositories,設置Server Settings,在Compatibility選中Respond as cvs 1.11.2 to version request,方便eclipse與其通信

          4.在eclipse中建立工程,之后右鍵project-->team-->share project-->,全部選擇默認設置

          至此,cvs配置成功,還是花了些時間。請各位高手指正

          posted @ 2005-07-23 23:37 丑男 閱讀(647) | 評論 (0)編輯 收藏

          開篇

          剛剛申請到blogjava,第一篇先報道吧!
          剛才大概看了幾個Blog,真是高手如林,其中就有大名鼎鼎的大胃,以前就教過我不少,看來又找到了學習的好地方。說實話,這段時間事情太多了,已經有些日子沒寫程序了,慚愧。不過從維護這個blog開始,我要繼續學習了,爭取年底能找個好工作。

          posted @ 2005-07-20 16:16 丑男 閱讀(426) | 評論 (0)編輯 收藏

          僅列出標題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 麦盖提县| 阿拉善盟| 德江县| 郁南县| 罗江县| 镇原县| 寻乌县| 蓬安县| 东乡| 商丘市| 富顺县| 基隆市| 山阴县| 丹江口市| 乳源| 宣化县| 长岭县| 池州市| 泰州市| 清水河县| 新巴尔虎右旗| 丹棱县| 福清市| 鸡泽县| 和硕县| 蓬安县| 阳城县| 田阳县| 郓城县| 崇礼县| 樟树市| 怀柔区| 孝感市| 西藏| 中山市| 定边县| 饶河县| 巴中市| 沧源| 东台市| 政和县|