posts - 15, comments - 20, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1.寫一個方法,用一個for循環打印九九乘法表
          Java code   
              /**
               * 打印九九乘法口訣表
               */
              public void nineNineMulitTable(){
                  for (int i = 1,j = 1; j <= 9; i++) {
                        System.out.print(i+"*"+j+"="+i*j+" ");
                        if(i==j){
                            i=0;
                            j++;
                            System.out.println();
                        }
                    }
              }

           

          2.給定一個java.util.Date對象,如何轉化為”2007-3-22 20:23:22”格式的字符串
            Java code
              /**
               * 將某個日期以固定格式轉化成字符串
               * @param date
              * @return str
              */
              public String date2FormatStr(Date date)
              {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String str = sdf.format(date);
                return str;
              }

          3.寫一個方法,能夠判斷任意一個整數是否素數
           
              /**
              * 判斷任意一個整數是否素數
              * @param num
              * @return boolean
              */
              public boolean isPrimeNumber(int num)
              {
                for (int i = 2; i <= Math.sqrt(num); i++) {
                    if(num%i==0)
                    {
                        return false;
                    }
                }
                return true;
              }
          4.寫一個方法,輸入任意一個整數,返回它的階乘
          Java code    
               /**
                *獲得任意一個整數的階乘
                *@param n
                *@returnn!
                */
                public int factorial(int num)
                {
                  //遞歸
                  if(num == 1)
                  {
                      return 1;
                  }
                  return num*factorial(num-1);
                }

          5.寫一個方法,用二分查找法判斷任意整數在任意整數數組里面是否存在,若存在就返回它在數組中的索引位置,不存在返回-1
          Java code    
                /**
                 *二分查找特定整數在整型數組中的位置(遞歸)
                 *@param dataset
                 *@param data
                 *@param beginIndex
                 *@param endIndex
                 *@return index
                 */
                 public int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
                   int midIndex = (beginIndex+endIndex)/2;
                   //如果查找的數要比開始索引的數據要小或者是比結束索引的書要大,或者開始查找的索引值大于結束的索引值返回-1沒有查到
                   if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
                       return -1;
                   }
                   if(data <dataset[midIndex]){ 
                       return binarySearch(dataset,data,beginIndex,midIndex-1);
                   }else if(data>dataset[midIndex])
                   {
                       return binarySearch(dataset,data,midIndex+1,endIndex);
                   }else {
                       return midIndex;
                   }
                 }
                
                 /**
                  *二分查找特定整數在整型數組中的位置(非遞歸)
                  *@param dataset
                  *@param data
                  *@return index
                  */
                  public int binarySearch(int[] dataset ,int data)
                  {
                    int beginIndex = 0; 
                    int endIndex = dataset.length - 1; 
                    int midIndex = -1;
                    if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
                        return -1;
                    }
                    while(beginIndex <= endIndex) {
                        midIndex = (beginIndex+endIndex)/2;
                        if(data <dataset[midIndex]) { 
                           endIndex = midIndex-1; 
                        } else if(data>dataset[midIndex]) { 
                          beginIndex = midIndex+1; 
                        }else {
                          return midIndex;
                        }
                    }
                    return -1;
                  }

          posted @ 2009-10-27 17:46 spinage 閱讀(209) | 評論 (0)編輯 收藏

          1.一道SQL語句面試題,關于group by
          表內容:
          2005-05-09 勝
          2005-05-09 勝
          2005-05-09 負
          2005-05-09 負
          2005-05-10 勝
          2005-05-10 負
          2005-05-10 負

          如果要生成下列結果, 該如何寫sql語句?

                      勝 負
          2005-05-09 2 2
          2005-05-10 1 2
          ------------------------------------------
          create table #tmp(rq varchar(10),shengfu nchar(1))

          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','負')
          insert into #tmp values('2005-05-09','負')
          insert into #tmp values('2005-05-10','勝')
          insert into #tmp values('2005-05-10','負')
          insert into #tmp values('2005-05-10','負')

          1)select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',sum(case when shengfu='負' then 1 else 0 end)'負' from #tmp group by rq
          2) select N.rq,N.勝,M.負 from (
          select rq,勝=count(*) from #tmp where shengfu='勝'group by rq)N inner join
          (select rq,負=count(*) from #tmp where shengfu='負'group by rq)M on N.rq=M.rq
          3)select a.col001,a.a1 勝,b.b1 負 from
          (select col001,count(col001) a1 from temp1 where col002='勝' group by col001) a,
          (select col001,count(col001) b1 from temp1 where col002='負' group by col001) b
          where a.col001=b.col001

          2.請教一個面試中遇到的SQL語句的查詢問題
          表中有A B C三列,用SQL語句實現:當A列大于B列時選擇A列否則選擇B列,當B列大于C列時選擇B列否則選擇C列。
          ------------------------------------------
          select (case when a>b then a else b end ),
          (case when b>c then b esle c end)
          from table_name

          3.面試題:一個日期判斷的sql語句?
          請取出tb_send表中日期(SendTime字段)為當天的所有記錄?(SendTime字段為datetime型,包含日期與時間)
          ------------------------------------------
          select * from tb where datediff(dd,SendTime,getdate())=0

          4.有一張表,里面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄并按以下條件顯示出來(并寫出您的思路):  
             大于或等于80表示優秀,大于或等于60表示及格,小于60分表示不及格。  
                 顯示格式:  
                 語文              數學                英語  
                 及格              優秀                不及格    
          ------------------------------------------
          select
          (case when 語文>=80 then '優秀'
                  when 語文>=60 then '及格'
          else '不及格' end) as 語文,
          (case when 數學>=80 then '優秀'
                  when 數學>=60 then '及格'
          else '不及格' end) as 數學,
          (case when 英語>=80 then '優秀'
                  when 英語>=60 then '及格'
          else '不及格' end) as 英語
          from table

          5.在sqlserver2000中請用sql創建一張用戶臨時表和系統臨時表,里面包含兩個字段ID和IDValues,類型都是int型,并解釋下兩者的區別?
          ------------------------------------------
          用戶臨時表:create table #xx(ID int, IDValues int)
          系統臨時表:create table ##xx(ID int, IDValues int)

          區別:
          用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的.
          當創建它的進程消失時這個臨時表就自動刪除.

          全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.

          6.sqlserver2000是一種大型數據庫,他的存儲容量只受存儲介質的限制,請問它是通過什么方式實現這種無限容量機制的。
          ------------------------------------------
          它的所有數據都存儲在數據文件中(*.dbf),所以只要文件夠大,SQL    Server的存儲容量是可以擴大的.

          SQL Server 2000 數據庫有三種類型的文件:

          主要數據文件
          主要數據文件是數據庫的起點,指向數據庫中文件的其它部分。每個數據庫都有一個主要數據文件。主要數據文件的推薦文件擴展名是 .mdf。

          次要數據文件
          次要數據文件包含除主要數據文件外的所有數據文件。有些數據庫可能沒有次要數據文件,而有些數據庫則有多個次要數據文件。次要數據文件的推薦文件擴展名是 .ndf。

          日志文件
          日志文件包含恢復數據庫所需的所有日志信息。每個數據庫必須至少有一個日志文件,但可以不止一個。日志文件的推薦文件擴展名是 .ldf。

          7.請用一個sql語句得出結果
          從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不準確,只是作為一個格式向大家請教。
          如使用存儲過程也可以。

          table1

          月份mon 部門dep 業績yj
          -------------------------------
          一月份      01      10
          一月份      02      10
          一月份      03      5
          二月份      02      8
          二月份      04      9
          三月份      03      8

          table2

          部門dep      部門名稱dname
          --------------------------------
                01      國內業務一部
                02      國內業務二部
                03      國內業務三部
                04      國際業務部

          table3 (result)

          部門dep 一月份      二月份      三月份
          --------------------------------------
                01      10        null      null
                02      10         8        null
                03      null       5        8
                04      null      null      9

          ------------------------------------------
          1)
          select a.部門名稱dname,b.業績yj as '一月份',c.業績yj as '二月份',d.業績yj as '三月份'
          from table1 a,table2 b,table2 c,table2 d
          where a.部門dep = b.部門dep and b.月份mon = '一月份' and
          a.部門dep = c.部門dep and c.月份mon = '二月份' and
          a.部門dep = d.部門dep and d.月份mon = '三月份' and
          2)
          select a.dep,
          sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
          sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
          sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
          sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
          sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
          sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
          sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
          sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
          sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
          sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
          sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
          sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
          from table2 a left join table1 b on a.dep=b.dep

          8.華為一道面試題
          一個表中的Id有多個記錄,把所有這個id的記錄查出來,并顯示共有多少條記錄數。
          ------------------------------------------
          select id, Count(*) from tb group by id having count(*)>1
          select * from(select count(ID) as count from table group by ID)T where T.count>1

          posted @ 2009-10-27 13:05 spinage 閱讀(571) | 評論 (2)編輯 收藏

          拼音排序
          拼音有好幾種方式,其中最主要的是中華人民共和國的漢語拼音 Chinese Phonetic。對漢字的排序有兩種:一種是寬松的,能夠按拼音排序最常用的漢字,另一種是嚴格的,能夠按拼音排序絕大部分大部分漢字。

          寬松的拼音排序法
          原理:漢字最早是GB2312編碼,收錄了六千多個漢字,是按拼音排序的,編碼是連續的。 后來出現了GBK編碼,對GB2312進行了擴展,到了兩萬多漢字,并且兼容GB2312,也就是說GB2312中的漢字編碼是原封不動搬到GBK中的(在GBK編碼中[B0-D7]區中)。

          如果我們只關心這6000多個漢字的順序,就可以用下面的方法實現漢字寬松排序。

          /**
          * @author shaob
          *
          * Copyright (c)
          */

          package chinese.utility;

          import java.text.Collator;
          import java.util.Comparator;
          import java.util.Locale;

          public class PinyinSimpleComparator implements Comparator<String> {
              public int compare(String o1, String o2) {
                  return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
              }
          }

          在對[孫, 孟, 宋, 尹, 廖, 張, 徐, 昆, 曹, 曾,怡]這幾個漢字排序,結果是:[曹, 昆, 廖, 孟, 宋, 孫, 徐, 尹, 曾, 張, 怡]。最后一個 怡 有問題,不該排在最后的。

          注意:這個程序有兩個不足

          由于gb2312中的漢字編碼是連續的,因此新增加的漢字不可能再按照拼音順序插入到已有的gb2312編碼中,所以新增加的漢字不是按拼音順序排的。
          同音字比較的結果不等于0 。
          下面的測試代碼可以證明

          /**
          * @author shaob
          *
          * Copyright (c)

          /**
          * 非常用字(怡)
          */
          @Test
          public void testNoneCommon() {
              Assert.assertTrue(comparator.compare("怡", "張") > 0);
          }

          /**
          * 同音字
          */
          @Test
          public void testSameSound() {
              Assert.assertTrue(comparator.compare("怕", "帕") != 0);
          }

          嚴格的拼音排序法
          為了解決寬松的拼音的兩點不足,可以通過實現漢語拼音的函數來解決。goolge下看到sf上有個pinyin4j的項目,可以解決這個問題,pinyin4j的項目地址是:http://pinyin4j.sourceforge.net/。

          實現代碼:

          /**
            * @author shaob
            *
            * Copyright (c)
            */
          package chinese.utility;

          import java.util.Comparator;
          import net.sourceforge.pinyin4j.PinyinHelper;

          public class PinyinComparator implements Comparator<String> {

              public int compare(String o1, String o2) {

                  for (int i = 0; i < o1.length() && i < o2.length(); i++) {

                      int codePoint1 = o1.charAt(i);
                      int codePoint2 = o2.charAt(i);

                      if (Character.isSupplementaryCodePoint(codePoint1)
                              || Character.isSupplementaryCodePoint(codePoint2)) {
                          i++;
                      }

                      if (codePoint1 != codePoint2) {
                          if (Character.isSupplementaryCodePoint(codePoint1)
                                  || Character.isSupplementaryCodePoint(codePoint2)) {
                              return codePoint1 - codePoint2;
                          }

                          String pinyin1 = pinyin((char) codePoint1);
                          String pinyin2 = pinyin((char) codePoint2);

                          if (pinyin1 != null && pinyin2 != null) { // 兩個字符都是漢字
                              if (!pinyin1.equals(pinyin2)) {
                                  return pinyin1.compareTo(pinyin2);
                              }
                          } else {
                              return codePoint1 - codePoint2;
                          }
                      }
                  }
                  return o1.length() - o2.length();
              }

              /**
               * 字符的拼音,多音字就得到第一個拼音。不是漢字,就return null。
               */
              private String pinyin(char c) {
                  String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
                  if (pinyins == null) {
                      return null;
                  }
                  return pinyins[0];
              }
          }

           

          posted @ 2009-10-15 16:01 spinage 閱讀(4997) | 評論 (0)編輯 收藏

          在全局數據庫ORCL下創建一個用戶
          首先在開始--》運行——》sqlplus,然后輸入 sys/change_on_install as sysdba
          以sys權限登陸進去
          然后可以進行操作:
          創建用戶 create user test indentified by test;
          這樣就創建了一個用戶名密碼都為test的用戶
          但這個時候test還是不能登陸成功的,我們需要賦予相應的權限
          首先賦予create session的權限
          grant create session to test;
          這樣test用戶就能成功登陸進去
          但是此時用戶還是不能創建表 我們需要賦予用戶創建表的權限:
          grant create table to test;
          但是用戶此時還不能創建表 因為需要有使用表空間的權限(相當于 用戶有了進房間的鑰匙 但是沒有進大門的鑰匙)
          所以也應該賦予相應的權限
          grant unlimited tablespace to test;
          這個時候用戶就擁有了創建表的權限 由于表是用戶test的 相應的他就擁有了對創建的表的增刪查改的權限了
          我們要查看用戶擁有什么權限可以通過查詢一個系統的視圖(數字字典)
          select * from user_sys_privs;
          這樣就可以知道當前用戶的權限

          撤銷權限 revoke create table from test;

          場景:
          用戶test   用戶test1
          test1的用戶創建了個表mytab 并且插入了一些數據
          那么 test用戶是否可以訪問到test1的mytab怎么訪問?
          答:不可以,必須先授權
          test1必須授權給test :grant select on mytab to test;
          那么這個時候test可以通過 select * from test1.mytab;來訪問mytab中的數據
          如果想把某個表(對象)的所有權限都賦予給test那么可以:
          grant all on mytab to test;
          撤銷所有權限
          revoke all on mytab to test;


          總結
          對于系統權限由sys來做
          對于對象權限由 誰擁有誰授權
          系統權限:
             grant create session to test;
             grant create table to test;
             grant unlimited tablespace to test;

             revoke create session from test;
             revoke create table from test;
             revoke unlimited tablespase from test;

             grant create session to public;  //表示把創建表的權限賦予所有人

             select * from user_sys_privs;  //返回當前用戶的所有系統權限

             grant select on mytab to test;
             grant all on mytab to test;

             revoke select on mytab from test;
             revoke all on mytab from test;

             
             對象權限可以控制到列 (更新和插入操作)
             grant update(name) on mytab to test;
             grant insert(id) on mytab to test;

             select * from user_col_privs;
             注意:查詢和刪除不能控制到列   
             需要有commit的 insert update insert

            權限的傳遞
            系統權限的傳遞:
            grant alter table to A with admin option;
            那么A可以通過把該權限傳遞給B,如果想B也可以傳遞下去那么可以也帶上with admin option
            grant alter table to B;
            對象權限的傳遞:
            grant select on mytab to A with grant option;
            那么A可以把在表mytab的select權限賦予給B,如果B想也能傳遞該select權限也可以帶上with grant option
            grant select on mytab to B;

          ----------------------------------------------------------------------------------------------------------

          --創建用戶
          create user keeltest identified by keeltest;
          --分配權限
          grant create session,create table,create view ,create any index to keeltest;
          grant unlimited tablespace to keeltest;

           

          posted @ 2009-09-28 09:41 spinage 閱讀(628) | 評論 (0)編輯 收藏

          1、需要在你本機安裝oracle客戶端和pl/sql
          2、配置你本機的tnsname文件 (E:\oracle\product\10.1.0\db_1\NETWORK\ADMIN)
          在該文件中加入:
          數據庫名=
            (DESCRIPTION =
              (ADDRESS_LIST =
                (ADDRESS = (PROTOCOL = TCP)(HOST = IP )(PORT = 1521))
              )
              (CONNECT_DATA =
                (SERVICE_NAME = 數據庫名)
              )
            )
          3、pl/sql連接 數據庫名,輸入 用戶名密碼

          posted @ 2009-09-24 13:25 spinage 閱讀(657) | 評論 (0)編輯 收藏

          兩種辦法:

          一、將 @author 屬性寫死 。

          通過菜單 Window->Preference 打開參數設置面板,然后選擇:
          1.Java -> Code Style -> Code Templates
          2.在右側選擇Comments,將其中的Types項,然后選右邊的"Edit",進入編輯模式,將 @author ${user} 中的${user}改成你自己的名字即可。

          二、修改用戶名
          控制面板-->計算機管理-->本地用戶和組-->用戶
          使用管理員賬戶登陸 可以任意修改用戶名 ,然后重啟電腦,OK 。
          PS:XP HOME EDITION 不保證其可用。

          posted @ 2009-09-22 10:11 spinage 閱讀(459) | 評論 (0)編輯 收藏

          由于在svn的界面中并沒有為我們提供直接更換用戶名密碼的地方,所以一旦我們需要更換用戶名的就需要自己想一些辦法。

              解決方案如下:

          在Eclipse使用SVN的過程中大多數人往往習慣把訪問SVN的用戶名密碼自動保存起來
          以便下次自動使用,不要再次手工輸入,但是有些時候需要變更密碼或者用戶名,
          這時候怎么辦?在網上查找后發現如下方法:

          1. 查看你的Eclipse中使用的是什么SVN Interface
          windows > preference > Team > SVN #SVN Interface

          2. 如果是用的JavaHL, 找到以下目錄并刪除auth目錄下的文件.
          C:"Documents and Settings"[YourUserName]"Application Data"Subversion"

          3. 如果你用的SVNKit, 找到以下目錄并刪除.keyring文件.
          [eclipse]"configuration"org.eclipse.core.runtime

              主要有兩種方法,一種是刪除SVN客戶端的賬號配置文件;另外一種就是去SVN服務端將賬號設置成不可用。

              具體步驟:

              1、通過刪除SVN客戶端的賬號配置文件

              (1)找到我們使用的客戶端配置文件,在window xp下面他們的位置在系統盤的 Documents and Settings\alex\Application Data\Subversion\auth\文件夾中,把里面的所有文件刪除。

              (2)使用SVN更新或提交,使得客戶端與服務端進行通訊,這樣就會SVN客戶端就要求我們輸入新的用戶名密碼,輸入我們的用戶名密碼就可以替換掉舊的用戶名密碼。

              2、通過修改SVN服務端賬號配置文件,這部分需要SVN的管理員配合

              (1)找到服務端賬號配置文件,這個文件位于SVN服務器的安裝路徑 config文件夾,打開并編輯passwd文件,刪除或注釋需要被替換的賬號

              (2)在客戶端使用SVN更新或提交,使得客戶端與服務端進行通訊,這樣就會SVN客戶端就要求我們輸入新的用戶名密碼,輸入我們的用戶名密碼就可以替換掉舊的用戶名密碼。

          posted @ 2009-09-22 10:08 spinage 閱讀(81815) | 評論 (15)編輯 收藏

          1.我所知道的aop 
              初看aop,上來就是一大堆術語,而且還有個拉風的名字,面向切面編程,都說是OOP的一種有益補充等等。一下子讓你不知所措,心想著:怪不得很多人都和我說aop多難多難。當我看進去以后,我才發現:它就是一些java基礎上的樸實無華的應用,包括ioc,包括許許多多這樣的名詞,都是萬變不離其宗而已。
          2.為什么用aop 
              1就是為了方便,看一個國外很有名的大師說,編程的人都是“懶人”,因為他把自己做的事情都讓程序做了。用了aop能讓你少寫很多代碼,這點就夠充分了吧
              2就是為了更清晰的邏輯,可以讓你的業務邏輯去關注自己本身的業務,而不去想一些其他的事情,這些其他的事情包括:安全,事物,日志等。 
          3.那些aop的術語 
              初看這么多術語,一下子都不好接受,慢慢來,很快就會搞懂。
              1.通知(Advice)
              就是你想要的功能,也就是上面說的 安全,事物,日志等。你給先定義好把,然后在想用的地方用一下。
              2.連接點(JoinPoint)
              這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,后(兩者都有也行),或拋出異常時都可以是連接點,spring只支持方法連接點.其他如aspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前后后(拋出異常),都是連接點。
              3.切入點(Pointcut)
              上面說的連接點的基礎上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你并不想在所有方法附近都使用通知(使用叫織入,以后再說),你只想讓其中的幾個,在調用這幾個方法之前,之后或者拋出異常時干點什么,那么就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。
              4.切面(Aspect)
              切面是通知和切入點的結合。現在發現了吧,沒連接點什么事情,連接點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了干什么和什么時候干(什么時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪干(指定到底是哪個方法),這就是一個完整的切面定義。
              5.引入(introduction)
              允許我們向現有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎
              6.目標(target)
              引入中所提到的目標類,也就是要被通知的對象,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注于業務本身的邏輯。
              7.代理(proxy)
              怎么實現整套aop機制的,都是通過代理,這個一會給細說。
              8.織入(weaving)
              把切面應用到目標對象來創建新的代理對象的過程。有3種方式,spring采用的是運行時,為什么是運行時,后面解釋。
          關鍵就是:切點定義了哪些連接點會得到通知 

           4.我所理解的aop原理 
              spring用代理類包裹切面,把他們織入到Spring管理的bean中。也就是說代理類偽裝成目標類,它會截取對目標類中方法的調用,讓調用者對目標類的調用都先變成調用偽裝類,偽裝類中就先執行了切面,再把調用轉發給真正的目標bean。
              現在可以自己想一想,怎么搞出來這個偽裝類,才不會被調用者發現(過JVM的檢查,JAVA是強類型檢查,哪里都要檢查類型)。
              1.實現和目標類相同的接口,我也實現和你一樣的接口,反正上層都是接口級別的調用,這樣我就偽裝成了和目標類一樣的類(實現了同一接口,咱是兄弟了),也就逃過了類型檢查,到java運行期的時候,利用多態的后期綁定(所以spring采用運行時),偽裝類(代理類)就變成了接口的真正實現,而他里面包裹了真實的那個目標類,最后實現具體功能的還是目標類,只不過偽裝類在之前干了點事情(寫日志,安全檢查,事物等)。
              這就好比,一個人讓你辦件事,每次這個時候,你弟弟就會先出來,當然他分不出來了,以為是你,你這個弟弟雖然辦不了這事,但是他知道你能辦,所以就答應下來了,并且收了點禮物(寫日志),收完禮物了,給把事給人家辦了啊,所以你弟弟又找你這個哥哥來了,最后把這是辦了的還是你自己。但是你自己并不知道你弟弟已經收禮物了,你只是專心把這件事情做好。
             
              順著這個思路想,要是本身這個類就沒實現一個接口呢,你怎么偽裝我,我就壓根沒有機會讓你搞出這個雙胞胎的弟弟,那么就用第2種代理方式,創建一個目標類的子類,生個兒子,讓兒子偽裝我

              2.生成子類調用,這次用子類來做為偽裝類,當然這樣也能逃過JVM的強類型檢查,我繼承的嗎,當然查不出來了,子類重寫了目標類的所有方法,當然在這些重寫的方法中,不僅實現了目標類的功能,還在這些功能之前,實現了一些其他的(寫日志,安全檢查,事物等)。
             這次的對比就是,兒子先從爸爸那把本事都學會了,所有人都找兒子辦事情,但是兒子每次辦和爸爸同樣的事之前,都要收點小禮物(寫日志),然后才去辦真正的事。當然爸爸是不知道兒子這么干的了。 這里就有件事情要說,某些本事是爸爸獨有的(final的),兒子學不了,學不了就辦不了這件事,辦不了這個事情,自然就不能收人家禮了。

             前一種兄弟模式,spring會使用JDK的java.lang.reflect.Proxy類,它允許Spring動態生成一個新類來實現必要的接口,織入通知,并且把對這些接口的任何調用都轉發到目標類。

              后一種父子模式,spring使用CGLIB庫生成目標類的一個子類,在創建這個子類的時候,spring織入通知,并且把對這個子類的調用委托到目標類。
              相比之下,還是兄弟模式好些,他能更好的實現松耦合,尤其在今天都高喊著面向接口編程的情況下,父子模式只是在沒有實現接口的時候,也能織入通知,應當做一種例外。
          初學aop對aop術語和原理上的一些總結

          posted @ 2009-09-01 10:58 spinage 閱讀(138) | 評論 (0)編輯 收藏

           

          buffalo-2.0(國人開發的Ajax框架),下載buffalo-2.0-bin就可以了,個人認為也下載buffalo-2.0-src
          下載地址:http://sourceforge.net/project/showfiles.php?group_id=178867

          1.buffalo-2.0.jar
          在buffalo-2.0-bin里,把它加到Web應用程序里的lib

          2.buffalo.js和prototype.js
          我把這兩個文件放到Web應用程序的scripts/目錄下,buffalo.js在buffalo-2.0-bin里,prototype.js在buffalo-demo.war里找
          4.web.xml內容

          <?xmlversion="1.0"encoding="UTF-8"?>
          <web-appversion="2.4"
          xmlns
          ="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee
          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >


          <servlet>
          <servlet-name>bfapp</servlet-name>
          <servlet-class>net.buffalo.web.servlet.ApplicationServlet</servlet-class>
          </servlet>
          <servlet-mapping>
          <servlet-name>bfapp</servlet-name>
          <url-pattern>/bfapp/*</url-pattern>
          </servlet-mapping>

          </web-app>

          5.index.jsp文件

          <%@pagelanguage="java"pageEncoding="UTF-8"%>


          <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
          <html>
          <head>
          <title>第一個buffalo示例程序</title>
          <scriptlanguage="JavaScript"src="scripts/prototype.js"></script>
          <scriptlanguage="JavaScript"src="scripts/buffalo.js"></script>
          <scripttype="text/javascript">
          varendPoint="<%=request.getContextPath()%>/bfapp";

          varbuffalo=newBuffalo(endPoint);
          functionhello(me){
          buffalo.remoteCall(
          "demoService.getHello",[me.value],function(reply){
          alert(reply.getResult());
          })
          }
          </script>
          </head>

          <body>
          輸入你的名字:
          <inputtype="text"name="myname">
          <inputtype="button"value="Buffao遠程調用"onclick="hello($('myname'));"><br>
          </body>
          </html>


          說明:remoteCall是遠程調用方法,demoService是buffalo-service.properties文件的鍵,getHello是被調用java類方法名,me.value是傳給getHello方法的參數,reply.getResult()是getHello返回的值。

          6.DemoService.java文件

          packagedemo.buffalo;

          /**
          *
          *@文件名demo.buffalo.DemoService.java
          *@作者chenlb
          *@創建時間2007-7-14下午12:42:17
          */
          publicclassDemoService{

          publicStringgetHello(Stringname){
          return"Hello,"+name+"這是第一個buffalo示例程序";
          }
          }


          7.buffalo-service.properties文件放到WEB-INF/classes/目錄下

          demoService=demo.buffalo.DemoService

          說明:框架是通過此文件來查找遠程調用的類的。

          8.現在可以運行了。

          posted @ 2009-08-31 14:45 spinage 閱讀(137) | 評論 (0)編輯 收藏

          一) 連接MYSQL:
             格式: mysql -h主機地址 -u用戶名 -p用戶密碼

          1、例1:連接到本機上的MYSQL
             首先在打開DOS窗口,然后進入mysql安裝目錄下的bin目錄下,例如: D:\mysql\bin,再鍵入命令mysql -uroot -p,回車后提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>
          2、例2:連接到遠程主機上的MYSQL
             假設遠程主機的IP為:10.0.0.1,用戶名為root,密碼為123。則鍵入以下命令:
             mysql -h10.0.0.1 -uroot -p123
            (注:u與root可以不用加空格,其它也一樣)
          3、退出MYSQL命令
             exit (回車)

          (二) 修改密碼:
             格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
          1、例1:給root加個密碼123。首先在DOS下進入目錄C:\mysql\bin,然后鍵入以下命令:
             mysqladmin -uroot -password 123
             注:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了。
          2、例2:再將root的密碼改為456
             mysqladmin -uroot -pab12 password 456
          (三) 增加新用戶:(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以后面都帶一個分號作為命令結束符)
             格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼"
             例1、增加一個用戶test1密碼為abc,讓他可以在任何主機上登錄,并對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MYSQL,然后鍵入以下命令:    grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";   但例1增加的用戶是十分危險的,你想如某個人知道test1的密碼,那么他就可以在internet上的任何一臺電腦上登錄你的mysql數據庫并對你的數據可以為所欲為了,解決辦法見例2。
             例2、增加一個用戶test2密碼為abc,讓他只可以在localhost上登錄,并可以對數據庫mydb進行查詢、插入、修改、刪除的操作(localhost指本地主機,即MYSQL數據庫所在的那臺主機),這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問數據庫,只能通過MYSQL主機上的web頁來訪問了。    grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
             如果你不想test2有密碼,可以再打一個命令將密碼消掉。    grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
          (四) 顯示命令
          1、顯示數據庫列表:
             show databases;    剛開始時才兩個數據庫:mysql和test。mysql庫很重要它里面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
          2、顯示庫中的數據表:
             use mysql; //打開庫   show tables;
          3、顯示數據表的結構:
             describe 表名;
          4、建庫:
             create database 庫名;
          5、建表:
             use 庫名;    create table 表名 (字段設定列表);
          6、刪庫和刪表:
             drop database 庫名;    drop table 表名;
          7、將表中記錄清空:
             delete from 表名;
          8、顯示表中的記錄:
             select * from 表名;

          posted @ 2009-08-31 12:53 spinage 閱讀(85) | 評論 (0)編輯 收藏

          僅列出標題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 白水县| 乐东| 陵川县| 武宁县| 尼勒克县| 张家界市| 玉屏| 邮箱| 新巴尔虎右旗| 宿迁市| 嘉善县| 南雄市| 天门市| 海南省| 沅陵县| 昭通市| 龙陵县| 湖南省| 唐河县| 莲花县| 久治县| 安岳县| 哈尔滨市| 延庆县| 咸阳市| 会昌县| 临沧市| 麻阳| 中牟县| 呼伦贝尔市| 兴海县| 周宁县| 宜宾县| 新巴尔虎右旗| 九龙坡区| 石嘴山市| 榆中县| 贵德县| 乌鲁木齐市| 塔城市| 泽州县|