<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 丑男 閱讀(397) | 評論 (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 丑男 閱讀(419) | 評論 (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 丑男 閱讀(441) | 評論 (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 丑男 閱讀(429) | 評論 (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 丑男 閱讀(657) | 評論 (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 丑男 閱讀(9659) | 評論 (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 丑男 閱讀(641) | 評論 (0)編輯 收藏

    開篇

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

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

    僅列出標題
    共2頁: 上一頁 1 2 
    主站蜘蛛池模板: 国产麻豆剧传媒精品国产免费| 国产一卡2卡3卡4卡无卡免费视频| 亚洲 无码 在线 专区| 在线观看亚洲AV日韩A∨| 国产在线观看免费观看不卡 | 久久青青草原亚洲av无码| 久久亚洲中文字幕无码| 国产青草视频在线观看免费影院| 亚洲AV无码精品国产成人| 亚洲第一区在线观看| yellow视频免费看| 久久精品国产亚洲AV麻豆不卡| 久久黄色免费网站| 亚洲精品第五页中文字幕| 成人免费毛片视频| 美女视频黄a视频全免费网站色| 全部免费毛片在线| 亚洲免费一区二区| 亚洲国产精品免费视频| 国产成人免费午夜在线观看| 亚洲日韩精品无码专区加勒比☆ | 亚洲精品一级无码中文字幕| caoporm超免费公开视频| 亚洲国产精品自在线一区二区| 曰曰鲁夜夜免费播放视频| 色偷偷亚洲第一综合网| 亚洲真人日本在线| 日本在线看片免费人成视频1000| 亚洲影视自拍揄拍愉拍| 免费一级毛片在线观看| 久久久久久影院久久久久免费精品国产小说 | 亚洲国产精品自在在线观看 | 亚洲人成色777777老人头| 亚洲免费在线观看| 99re视频精品全部免费| 久久亚洲AV成人无码国产电影| 亚洲片国产一区一级在线观看| 色老头永久免费网站| 污视频网站在线免费看| 亚洲国产综合精品| 激情综合色五月丁香六月亚洲|