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

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

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

    posts - 495,  comments - 11,  trackbacks - 0
     
    UltraEdit 固然是個優(yōu)秀的編輯器,但是安裝它后,在IE中選”查看源文件“碼的時候,默認不是Notepad了!

    而我常常只是為了搜尋一下某些關(guān)鍵字... ...

    一個簡短的“查看源文件“的動作就要開啟一個UltraEdit,感覺就是殺雞用牛刀!

    找了一下,修正的方法如下,修改一下注冊表:

    找到這里:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name

    把默認的編輯器修改為:

    C:\WINNT\NOTEPAD.EXE (for Windows 2000)
    C:\WINDOWS\NOTEPAD.EXE (for Windows XP/2003)

    這樣就可以了!
    posted @ 2007-09-08 19:30 jadmin 閱讀(50) | 評論 (0)編輯 收藏
      針對在編程過程中,大量使用“System.out.println(); ”語句進行調(diào)試,監(jiān)測,給在后期部署及維護的過程中增加了一定難度,特編寫本文檔,規(guī)范JAVA控制臺輸出的函數(shù)的使用,增強代碼的可維護性。

      一般在編碼過程中,為了檢測代碼邏輯或顯示計算結(jié)果等,我們需要在控制臺中打印一些信息來確定代碼的正確性,或查看程序運行狀態(tài)。通常情況下,在JAVA中會直接使用函數(shù)“System.out.println()”或“System.out.print()”來向控制臺輸出信息。這些函數(shù)可能會出現(xiàn)在代碼的任何位置,在代碼行數(shù)不斷增多及隨著時間的推移,這些函數(shù)也會造成許多冗余的輸出,且對其程序本身的功能無任何用處,當(dāng)然也不會影響到具體功能的實現(xiàn)。但是在實際部署或進行后期維護時,當(dāng)有些輸出到控制臺的信息影響到你,為你的部署及維護帶來許多不便時,你想刪除某個信息的輸出卻不是那么容易,就得在代碼中一個一個去查找他們的位置,手動刪除每一個不必要的“System.out.prin…”。

      其實要改變手動查找“System.out.prin…” 的煩惱也很簡單,只要簡單的遵循如下規(guī)則即可。

    <!--[if !supportLists]-->1. <!--[endif]-->編寫一個JAVA類“XXXUtil ”,在里面設(shè)置一個布爾型的成員變量,再寫一個方法來替換掉所有的“System.out.prin…”就行了!

    <!--[if !supportLists]-->2. <!--[endif]-->將此JAVA類放入你的工程中。


    KooeUtil.java:

    public class KooeUtil {

    // 該變量值也可以通過文件獲取。

    public static Boolean isDebug = false;

    public static void echo (String str) {

    if (isDebug) {

    System.out.println(str);

    }

    }

    }

    <!--[if !vml]--> <!--[endif]-->
    具體實現(xiàn):

    public class XXXUtil {

    // 該變量值也可以通過文件獲取。


    public static Boolean isDebug = false;


    public static void echo (String str) {

    if (isDebug) { System.out.println(str); }

    }

    }

      將以上代碼加入你的工程,然后將所有的“System.out.println”替換成“XXXUtil .echo”即可。

      這樣我們就可以簡單的通過設(shè)置isDebug值來控制工程中所有的輸出函數(shù)是否輸出,使程序更具有可維護性。
    posted @ 2007-09-06 18:44 jadmin 閱讀(83) | 評論 (0)編輯 收藏
    Jython 2.2 發(fā)布了,這次發(fā)布的2.2版本實現(xiàn)了 Python 2.2 以及 2.3。

    Jython 是Python 的Java實現(xiàn)。無縫地結(jié)合了Java類與Python,使用戶能以Python語言的語法編寫在Java虛擬機上運行的程序。

    這次版本的新特性包括:

    new-style classes
    Java Collections integration
    PEP 302 implementation
    iterators
    generators
    __future__ division
    support for running on JDK1.5 and 1.6
    new installer
    a significant number of features to bring Jython in line with CPython


    官方站點:
    http://www.jython.org/
    posted @ 2007-09-02 14:40 jadmin 閱讀(66) | 評論 (0)編輯 收藏

    ???? 合作。不要隨便與人合作,與人合作要考慮好利與弊。如果有想法盡快去干,一個人努力地干,賣命地干。干到差不了,有資本了,可以與人短期性的合作。與人合作目標(biāo)要明確。

    ???? 努力。工作要努力,隨隨便便過日子過四五年也是過,稍微努力地過四五年也是過,努力地過四五年也是過,何不努力好好地干。如果努力地過好四五年,這對我們以后的人生很有幫助。

    ???? 吃苦耐勞。不要怕吃苦。在創(chuàng)業(yè)階段,我們要的是名氣,是經(jīng)驗,有時候在保本的情況下可以以低價策略來和別人競爭。我們出賣的是點腦力活,力氣活,年輕人,睡一覺起來什么都恢復(fù)了。

    ???? 目標(biāo)。生活要有目標(biāo),不僅僅是事業(yè)(賺錢)的目標(biāo),其他方面也要有目標(biāo),如愛情方面的目標(biāo)、健康方面的目標(biāo)、家庭方面的目標(biāo)。各個目標(biāo)都要重視。只賺了錢,不算人生的成功。

    ???? 虛心學(xué)習(xí)。多與比自己大的人(長輩)、成功人士交流學(xué)習(xí),要虛心聽取、認真分析他們的意見和建議,以免自己以后走彎路。

    ???? 了解社會。多了解社會、多實踐、多分析某些社會現(xiàn)象的因果厲害關(guān)系。認真分析身邊發(fā)生的某些事情。正視社會的陰暗面。分析社會上某些不良風(fēng)氣,不要清高自傲,也不要隨波逐流。某些時候辦事情,也需要這方面的幫助。

    ???? 自由。出來外面做事情,關(guān)鍵是自由、愉快,能學(xué)到知識。每走一步都要分析,不要因某一小點利益限制了自己的自由。

    ???? 計劃。給自己定一個五年計劃、十年規(guī)劃。每季度做什么事情、每個月做什么事情,甚至每天做什么事情,有個計劃,有個目標(biāo)比較好。不要每天昏昏惡惡。幾年后你會發(fā)現(xiàn),幾年來一直沒有目標(biāo),什么也沒有做成。

    ???? 膽量。你是工人的子弟,或是農(nóng)民的兒子,難免思想狹隘。不要盲目、盲從,也不要膽小怕事。多鍛煉,大膽去做事情,只要不違法。大膽去做,即使失敗了,也為下次積累了經(jīng)驗。“商場如戰(zhàn)場”,這句話一點不假。想想,在戰(zhàn)場上,不是你死就是我亡。

    ???? 謀略。人生活在社會上,就是要用自己的智慧謀略和別人斗智斗勇。即使有時你不想和別人斗,別人也要和你爭。既然不能退讓,何不爭一爭。古往今來,某些人的成功,不是電視小說里說的那么偶然,有其必然性。生活中不玩點小技巧(犯法的不做、害人的不做),哪能那么容易就成功.

    ???? 不要害怕貧窮。也許你家里沒有幾十萬上百萬元,大膽地去做事情,不要怕貧窮。即使我們的事情做失敗了,我們大不了回到起點,還是窮人。

    ???? 學(xué)習(xí)。不斷充實自己,學(xué)習(xí)新的知識,多學(xué)點技能,為以后作準(zhǔn)備,也可作為以后的娛樂消遣。如:駕駛技術(shù)、炒菜做飯、寫文章等。

    ???? 惜時。如果以*都做了,我估計你的時間過得很快。我常聽某某人說:“這一輩子,就象昨天今天一樣。”毛澤東說:“天地轉(zhuǎn),光陰迫。一萬年太久,只爭朝夕。”“三十八年過去彈指一揮間”。不要因碌碌無為而悔恨!

    ???? 請記住,以上忠告如果能夠做到了,你做什么都一定能夠成功!

    posted @ 2007-09-01 22:22 jadmin 閱讀(74) | 評論 (0)編輯 收藏

    童心

    ——無論你有多老,你的心不能變老

    音樂

    ——如果沒有音樂,你的人生將會乏味無比

    浪漫

    ——偶爾浪漫一下,那種感覺就像一只小鳥在空中飛翔吧

    優(yōu)雅

    ——何必要裝的粗魯呢,優(yōu)雅一點總是好的

    沉思

    ——在你有一肚子火要發(fā)之前,先給自己10分鐘沉思一會兒

    馳騁

    ——如果真的累了,就變成一只蝴蝶逃開一會吧,不要讓自己太累

    純潔

    ——現(xiàn)在的社會已經(jīng)夠混濁了,純潔真是不容易做到呢

    勇敢

    ——做個勇敢的精靈,不懼狂風(fēng)會撕碎你的翅膀

    可愛

    ——我相信,你會因為可愛而美麗

    posted @ 2007-09-01 22:12 jadmin 閱讀(44) | 評論 (0)編輯 收藏

    1、word的恢復(fù)

    方法1、點開始--運行,輸入"winword /a"(不含引號)
    ?????? 回車后會啟動word,所有界面和設(shè)置都恢復(fù)了初始狀態(tài),簡單吧!

    方法2、首先關(guān)閉Word程序,然后進入Word程序的默認模板所在的目錄Microsoft\Templates,將名為Normal. Dot的文件重命

    名為其他的文件名,然后再啟動Word,其所有設(shè)置與界面已經(jīng)恢復(fù)到剛剛安裝完畢后的狀態(tài)。
    (C:\Documents and Settings\登錄用戶名\Application Data\Microsoft\Templates,其中Application Data文件夾為隱含

    文件夾)


    2、excel的恢復(fù)
    刪除 Excel11.xlb(Excel2003) 這個檔后重新執(zhí)行Excel,就會恢復(fù)Excel預(yù)設(shè)的菜單設(shè)定
    Excel Xp 的位置:C:\Documents and Settings\登錄用戶名\Application Data\Microsoft\Excel

    注:建議用搜尋檔案 *.xlb(Normal. Dot)的方式


    posted @ 2007-09-01 18:07 jadmin 閱讀(67) | 評論 (0)編輯 收藏
    //ArrayList
    {
    ArrayList arraylist=new ArrayList();
    arraylist.add(0,"end");//指定索引加入值
    //需注意的是,如果現(xiàn)有2個值,我加入索引為5的那么就會出現(xiàn)異常
    for(int i=0;i<2;i++){
    arraylist.add(i,String.valueOf(i));
    }
    System.out.println("ArrayList:");
    for(int i=0;i<arraylist.size();i++){
    System.out.print(arraylist.get(i)+";");
    }
    arraylist.add("0");//直接加入值到ArrayList的最后
    arraylist.add("0");
    System.out.print("\nArrayList\'s lastIndexOf(\"0\") is "+arraylist.lastIndexOf("0"));
    }
    //Arrays
    {
    String []array=new String[]{"a","b","c"};
    List list=Arrays.asList(array);
    System.out.println("\nArrays:");
    for(int i=0;i<list.size();i++){
    System.out.print(list.get(i)+";");
    }
    System.out.print("\nArrays\'s length is "+array.length);//打印數(shù)組的長度
    }
    //Collections
    {
    String []array=new String[]{"a","b","c"};
    List list=Arrays.asList(array);
    Collections.fill(list,"Fill");//用Fill填充全部元素
    System.out.println("\nCollections:");
    for(int i=0;i<list.size();i++){
    System.out.print(list.get(i)+";");
    }
    array=new String[]{"1","2","3"};
    List list2=Arrays.asList(array);
    Collections.copy(list,list2);//拷貝list2的數(shù)據(jù)進list
    System.out.println("\n"+list);
    Collections.swap(list,2,1);//調(diào)換索引為1和2的元素的位置
    System.out.println(list);
    }
    //EventObject
    {
    String s="hello";
    String s2=s;
    EventObject eventobject=new EventObject(s);//一個準(zhǔn)容器類型,確切的歸類它不是容器
    System.out.println("EventObject:");
    System.out.println(eventobject.getSource());
    System.out.println(eventobject.equals(s2));
    }
    //HashMap
    {
    HashMap hashmap=new HashMap();//一個速度最快的容器
    hashmap.put("0","c");
    hashmap.put("1","a");
    hashmap.put("2","b");
    hashmap.put("3","a");
    System.out.println("HashMap:");
    System.out.println(hashmap);//該容器有其內(nèi)部的排序方式
    Set set=hashmap.keySet();//獲取全部鍵
    Iterator iterator=set.iterator();
    while(iterator.hasNext()){
    System.out.print(hashmap.get(iterator.next())+";");
    }
    }
    //HashSet
    {
    HashSet hashset=new HashSet();//一個絕對不能重復(fù)的類型
    hashset.add("c");
    hashset.add("b");
    hashset.add("a");
    hashset.add("a");
    hashset.add("b");
    System.out.println("\nHashSet:");
    System.out.println(hashset);
    Iterator iterator=hashset.iterator();//取出元素
    while(iterator.hasNext()){
    System.out.print(iterator.next()+";");
    }
    }
    //Hashtable
    {
    Hashtable hashtable=new Hashtable();//一個完全可以由其他容器替換的老容器類型
    hashtable.put("0","c");
    hashtable.put("1","a");
    hashtable.put("3","c");
    hashtable.put("2","b");
    System.out.println("\nHashtable:");
    Enumeration enumeration=hashtable.elements();//獲取元素,Enumeration已經(jīng)不是主流,Iterator是它的下一代替代品
    while(enumeration.hasMoreElements()){
    System.out.print(enumeration.nextElement()+";");
    }
    }
    //IdentityHashMap
    {
    IdentityHashMap identityhashmap=new IdentityHashMap();
    identityhashmap.put("0","c");
    identityhashmap.put("1","a");
    identityhashmap.put("3","b");
    identityhashmap.put("2","a");
    System.out.println("\nIdentityHashMap:");
    System.out.println(identityhashmap);
    System.out.println(identityhashmap.containsKey("3"));//是否包含這個鍵
    System.out.println(identityhashmap.containsValue("a"));//是否包含值
    Set set=identityhashmap.entrySet();//傳為Set類型
    System.out.println(set);
    set=identityhashmap.keySet();//全部鍵
    System.out.println(set);
    }
    //LinkedHashMap
    {
    LinkedHashMap linkedhashmap=new LinkedHashMap();
    linkedhashmap.put("0","b");
    linkedhashmap.put("2","a");
    linkedhashmap.put("1","c");
    linkedhashmap.put("3","b");
    System.out.println("LinkedHashMap:");
    System.out.println(linkedhashmap);
    System.out.println(linkedhashmap.containsKey("2"));//是否包含這個鍵
    System.out.println(linkedhashmap.containsValue("c"));//是否包含值
    Set set=linkedhashmap.keySet();
    Iterator iterator=set.iterator();
    while(iterator.hasNext()){
    System.out.print(linkedhashmap.get(iterator.next())+";");
    }
    }
    //LinkedHashSet
    {
    LinkedHashSet linkedhashset=new LinkedHashSet();//它包含了幾種Set的屬性但卻沒有自己的特色
    linkedhashset.add("c");
    linkedhashset.add("a");
    linkedhashset.add("a");
    linkedhashset.add("b");
    System.out.println("\nLinkedHashSet:");
    System.out.println(linkedhashset);
    System.out.println(linkedhashset.contains("a"));//是否包含對象
    Iterator iterator=linkedhashset.iterator();
    while(iterator.hasNext()){
    System.out.print(iterator.next()+";");
    }
    }
    //LinkedList
    {
    LinkedList linkedlist=new LinkedList();//自由使用是它的特色
    linkedlist.add("a");
    linkedlist.add(1,"c");
    linkedlist.addLast("b");
    linkedlist.addFirst("d");
    System.out.println("\nLinkedList:");
    System.out.println(linkedlist);
    //linkedlist.clear();//該方法清空容器
    //linkedlist.remove(0);//刪除索引為0的元素
    //linkedlist.remove("d");//刪除值為d的元素
    //linkedlist.removeFirst();//刪除第一個元素
    //linkedlist.removeLast();//刪除最后一個元素
    for(int i=0;i<linkedlist.size();i++){
    System.out.print(linkedlist.get(i)+";");
    }
    }
    //Stack
    {
    Stack stack=new Stack();//堆棧
    stack.add("b");
    stack.add(0,"c");
    stack.push("d");
    stack.add("e");
    stack.push("a");
    Enumeration enumeration=stack.elements();
    System.out.println("\nStack:");
    while(enumeration.hasMoreElements()){
    System.out.print(enumeration.nextElement()+";");
    }
    //后進先出
    System.out.println("\n"+stack.peek());
    System.out.println(stack.pop());
    System.out.println(stack.contains("d")+";"+stack.contains("a"));//是否包含該元素,有趣的事情發(fā)生了
    System.out.println(stack.search("c"));//非常有用的屬性,檢索,但是由后向前的排列
    }
    //TreeMap
    {
    TreeMap treemap=new TreeMap();
    treemap.put("0","d");
    treemap.put("2","a");
    treemap.put("1","b");
    treemap.put("3","c");
    System.out.println("\nTreeMap:");//可以對鍵排序
    System.out.println(treemap);
    System.out.println(treemap.firstKey());//返回第一個鍵
    Set set=treemap.keySet();
    Iterator iterator=set.iterator();
    while(iterator.hasNext()){
    System.out.print(treemap.get(iterator.next())+";");
    }
    }
    //TreeSet
    {
    TreeSet treeset=new TreeSet();//自動排序內(nèi)容
    treeset.add("b");
    treeset.add("a");
    treeset.add("c");
    treeset.add("d");
    System.out.println("\nTreeSet:");
    System.out.println(treeset);
    System.out.println(treeset.first());//返回第一個元素
    Iterator iterator=treeset.iterator();
    while(iterator.hasNext()){
    System.out.print(iterator.next()+";");
    }
    }
    //Vector
    {
    Vector vector=new Vector();
    vector.add(0,"b");
    vector.add("a");
    vector.addElement("d");
    vector.add("c");
    System.out.println("\nVector:");
    System.out.println(vector);
    vector.set(2,"h");//替換掉指定索引的元素
    System.out.println(vector);
    Object []str=vector.toArray();
    for(int i=0;i<str.length;i++){
    System.out.print(str[i]+";");
    }
    vector.setSize(2);//重新設(shè)置大小為2
    System.out.println("\n"+vector);
    }
    //WeakHashMap
    {
    WeakHashMap weakhashmap=new WeakHashMap();
    weakhashmap.put("1","b");
    weakhashmap.put("2","c");
    weakhashmap.put("0","d");
    weakhashmap.put("3","a");
    System.out.println("\nWeakHashMap:");
    System.out.println(weakhashmap);
    System.out.println(weakhashmap.containsKey("3"));//是否包含鍵
    System.out.println(weakhashmap.containsValue("d"));//是否包含值
    Set set=weakhashmap.entrySet();
    Iterator iterator=set.iterator();
    while(iterator.hasNext()){
    System.out.print(iterator.next()+";");
    }
    //weakhashmap.remove("2");//刪除該鍵對應(yīng)的值
    //weakhashmap.get("1");//獲取指定鍵的值
    }
    }
    posted @ 2007-09-01 16:27 jadmin 閱讀(56) | 評論 (0)編輯 收藏
    1.??? 在業(yè)務(wù)層使用JDBC直接操作數(shù)據(jù)庫-最簡單,最直接的操作

    1)數(shù)據(jù)庫url,username,password寫死在代碼中
    ???? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    ???? String url="jdbc:oracle:thin:@localhost:1521:orcl";
    ???? String user="scott";
    ???? String password="tiger";
    ???? Connection conn= DriverManager.getConnection(url,user,password);??
    ???? Statement stmt=conn.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ???? String sql="select * from test";
    ???? ResultSet rs=stmt.executeQuery(sql);

    2)采用Facade和Command模式,使用DBUtil類封裝JDBC操作;
    ?????? 數(shù)據(jù)庫url,username,password可以放在配置文件中(如xml,properties,ini等)。
    ?????? 這種方法在小程序中應(yīng)用較多。

    2.DAO(Data Accessor Object)模式-松耦合的開始
    DAO = data + accessor + domain object

    例如User類-domain object (javabean)
    UserDAO類-accessor ,提供的方法getUser(int id),save(User user)內(nèi)包含了JDBC操作
    在業(yè)務(wù)邏輯中使用這兩個類來完成數(shù)據(jù)操作。

    使用Factory模式可以方便不同數(shù)據(jù)庫連接之間的移植。

    3.數(shù)據(jù)庫資源管理模式
    3.1 數(shù)據(jù)庫連接池技術(shù)
    資源重用,避免頻繁創(chuàng)建,釋放連接引起大大量性能開銷;
    更快的系統(tǒng)響應(yīng)速度;

    通過實現(xiàn)JDBC的部分資源對象接口( Connection, Statement, ResultSet ),可以使用Decorator設(shè)計模式分別產(chǎn)生三種邏輯資源對象: PooledConnection, PooledStatement和 PooledResultSet。


    一個最簡單地數(shù)據(jù)庫連接池實現(xiàn):
    public class ConnectionPool {

    ??????? private static Vector pools;
    ??????? private final int POOL_MAXSIZE = 25;
    ??????? /**
    ???????? * 獲取數(shù)據(jù)庫連接
    ???????? * 如果當(dāng)前池中有可用連接,則將池中最后一個返回;若沒有,則創(chuàng)建一個新的返回
    ???????? */
    ??????? public synchronized Connection getConnection() {
    ?????????????? Connection conn = null;
    ?????????????? if (pools == null) {
    ????????????????????? pools = new Vector();
    ?????????????? }

    ?????????????? if (pools.isEmpty()) {
    ????????????????????? conn = createConnection();
    ?????????????? } else {
    ????????????????????? int last_idx = pools.size() - 1;
    ????????????????????? conn = (Connection) pools.get(last_idx);
    ????????????????????? pools.remove(last_idx);
    ?????????????? }

    ?????????????? return conn;
    ??????? }

    ??????? /**
    ???????? * 將使用完畢的數(shù)據(jù)庫連接放回池中
    ???????? * 若池中連接已經(jīng)超過閾值,則關(guān)閉該連接;否則放回池中下次再使用
    ???????? */
    ??????? public synchronized void releaseConnection(Connection conn) {
    ?????????????? if (pools.size() >= POOL_MAXSIZE)
    ????????????????????? try {
    ???????????????????????????? conn.close();
    ????????????????????? } catch (SQLException e) {
    ???????????????????????????? // TODO自動生成 catch 塊
    ???????????????????????????? e.printStackTrace();
    ????????????????????? } else
    ????????????????????? pools.add(conn);
    ??????? }

    ??????? public static Connection createConnection() {
    ?????????????? Connection conn = null;
    ?????????????? try {
    ????????????????????? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    ????????????????????? String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    ????????????????????? String user = "scott";
    ????????????????????? String password = "tiger";
    ????????????????????? conn = DriverManager.getConnection(url, user, password);
    ?????????????? } catch (InstantiationException e) {
    ????????????????????? // TODO自動生成 catch 塊
    ????????????????????? e.printStackTrace();
    ?????????????? } catch (IllegalAccessException e) {
    ????????????????????? // TODO自動生成 catch 塊
    ????????????????????? e.printStackTrace();
    ?????????????? } catch (ClassNotFoundException e) {
    ????????????????????? // TODO自動生成 catch 塊
    ????????????????????? e.printStackTrace();
    ?????????????? } catch (SQLException e) {
    ????????????????????? // TODO自動生成 catch 塊
    ????????????????????? e.printStackTrace();
    ?????????????? }
    ?????????????? return conn;
    ??????? }
    }

    注意:利用getConnection()方法得到的Connection,程序員很習(xí)慣地調(diào)用conn.close()方法關(guān)閉了數(shù)據(jù)庫連接,那么上述的數(shù)據(jù)庫連接機制便形同虛設(shè)。在調(diào)用conn.close()方法方法時如何調(diào)用releaseConnection()方法?這是關(guān)鍵。這里,我們使用Proxy模式和java反射機制。

    public synchronized Connection getConnection() {
    ?????????????? Connection conn = null;
    ?????????????? if (pools == null) {
    ????????????????????? pools = new Vector();
    ?????????????? }

    ?????????????? if (pools.isEmpty()) {
    ????????????????????? conn = createConnection();
    ?????????????? } else {
    ????????????????????? int last_idx = pools.size() - 1;
    ????????????????????? conn = (Connection) pools.get(last_idx);
    ????????????????????? pools.remove(last_idx);
    ?????????????? }
    ????????
    ???????? ConnectionHandler handler=new ConnectionHandler(this);
    ?????????????? return handler.bind(con);
    ??????? }

    public class ConnectionHandler implements InvocationHandler {
    ????? private Connection conn;
    ????? private ConnectionPool pool;
    ?????
    ????? public ConnectionHandler(ConnectionPool pool){
    ???????????? this.pool=pool;
    ????? }
    ?????
    ????? /**
    ?????? * 將動態(tài)代理綁定到指定Connection
    ?????? * @param conn
    ?????? * @return
    ?????? */
    ????? public Connection bind(Connection conn){
    ???????????? this.conn=conn;
    Connection proxyConn=(Connection)Proxy.newProxyInstance(
    conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this);
    ?????????? return proxyConn;
    ????? }
    ?????
    ??????? /* (非 Javadoc)
    ???????? * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
    ???????? */
    ??????? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    ?????????????? // TODO自動生成方法存根
    ?????????????? Object obj=null;
    ?????????????? if("close".equals(method.getName())){
    ????????????????????? this.pool.releaseConnection(this.conn);
    ?????????????? }
    ?????????????? else{
    ????????????????????? obj=method.invoke(this.conn, args);
    ?????????????? }
    ??????????????
    ?????????????? return obj;
    ??????? }
    }

    ?????? 在實際項目中,并不需要你來從頭開始來設(shè)計數(shù)據(jù)庫連接池機制,現(xiàn)在成熟的開源項目,如C3P0,dbcp,Proxool等提供了良好的實現(xiàn)。一般推薦使用Apache dbcp,基本使用實例:
    DataSource ds = null;
    ??? try{
    ????? Context initCtx = new InitialContext();
    ????? Context envCtx = (Context) initCtx.lookup("java:comp/env");
    ????? ds = (DataSource)envCtx.lookup("jdbc/myoracle");
    ???????? if(ds!=null){
    ???????????????? out.println("Connection is OK!");
    ???????????????? Connection cn=ds.getConnection();
    ???????????????? if(cn!=null){
    ???????????????????????? out.println("cn is Ok!");
    ???????????????? Statement stmt = cn.createStatement();
    ????????????????? ResultSet rst = stmt.executeQuery("select * from BOOK");
    ???????????????? out.println("<p>rst is Ok!" + rst.next());
    ???????????????? while(rst.next()){
    ???????????????????????? out.println("<P>BOOK_CODE:" + rst.getString(1));
    ?????????????????? }
    ???????????????????????? cn.close();
    ???????????????? }else{
    ???????????????????????? out.println("rst Fail!");
    ???????????????? }
    ???????? }
    ???????? else
    ???????????????? out.println("Fail!");
    ??????????? }catch(Exception ne){ out.println(ne);
    ????????? }


    3.2 Statement Pool
    普通預(yù)編譯代碼:
    String strSQL=”select name from items where id=?”;
    PreparedStatement ps=conn.prepareStatement(strSQL);
    ps.setString(1, “2”);
    ResultSet rs=ps.executeQuery();

    但是PreparedStatement 是與特定的Connection關(guān)聯(lián)的,一旦Connection關(guān)閉,則相關(guān)的PreparedStatement 也會關(guān)閉。
    為了創(chuàng)建PreparedStatement 緩沖池,可以在invoke方法中通過sql語句判斷池中還有沒有可用實例。

    4. 持久層設(shè)計與O/R mapping 技術(shù)
    1) Hernate:適合對新產(chǎn)品的開發(fā),進行封閉化的設(shè)計
    Hibernate 2003年被Jboss接管,通過把java pojo對象映射到數(shù)據(jù)庫的table中,采用了xml/javareflection技術(shù)等。3.0提供了對存儲過程和手寫sql的支持,本身提供了hql語言。
    開發(fā)所需要的文件:
    hibernate配置文件: hibernate.cfg.xml 或 hibernate.properties
    hibernate 映射文件: a.hbm.xml
    pojo類源文件: a.java  

    導(dǎo)出表與表之間的關(guān)系:
    a. 從java對象到hbm文件:xdoclet
    b. 從hbm文件到j(luò)ava對象:hibernate extension
    c. 從數(shù)據(jù)庫到hbm文件:middlegen
    d. 從hbm文件到數(shù)據(jù)庫:SchemaExport

    2)Iatis :適合對遺留系統(tǒng)的改造和對既有數(shù)據(jù)庫的復(fù)用,有很強的靈活性 3) Apache OJB:優(yōu)勢在于對標(biāo)準(zhǔn)的全面支持 4)EJB:適合集群服務(wù)器,其性能也不象某些人所詬病的那么差勁 5) JDO (java data object)
    設(shè)置一個Properties對象,從而獲取一個JDO的PersistenceManagerFactory(相當(dāng)于JDBC連接池中的DataSource),進而獲得一個PersistenceManager對象(相當(dāng)于JDBC中的Connection對象),之后,你可以用這個PersistenceManager對象來增加、更新、刪除、查詢對象。
    JDOQL是JDO的查詢語言;它有點象SQL,但卻是依照Java的語法的。

    5. 基于開源框架的Struts+Spring+Hibernate實現(xiàn)方案
    示例:這是一個3層架構(gòu)的web 程序,通過一個Action 來調(diào)用業(yè)務(wù)代理,再通過它來回調(diào) DAO類。下面的流程圖表示了MyUsers是如何工作的。數(shù)字表明了流程的先后順序,從web層(UserAction)到中間層(UserManager),再到數(shù)據(jù)層(UserDAO),然后返回。
    Spring是AOP, UserManager和UserDAO都是接口.
    1)??????? web層(UserAction) :調(diào)用中間層的接口方法,將UserManager作為屬性注入。
    ????????????? 采用流行的Struts框架,雖然有很多人不屑一顧,但是這項技術(shù)在業(yè)界用的比較普遍,能滿足基本的功能,可以減少培訓(xùn)學(xué)習(xí)成本。
    2)??????? 中間層(UserManager):將UserDAO作為屬性注入,其實現(xiàn)主要是調(diào)用數(shù)據(jù)層接口的一些方法;它處于事務(wù)控制中。
    ???????????? 采用Spring框架實現(xiàn),IOC與AOP是它的代名詞,功能齊全,非常棒的一個架構(gòu)。
    3)??????? 數(shù)據(jù)層(UserDAO):實現(xiàn)類繼承HibernateDaoSupport類,在該類中可以調(diào)用getHibernateTemplate()的一些方法執(zhí)行具體的數(shù)據(jù)操作。
    ???????????? 采用Hibernate做O/R mapping,從種種跡象可以看出,Hibernate就是EJB3.0的beta版。
    posted @ 2007-09-01 15:28 jadmin 閱讀(60) | 評論 (0)編輯 收藏

      今天工作的任務(wù)要寫一些跟開源協(xié)議相關(guān)的約定說明,所以在網(wǎng)上搜索了一些資料以供參考,下面列出了幾個比較常見的開源協(xié)議,如果想要了解其他的協(xié)議和詳細了解這些協(xié)議,我個人推薦這個網(wǎng)址:http://www.opensource.org/licenses/

      Mozilla Public License

      MPL License,允許免費重發(fā)布、免費修改,但要求修改后的代碼版權(quán)歸軟件的發(fā)起者。這種授權(quán)維護了商業(yè)軟件的利益,,它要求基于這種軟件得修改無償貢獻版權(quán)給該軟件。這樣,圍繞該軟件得所有代碼得版權(quán)都集中在發(fā)起開發(fā)人得手中。但MPL是允許修改,無償使用得。MPL軟件對鏈接沒有要求。

      BSD開源協(xié)議

      BSD開源協(xié)議是一個給于使用者很大自由的協(xié)議。可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。 當(dāng)你發(fā)布使用了BSD協(xié)議的代碼,或則以BSD協(xié)議代碼為基礎(chǔ)做二次開發(fā)自己的產(chǎn)品時,需要滿足三個條件:

      1. 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協(xié)議。

      2. 如果再發(fā)布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權(quán)聲明中包含原來代碼中的BSD協(xié)議。

      3. 不可以用開源代碼的作者/機構(gòu)名字和原來產(chǎn)品的名字做市場推廣。

      BSD代碼鼓勵代碼共享,但需要尊重代碼作者的著作權(quán)。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時候都首選BSD協(xié)議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發(fā)。

      Apache Licence 2.0

      Apache Licence是著名的非盈利開源組織Apache采用的協(xié)議。該協(xié)議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權(quán),同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件:

      1. 需要給代碼的用戶一份Apache Licence

      2. 如果你修改了代碼,需要再被修改的文件中說明。

      3. 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標(biāo),專利聲明和其他原來作者規(guī)定需要包含的說明。

      4. 如果再發(fā)布的產(chǎn)品中包含一個Notice文件,則在Notice文件中需要帶有Apache Licence。你可以在Notice中增加自己的許可,但不可以表現(xiàn)為對Apache Licence構(gòu)成更改。

      Apache Licence也是對商業(yè)應(yīng)用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/銷售。

      GPL

      GPL許可證是自由軟件的應(yīng)用最廣泛的軟件許可證,人們可以修改程式的一個或幾個副本或程式的任何部分,以此形成基於這些程式的衍生作品。必須在修改過的檔案中附有明顯的說明:您修改了此一檔案及任何修改的日期。 您必須讓您發(fā)布或出版的作品,包括本程式的全部或一部分,或內(nèi)含本程式的全部或部分所衍生的作品,允許第三方在此許可證條款下使用,并且不得因為此項授權(quán)行為而收費。

      LGPL

      Linux就是采用了GPL。GPL協(xié)議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發(fā)點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費的各種linux,包括商業(yè)公司的linux和linux上各種各樣的由個人,組織,以及商業(yè)軟件公司開發(fā)的免費軟件了。

      GPL協(xié)議的主要內(nèi)容是只要在一個軟件中使用(“使用”指類庫引用,修改后的代碼或者衍生代碼)GPL協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL協(xié)議,既必須也是開源和免費。這就是所謂的”傳染性”。GPL協(xié)議的產(chǎn)品作為一個單獨的產(chǎn)品使用沒有任何問題,還可以享受免費的優(yōu)勢。

      由于GPL嚴格要求使用了GPL類庫的軟件產(chǎn)品必須使用GPL協(xié)議,對于使用GPL協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發(fā)的基礎(chǔ)。

      其它細節(jié)如再發(fā)布的時候需要伴隨GPL協(xié)議等和BSD/Apache等類似

      Public Domain

      公共域授權(quán)。將軟件授權(quán)為公共域,這些軟件包沒有授權(quán)協(xié)議,任何人都可以隨意使用它。

      Artistic許可

      使作者保持對進一步開發(fā)的控制。

    posted @ 2007-08-31 11:11 jadmin 閱讀(54) | 評論 (0)編輯 收藏

      使用Java語言編寫應(yīng)用程序最大的優(yōu)點在于“一次編譯,處處運行”,然而這并不是說所有的Java程序都具有跨平臺的特性,事實上,相當(dāng)一部分的Java程序是不能在別的操作系統(tǒng)上正確運行的,那么如何才能編寫一個真正的跨平臺的Java程序呢?下面是在編寫跨平臺的Java程序是需要注意的一些事情:

      1.編寫Java跨平臺應(yīng)用程序時,你可以選擇JDK1.0,1.1,1.2或支持它們的GUI開發(fā)工具如:Jbuilder,Visual Age for Java等等,但是必須注意你的Java程序只能使用Java核心API包,如果要使用第三方的類庫包,則該類庫包也要由Java核心包開發(fā)完成,否則在發(fā)布你的程序的時候還得將支持該Java類庫包的JVM發(fā)布出去。也就是說,你的程序需要是100%純Java的。舉一個例子,Visual J++就不是純Java的,由Visual J++編寫的程序也就不具有平臺無關(guān)性。

      2.無論你使用的是JDK或其他開發(fā)工具,在編譯時都要打開所有的警告選項,這樣編譯器可以盡可能多的發(fā)現(xiàn)平臺相關(guān)的語句,并給出警告。雖然不能保證沒有編譯時警告錯誤的程序一定是跨平臺的,但含有警告錯誤的程序卻很有可能是非平臺無關(guān)的。

      3.在程序中使用任何一個方法的時候,要詳細察看文檔,確保你使用的方法不是在文檔中已經(jīng)申明為過時的方法(Deprecated method),也不是文檔中未標(biāo)明的隱含方法(Undocumented method)。

      4.退出Java程序時盡量不要使用java.lang.System的exit方法。Exit方法可以終止JVM,從而終止程序,但如果同時運行了另一個Java程序,使用exit方法就會讓該程序也關(guān)閉,這顯然不是我們希望看到的情況。事實上要退出Java程序,可以使用destory()退出一個獨立運行的過程。對于多線程程序,必須要關(guān)閉各個非守護線程。只有在程序非正常退出時,才使用exit方法退出程序。

      5.避免使用本地方法和本地代碼,盡可能自己編寫具有相應(yīng)功能的Java類,改寫該方法。如果一定要使用該本地方法,可以編寫一個服務(wù)器程序調(diào)用該方法,然后將現(xiàn)在要編寫的程序作為該服務(wù)器程序的客戶程序,或者考慮CORBA(公共對象請求代理)程序結(jié)構(gòu)。

      6.Java中有一個類似于Delphi中的winexec的方法,java.lang.runtime類的exec方法,作為該方法本身是具有平臺無關(guān)性的,但是給方法所調(diào)用的命令及命令參數(shù)卻是與平臺相關(guān)的,因此,在編寫程序時要避免使用,如果一定要調(diào)用其他的程序的話,必須要讓用戶自己來設(shè)置該命令及其參數(shù)。比如說,在windows中可以調(diào)用notepad.exe程序,在linux中就要調(diào)用vi程序了。

      7.程序設(shè)計中的所有的信息都要使用ASCII碼字符集,因為并不是所有的操作系統(tǒng)都支持Unicode字符集,這對于跨平臺的Java中文軟件程序不能不說是一大噩耗。

      8.在程序中不要硬性編碼與平臺相關(guān)的任何常量,比如行分隔符,文件分隔符,路徑分隔符等等,這些常量在不同的平臺上是不同的,比如文件分隔符,在UNIX和MAC中是“/”,在windows中是“”,如果要使用這些常量,需要使用jdava.util.Properties類的getProperty方法,如java.util.Properties.getProperty(“file.separator”)可以獲得文件分隔符,getProperty (“l(fā)ine.separator”)返回行分隔符,getProperty(“path.separator”)返回路徑分隔符。

      9.在編寫跨平臺的網(wǎng)絡(luò)程序時,不要使用java.net.InetAddress類的getHostName方法得到主機名,因為不同的平臺的主機名格式是不同的,最好使用getAddress得到格式相同的IP地址,另外,程序中所有的主機名都要換成IP地址,比如www.263.net就要換成相應(yīng)的IP地址。

      10.涉及文件操作的程序需要注意:不要在程序中硬性編碼文件路徑,理由和8中一樣,只是這一點特別重要,因此單獨提出。而且,不同平臺對于文件名使用的字符及最大文件名長度的要求不同,編寫你的程序的時候要使用一般的ASCII碼字符作為文件的名字,而且不能與平臺中已存在的程序同名,否則會造成沖突。

      11.如果您寫的程序是GUI程序,在使用AWT組件時不能硬性設(shè)置組件的大小和位置而應(yīng)該使用Java的布局管理器(layout manager)來設(shè)置和管理可視組件的大小和位置,否則有可能造成布局混亂。

      12.由于不同的操作系統(tǒng),不同的機器,系統(tǒng)支持的顏色和屏幕的大小和分辨率都不同,如何獲得這些屬性呢?使用java.awt.Systemcolor類可以獲得需要的顏色,如該類的inactiveCaption就是窗口邊框中活動標(biāo)題的背景顏色,menu則是菜單的背景顏色。使用java.awt.Toolkit的getScreenResolution可以以“象素每英寸”為單位顯示屏幕的分辨率。該類的getScreenSize可以得到屏幕大小(英寸),loadSystemColors可以列出所有的系統(tǒng)顏色。

      這些注意事項有些是來自參考文獻,有些是自己長期編寫Java程序的經(jīng)驗所得,相信對你的程序設(shè)計會有所幫助。

    posted @ 2007-08-31 11:08 jadmin 閱讀(43) | 評論 (0)編輯 收藏
    僅列出標(biāo)題
    共50頁: First 上一頁 28 29 30 31 32 33 34 35 36 下一頁 Last 
    主站蜘蛛池模板: 中文成人久久久久影院免费观看 | 亚洲一区中文字幕在线电影网| 91成人免费在线视频| 亚洲日本va一区二区三区| 亚洲免费日韩无码系列| 一区二区三区在线免费看| 亚洲欧美日韩久久精品| 亚洲精品国产字幕久久不卡| 无码区日韩特区永久免费系列| 老外毛片免费视频播放| 亚洲高清中文字幕综合网| 可以免费观看的一级毛片| 性无码免费一区二区三区在线| 亚洲国产AV无码一区二区三区| 国产av无码专区亚洲av桃花庵| 好吊妞视频免费视频| 光棍天堂免费手机观看在线观看| 亚洲午夜无码久久| 人人狠狠综合久久亚洲婷婷| 日韩精品视频免费网址| 香港a毛片免费观看 | 一区二区三区在线免费观看视频| 亚洲一区中文字幕在线观看| 综合亚洲伊人午夜网 | 国产一区二区三区无码免费| 久久中文字幕免费视频| 视频免费1区二区三区| 中中文字幕亚洲无线码| 亚洲AV综合色区无码一区爱AV| 黄a大片av永久免费| 免费看污成人午夜网站| 日本在线免费播放| 男女猛烈无遮掩视频免费软件| 亚洲人成7777| 亚洲黄色在线观看视频| 亚洲午夜无码久久久久| 亚洲国产电影av在线网址| 国产精品无码一区二区三区免费 | 免费观看美女用震蛋喷水的视频 | 全部免费毛片在线播放| CAOPORM国产精品视频免费|