posted @ 2008-07-11 11:25 Stanley Sun 閱讀(335) | 評論 (0) | 編輯 收藏
眾所周知在計算機中所有的數(shù)據(jù)都是以二進制的方式存儲的。不管是int,String,float等等不同的數(shù)據(jù)類型,最終都會保存為01的形式。那么為什么要使用這種方式儲存數(shù)據(jù)呢?
因為計算機是一種電子設(shè)備,由復(fù)雜的電子元器件組合而成,一個電子元器件有帶電和不帶電兩種狀態(tài),通常我們將帶電狀態(tài)表示為數(shù)值1,不帶電狀態(tài)表示為數(shù)值0,多個這樣的元器件的組合可以表示更多狀態(tài),也就是可以表示更多的數(shù)據(jù),如000表示0,001表示1,010表示2,011表示3,依此類推,111表示 7,一個元器件可表示一位(bit)數(shù)據(jù),這種表示數(shù)據(jù)的方式就叫二進制。
在實際的電子設(shè)備中,我們將8個這樣的元器件形成一個單元,這樣的單元叫一個字節(jié)(byte),一個字節(jié)能表示多少個數(shù)呢?表示數(shù)值的范圍是0-255。
一個字節(jié)由8個二進位組成,其中最右邊的一位稱為“最低有效位”或“最低位”,最左邊的一位稱為“最高有效位”或“最高位”。每一個二進位的值是0或1。
二進制計數(shù)的缺點:書寫太長,容易出錯,一般計算機的數(shù)據(jù)位數(shù)都是4的整數(shù)倍,所以,在計算機里通常采用16進制計數(shù)法。用數(shù)字可以表示各種信息,計算機里只有數(shù)值,當(dāng)你在內(nèi)存中看到一個數(shù)值時,這個數(shù)值可能代表各種意義,生活中的數(shù)值也可以代表其他意義,如1234可以代表密碼,存款額,電報信息,根據(jù)上下線索,我們就能夠知道這數(shù)值代表的意義
但是在Java中到底是如何去保存數(shù)據(jù)的呢?下面我就以int數(shù)據(jù)類型為例說明Java的方式。
大家都知道在Java中規(guī)定1 int = 4 byte, 1 byte = 8 bit。以此推理那么1個int在計算機中就是以4 * 8 = 32位(bit)的方式存儲的。而又由于java中的int是屬于有符號類型(Java中不存在unsigned類型),所以32位的高一位是符號位,由此可以推理出int的儲存大小區(qū)間
Integer.MAX_VALUE = 2147483647(十進制) = 1111111 11111111 11111111 11111111(二進制)
Integer.MIN_VALUE = -2147483648(十進制) = 10000000 00000000 00000000 00000000(二進制)
現(xiàn)在我們知道了二進制的概念了,但是其實二進制我想我們想象的那么單純的表示的,他們是不同的表現(xiàn)方式如:原碼,反碼,補碼
將最高位作為符號位(以0代表正,1代表負(fù)),其余各位代表數(shù)值本身的絕對值(以二進制表示)。
為了簡單起見,我們用1個字節(jié)來表示一個整數(shù)。
+7的原碼為: 00000111
-7的原碼為: 10000111
一個數(shù)如果為正,則它的反碼與原碼相同;一個數(shù)如果為負(fù),則符號位為1,其余各位是對原碼取反。
為了簡單起見,我們用1個字節(jié)來表示一個整數(shù)。
+7的反碼為: 00000111
-7的反碼為: 11111000
利用溢出,我們可以將減法變成加法。
對于十進制數(shù),如果從9得到結(jié)果5,可以用減法:
9-4=5
因為4+6=10,我們將6作為4的補數(shù),將上式的減法改寫為加法:
9+6=15
去掉高位1(也就是減去10),得到結(jié)果5。
對于16進制數(shù),如果從C得到結(jié)果5,可以用減法:
C-7=5
因為7+9=16,我們將9作為7的補數(shù),將上式的減法改寫為加法:
C+9=15
去掉高位1(也就是減去16),得到結(jié)果5。
在計算機中,如果我們用1個字節(jié)表示一個數(shù),一個字節(jié)有8位,超過8位就進1,在內(nèi)存中情況為:
1 00000000
進位1被丟棄。
一個數(shù)如果為正,則它的原碼、反碼、補碼相同;一個數(shù)如果為負(fù),則符號位為1,其余各位是對原碼取反,然后整個數(shù)加1。
為了簡單起見,我們用1個字節(jié)來表示一個整數(shù)。
+7的補碼為: 00000111
-7的補碼為:第一步:11111000 (符號位為,其余各位取反)
第二步:11111001 (整個數(shù)加1)
+0的補碼:00000000;
-0的補碼:11111111;(第一步)
100000000;(第二步)
已知一個負(fù)數(shù)的補碼,將其轉(zhuǎn)換為十進制數(shù),步驟:
1、先對各位取反;
2、將其轉(zhuǎn)換為十進制數(shù);
3、加上負(fù)號,再減去1。
例如:
11111010,最高位為1,是負(fù)數(shù),先對各位取反得00000101,轉(zhuǎn)換為十進制數(shù)得5,加上負(fù)號得-5,再減1得-6。
那么我們就知道了1與-1的二進制形式分別為0000000 00000000 00000000 00000001和11111111 11111111 11111111 11111111(Java中的數(shù)據(jù)是以補碼的形式儲存的)了。那么現(xiàn)在我們知道了數(shù)據(jù)是如何儲存的了。那么計算機是如何利用這些數(shù)據(jù)進行計算的呢?我們知道在計算機的CPU中只有一個加法器,所有的運算都是需要它進行的。所以在計算機里所有的加減乘除都是轉(zhuǎn)換成加法來進行運算的。那么它們是怎么轉(zhuǎn)換的呢?下面我們介紹一下二進制的運算操作
為了方便對二進制位進行操作,Java給我們提供了四個二進制位操作符:
& 按位與
| 按位或
^ 按位異或
~ 按位取反
一個房間里有兩個開關(guān)控制房間的燈的明暗。當(dāng)兩個開關(guān)同時處于打開狀態(tài)時,燈才能亮。
開關(guān)1 開關(guān)2 燈的狀態(tài)
關(guān) 關(guān) 暗
開 關(guān) 暗
關(guān) 開 暗
開 開 亮
結(jié)論:按位與,只有壹(1)壹(1)為1。
一個房間里有兩個開關(guān)控制房間的燈的明暗。當(dāng)任何一個開關(guān)處于打開狀態(tài)時,燈就能亮。
開關(guān)1 開關(guān)2 燈的狀態(tài)
關(guān) 關(guān) 暗
開 關(guān) 亮
關(guān) 開 亮
開 開 亮
結(jié)論:按位或,只有零(0)零(0)為0。
一個房間里有兩個開關(guān)控制房間的燈的明暗。當(dāng)兩個開關(guān)處于不同狀態(tài)時,燈就能亮。
開關(guān)1 開關(guān)2 燈的狀態(tài)
關(guān) 關(guān) 暗
開 關(guān) 亮
關(guān) 開 亮
開 開 暗
結(jié)論:按位異或,只有零(0)壹(1)或壹(1)零(0)為1。
結(jié)論:對二進制數(shù)按位取反,即0變成1,1變成0。
左移:<< (相當(dāng)于 乘以2)
帶符號右移:>> (相當(dāng)于 除以2)
無符號右移:>>>
數(shù) x x<<2 x>>2 x>>>2
17 00010001 00 01000100 00000100 01 00000100 01
-17 11101111 11 10111100 11111011 11 00111011 11
posted @ 2008-06-14 15:25 Stanley Sun 閱讀(1071) | 評論 (0) | 編輯 收藏
概念:
1.數(shù)字摘要:解決在安全的通信環(huán)境下,保證信息的唯一的一種方式。通常使用MD5/SHA-1等算法完成摘要。一般比如大家在網(wǎng)上下載軟件光盤時都會看到一個MD5值就是起到這個數(shù)字摘要的作用。在網(wǎng)絡(luò)的環(huán)境中發(fā)送者把消息和數(shù)字摘要一同發(fā)送給接收者,接收者使用發(fā)送者相同的算法對消息加密,看是否與發(fā)送者發(fā)送過來的數(shù)字摘要相同,如果相同就證明消息沒有給篡改過。下面是一個最為簡單的示例:
import java.security.*; public class myDigest { public static void main(String[] args) { myDigest my=new myDigest(); my.testDigest(); } public void testDigest() { try { String myinfo="我的測試信息"; //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1"); alga.update(myinfo.getBytes()); byte[] digesta=alga.digest(); System.out.println("本信息摘要是:"+byte2hex(digesta)); //通過某中方式傳給其他人你的信息(myinfo)和摘要(digesta) 對方可以判斷是否更改或傳輸正常 java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1"); algb.update(myinfo.getBytes()); if (algb.isEqual(digesta,algb.digest())) { System.out.println("信息檢查正常"); } else { System.out.println("摘要不相同"); } } catch (java.security.NoSuchAlgorithmException ex) { System.out.println("非法摘要算法"); } } public String byte2hex(byte[] b) //二行制轉(zhuǎn)字符串 { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } }
2.電子簽名:對數(shù)據(jù)信息的發(fā)生者身份的認(rèn)定,它是一種抽象的概念而不是一種具體技術(shù)。實現(xiàn)電子簽名的技術(shù)手段目前有多種,比如基于公鑰密碼技術(shù)的數(shù)字簽名;或用一個獨一無二的以生物特征統(tǒng)計學(xué)為基礎(chǔ)的識別標(biāo)識,例如手印、聲音印記或視網(wǎng)膜掃描的識別;手書簽名和圖章的電子圖象的模式識別;表明身份的密碼代號(對稱算法);基于量子力學(xué)的計算機等等。
3.數(shù)字簽名:所謂數(shù)字簽名就是利用通過某種密碼運算生成的一系列符號及代碼組成電子密碼進行"簽名",來代替書寫簽名或印章,對于這種電子式的簽名在技術(shù)上還可進行算法驗證,其驗證的準(zhǔn)確度是在物理世界中與手工簽名和圖章的驗證是無法相比的。一般實現(xiàn)數(shù)字簽名的方法是通過生成的密鑰對的私鑰對用戶生成的數(shù)字消息進行DSA(Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSS(DigitalSignature Standard))加密實現(xiàn)的。實現(xiàn)代碼如下:
*/ import java.security.*; import java.security.spec.*; public class testdsa { public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception { testdsa my=new testdsa(); my.run(); } public void run() { //數(shù)字簽名生成密鑰 //第一步生成密鑰對,如果已經(jīng)生成過,本過程就可以跳過,對用戶來講myprikey.dat要保存在本地 //而mypubkey.dat給發(fā)布給其它用戶 if ((new java.io.File("myprikey.dat")).exists()==false) { if (generatekey()==false) { System.out.println("生成密鑰對敗"); return; }; } //第二步,此用戶 //從文件中讀入私鑰,對一個字符串進行簽名后保存在一個文件(myinfo.dat)中 //并且再把myinfo.dat發(fā)送出去 //為了方便數(shù)字簽名也放進了myifno.dat文件中,當(dāng)然也可分別發(fā)送 try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat")); PrivateKey myprikey=(PrivateKey)in.readObject(); in.close(); // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509); //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec String myinfo="這是我的信息"; //要簽名的信息 //用私鑰對信息生成數(shù)字簽名 java.security.Signature signet=java.security.Signature.getInstance("DSA"); signet.initSign(myprikey); signet.update(myinfo.getBytes()); byte[] signed=signet.sign(); //對信息的數(shù)字簽名 System.out.println("signed(簽名內(nèi)容)="+byte2hex(signed)); //把信息和數(shù)字簽名保存在一個文件中 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat")); out.writeObject(myinfo); out.writeObject(signed); out.close(); System.out.println("簽名并生成文件成功"); } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("簽名并生成文件失敗"); }; //第三步 //其他人通過公共方式得到此戶的公鑰和文件 //其他人用此戶的公鑰,對文件進行檢查,如果成功說明是此用戶發(fā)布的信息. // try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat")); PublicKey pubkey=(PublicKey)in.readObject(); in.close(); System.out.println(pubkey.getFormat()); in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat")); String info=(String)in.readObject(); byte[] signed=(byte[])in.readObject(); in.close(); java.security.Signature signetcheck=java.security.Signature.getInstance("DSA"); signetcheck.initVerify(pubkey); signetcheck.update(info.getBytes()); if (signetcheck.verify(signed)) { System.out.println("info="+info); System.out.println("簽名正常"); } else System.out.println("非簽名正常"); } catch (java.lang.Exception e) {e.printStackTrace();}; } //生成一對文件myprikey.dat和mypubkey.dat---私鑰和公鑰, //公鑰要用戶發(fā)送(文件,網(wǎng)絡(luò)等方法)給其它用戶,私鑰保存在本地 public boolean generatekey() { try { java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA"); // SecureRandom secrand=new SecureRandom(); // secrand.setSeed("tttt".getBytes()); //初始化隨機產(chǎn)生器 // keygen.initialize(576,secrand); //初始化密鑰生成器 keygen.initialize(512); KeyPair keys=keygen.genKeyPair(); // KeyPair keys=keygen.generateKeyPair(); //生成密鑰組 PublicKey pubkey=keys.getPublic(); PrivateKey prikey=keys.getPrivate(); java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat")); out.writeObject(prikey); out.close(); System.out.println("寫入對象 prikeys ok"); out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat")); out.writeObject(pubkey); out.close(); System.out.println("寫入對象 pubkeys ok"); System.out.println("生成密鑰對成功"); return true; } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("生成密鑰對失敗"); return false; }; } public String byte2hex(byte[] b) { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } } 把他的公鑰的信息及簽名發(fā)給其它用戶
4.PKI(公鑰基礎(chǔ)設(shè)施):
posted @ 2007-12-05 22:09 Stanley Sun 閱讀(539) | 評論 (1) | 編輯 收藏
安裝完成之后打開window->show views-Task Repositories,界面如下圖:
在空白處右鍵點擊add task repository添加知識庫,如圖:
選中Jira,下一步:
server中填寫Jira的地址(http://ycfd.3322.org:88/jira),label隨便填寫,User ID和Password就是你在Jira上注冊的帳號和密碼了,填寫完畢之后點Validate Setting,驗證成功之后點完成即可。
在添加完repository后,會彈出添加query界面。如圖:
選擇create query using form后點擊next,進入query設(shè)置界面,如圖:
在project中選中fms后點擊finish。這樣就完成了各項設(shè)置
之后打開tasklist視圖:window->show view->other->mylyn->task list
點擊OK,后打開task list視圖,如圖:
在Task List中你可以看到你的項目中的問題和任務(wù)等,雙擊Task會顯示該Task的詳細(xì)情況:
在Task List中還能新建Task并提交到Jira,這里就不多說了,大家自己嘗試一下。
posted @ 2007-12-03 16:38 Stanley Sun 閱讀(1360) | 評論 (0) | 編輯 收藏
mylyn是一款開源的基于eclipse開發(fā)平臺的任務(wù)管理組件,可以制定自己的本地任務(wù)及在遠(yuǎn)程服務(wù)器(其中包括Bugzilla、Trac 和 JIRA等)中的遠(yuǎn)程任務(wù)。對于我們現(xiàn)在的項目,使用mylyn就可以方便我們直接的瀏覽在JIRA中的任務(wù),而不必經(jīng)常的登錄JIRA平臺了。提高了大家的工作效率。
由于mylyn與在我們現(xiàn)在在項目中使用的eclipse開發(fā)平臺中springide插件有沖突問題,所以首先大家需要把springide插件從eclipse中卸載。步驟如下:
1.在eclipse安裝目錄下找到一個名為links的文件夾,在這個文件夾中刪除Springide.link文件。
2.啟動eclipse,不過與平常不同的是需要在eclipse啟動命令中加入-clean參數(shù)。可以直接加入到eclipse快捷方式的目標(biāo)項中。
此時eclipse會把springide插件卸載,之后我們就可以安裝mylyn插件了。在開始安裝mylyn之前,大家需要下載附件中的如下三個文件:mylyn-2.1-e3.3.zip,mylyn-2.1-extras.zip,springide_updatesite_2.0.1_v200708152145.zip
步驟如下:
1.設(shè)置本地插件歸檔:進入help->software updates->find and install菜單后,選擇search for new features to install后點擊next
進入install界面,如下圖:
把下載的三個zip歸檔加入后,點擊finish.
2.在彈出的updates窗口中選中剛才加入的三個歸檔,并把springide->integrations->spring ide ajdt integrations去掉后,如下圖:
之后進入授權(quán)界面,選擇i accept后next,如圖:
3.在彈出的verification窗口中點擊install all開始安裝,如圖:
之后提示是否重啟eclipse,點擊是。
posted @ 2007-12-03 16:38 Stanley Sun 閱讀(5518) | 評論 (0) | 編輯 收藏
EJBCA是一個全功能的CA系統(tǒng)軟件,它基于J2EE技術(shù),并提供了一個強大的、高性能并基于組件的CA。EJBCA兼具靈活性和平臺獨立性,能夠獨立使用,也能和任何J2EE應(yīng)用程序集成。
所需軟件:
1.jdk 1.5 下載地址:http://java.sun.com/
2.jboss-4.2.0.GA 下載地址:http://www.jboss.com/
3.jce_policy-1_5_0:下載地址:http://java.sun.com/
4.apache-ant-1.7.0:http://ant.apache.org/
5.oracle 10G:
6.ojdbc14.jar:
7.ejbca 3.4.5: 下載地址:http://ejbca.sourceforge.net
安裝步驟:
1.安裝jdk,jboss,ant,oracle,并把jce,jdbc解壓分別解壓到%JAVA_HOME%\jre\lib\security\與%JBOSS_HOME%\server\default\lib\。
2.設(shè)置環(huán)境變量,我的配置為:
ANT_HOME=C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0 EJBCA_HOME=C:\tool\ejbca\ejbca_3_5_2\ejbca_3_5_2 JBOSS_HOME=C:\tool\ejbca\jboss-4.2.0.GA\jboss-4.2.0.GA JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03 path=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0\bin;C:\tool\ejbca\jboss- 4.2.0.GA\jboss-4.2.0.GA\bin;C:\Program Files\Java\jdk1.6.0_03\bin classpath=C:\Program Files\Java\jdk1.6.0_03\lib\tools.jar
3.在數(shù)據(jù)庫中創(chuàng)建表空間并添加用戶EJBCA,在ORACLE中的代碼為:
創(chuàng)建表空間:
CREATE TABLESPACE EJBCA DATAFILE 'EJBCA.dbf' SIZE 100m ;
創(chuàng)建用戶:
CREATE user EJBCA identified by "EJBCA" default tablespace USERS temporary tablespace TEMP profile DEFAULT; -- Grant/Revoke role privileges grant aq_administrator_role to EJBCA with admin option; grant dba to EJBCA with admin option; -- Grant/Revoke system privileges grant unlimited tablespace to EJBCA with admin option;
4.刪除所有的ejbca\adminweb中的jsp(%EJBCA_HOME%\src\adminweb*.jsp)中的
<%@ page pageEncoding="ISO-8859-1"%>
以解決中文亂碼問題,下一步也是解決此類問題。
5.把%EJBCA_HOME%\conf\ejbca.properties.sample改名為ejbca.properties,并在ejbca.properties添加如下一行:
web.contentencoding=GBK
6.把%EJBCA_HOME%\conf\database.properties.sample改名為database.properties,并更改相應(yīng)的數(shù)據(jù)庫配置。如下是我的配置:
datasource.jndi-name=EjbcaDS datasource.jndi-name-prefix=java:/ database.name=oracle datasource.mapping=Oracle9i database.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL database.driver=oracle.jdbc.driver.OracleDriver database.username=ejbca database.password=ejbca
注:datasource.mapping需要選擇與oracle實際版本最接近的版本。
7.在%EJBCA_HOME%\bin中,通過cmd運行ant bootstrap。
8.啟動jboss,在%JBOSS_HOME%\bin,通過cmd運行run。
9.在%EJBCA_HOME%\bin中,通過cmd運行ant install。
10.關(guān)閉jboss,并在在%EJBCA_HOME%\bin中,通過cmd運行ant deploy。
11.再次啟動jboss,在%JBOSS_HOME%\bin,通過cmd運行run。
13.導(dǎo)入在%EJBCA_HOME%\p12目錄中superadmin.p12,默認(rèn)密碼為ejbca。
注:在第7步時,如出現(xiàn)ANT失敗,可能是由于ejbca的版本問題,推薦使用ejbca3.4.5。
posted @ 2007-12-03 16:33 Stanley Sun 閱讀(1610) | 評論 (0) | 編輯 收藏
一般在有著1年半以上的程序員基本上都是知道這個厲害的東西的,它對字符串處理的能力可以說是生猛無比。雖然大家都在使用(有時候在開發(fā)的Code中,有時候是在我們自己心愛的Editor里),但是我相信大部分人對這里禽獸的了解程度只是停留在會用的層次上。下面我對它進行一下詳細(xì)的說明。
正則表達(dá)式的“祖先”可以一直上溯至對人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。
1956 年, 一位叫 Stephen Kleene 的美國數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為“神經(jīng)網(wǎng)事件的表示法”的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為“正則集的代數(shù)”的表達(dá)式,因此采用“正則表達(dá)式”這個術(shù)語。
隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson是Unix 的主要發(fā)明人。正則表達(dá)式的第一個實用應(yīng)用程序就是 Unix 中的qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個重要部分。
使用正則表達(dá)式
在典型的搜索和替換操作中,必須提供要查找的確切文字。這種技術(shù)對于靜態(tài)文本中的簡單搜索和替換任務(wù)可能足夠了,但是由于它缺乏靈活性,因此在搜索動態(tài)文本時就有困難了,甚至是不可能的。
使用正則表達(dá)式,就可以:
測試字符串的某個模式。例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數(shù)據(jù)有效性驗證。
替換文本。可以在文檔中使用一個正則表達(dá)式來標(biāo)識特定文字,然后可以全部將其刪除,或者替換為別的文字。
根據(jù)模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。
例如,如果需要搜索整個 web 站點來刪除某些過時的材料并替換某些HTML 格式化標(biāo)記,則可以使用正則表達(dá)式對每個文件進行測試,看在該文件中是否存在所要查找的材料或 HTML 格式化標(biāo)記。用這個方法,就可以將受影響的文件范圍縮小到包含要刪除或更改的材料的那些文件。然后可以使用正則表達(dá)式來刪除過時的材料,最后,可以再次使用正則表達(dá)式來查找并替換那些需要替換的標(biāo)記。
許多種工具都支持正則表達(dá)式(文本編輯器、文字處理軟件、系統(tǒng)工具、數(shù)據(jù)庫引擎,等等),不過,要想充分挖掘正則表達(dá)式的能力,還是應(yīng)當(dāng)將它作為編程語言的一部分。例如Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事實上,在一些用上述語言編寫的程序中,正則表達(dá)式扮演了極其重要的角色。
正則表達(dá)式能夠得到眾多語言和工具的支持是有原因的:它們極其有用。從較低的層面上來說,正則表達(dá)式描述的是一串文本(a chunk of text)的特征。大家可以用它來驗證用戶輸入的數(shù)據(jù),或者也可以用它來檢索大量的文本。從較高的層面上來說,正則表達(dá)式容許用戶掌控他們自己的數(shù)據(jù)——控制這些數(shù)據(jù),讓它們?yōu)樽约悍?wù)。掌握正則表達(dá)式,就是掌握自己的數(shù)據(jù)。
可見它的重要性,難怪每款編輯器和編程語言不同程度的實現(xiàn)了它,使得普通用戶和開發(fā)人員受益不淺。
posted @ 2007-11-07 23:02 Stanley Sun 閱讀(429) | 評論 (1) | 編輯 收藏
在開發(fā)B/S程序時,我們經(jīng)常會使用到一些頁面級的效果控件。比如:樹形目錄,ComboBox和一些其他的控件,由于這些控件的存在使得我們的程序異常的奪目。但是在開發(fā)這些控件的時候或多或少的都會比較麻煩。而大部分的程序員是使用發(fā)布的一些開源的JS控件來減輕工作量而且也使得自己的程序健壯。下面我介紹一個在開源社區(qū)中赫赫有名的樹形控件:TreeView。
首先介紹一下TreeView,TreeView原名是FolderTree,是一款比較早就出世的樹形JS控件,當(dāng)時是由個人開發(fā)的,之后由公司購買了。但是現(xiàn)在還可以免費使用。
TreeView 有兩個JS文件和一些資源文件組成。兩個JS文件分別是:主要實現(xiàn)功能的ftiens4.js和實現(xiàn)多瀏覽器支持的ua.js文件。只有我們在開發(fā)的頁面中加入如上兩個文件的話就可以開發(fā)如上圖所顯示的樹形目錄了。代碼如下:
<html>
<head>
<script type="text/javascript" src="../treeview/ftiens4.js" ></script>
<script type="text/javascript" src="../treeview/ua.js" ></script>
<script type="text/javascript">
//TreeView 環(huán)境變量
BUILDALL = 0 //創(chuàng)建所有的節(jié)點對象 0:延時創(chuàng)建 1:立即創(chuàng)建
GLOBALTARGET = 'R' //節(jié)點觸發(fā)時的目標(biāo) 'B':打開新窗口 'R':右邊的Frame 'S':當(dāng)前Frame 'T':當(dāng)前瀏覽器窗口
HIGHLIGHT = 0 //高亮顯示當(dāng)前選中的節(jié)點 0:不高亮顯示 1:高亮顯示
HIGHLIGHT_BG = 'blue' //高亮顯示的背景顏色
HIGHLIGHT_COLOR = 'white' //高亮顯示的顏色
ICONPATH = '' //指定節(jié)點的顯示圖標(biāo),使用URL方式,而且必須用"/"結(jié)尾 如:http://www.x.com/y/
PRESERVESTATE = 0 //保存TreeView的狀態(tài)到Cookie中,當(dāng)再次顯示的時候會自動的回置狀態(tài) 0:不保存 1:保存
STARTALLOPEN = 0 //默認(rèn)打開所有節(jié)點 0:只打開根節(jié)點 1:打開所以節(jié)點
USEFRAMES = 1 //頁面是否使用了Frame,注意:如果未使用Frame一定要設(shè)置此參數(shù) 0:未使用 1:使用了
USEICONS = 1 //是否使用圖標(biāo) 0:不顯示圖標(biāo) 1:顯示圖標(biāo)
USETEXTLINKS = 0 //節(jié)點文字是否為鏈接 0:否 1:是
WRAPTEXT = 0 //節(jié)點顯示超出一行時是否折行 0:不折行 1:折行foldersTree = gFld("test", "") //創(chuàng)建一個名為"test"的根節(jié)點
foldersTree.treeID = "t1" //設(shè)置test節(jié)點的唯一編號為"t1"
aux1 = insFld(foldersTree, gFld("Day of the week", "b.html")) //在根節(jié)點中加入一個名為"Day of the week"的子節(jié)點,當(dāng)點擊的時候打開b.html
aux1.addChildren([["1","1.html"],["2","2.html"],["3","3.html"],["4","4.html"],["5","5.html"]]) //在aux1節(jié)點中連續(xù)加入1,2,3,4,5節(jié)點,并相應(yīng)的打開1.html,2.html,3.html,4.html,5.html.aux2 = insFld(foldersTree, gLnk("R","Day of the week2", "b.html")) //在根節(jié)點中加入名為"Day of the week2"的節(jié)點,當(dāng)點擊的時候在右側(cè)的frame中打開b.html
aux3 = insDoc(foldersTree, gLnk("R","<input type=\"checkbox\">Day of the week3", "c.html")) //在根節(jié)點中加入名為"Day of the week3"并帶有復(fù)選框的節(jié)點,當(dāng)點擊的時候在右側(cè)的frame中打開c.html
</script>
</head>
<body>
<A style="font-size:7pt;text-decoration:none;color:silver" href=" target=_blank>Javascript Tree Menu</A>
<script type="text/javascript">
initializeDocument();//構(gòu)造TreeView
</script>
</body>
</html>
TreeView中主要的方法:
gFld(Title, Link);//創(chuàng)建節(jié)點 例:gFld("Test A", "javascript:parent.op()")
Argument
Title
Specifies the text that appears in the folder name. This text can include simple HTML tags, such as enclosing formatting tags (i, b, div, and so on). It can even include an img tag if you want to place a small icon in the node name, such as a "new!" icon for example.
Link
Specifies an optional URL. The URL can be a simple file name like demoFramesetRightFrame.html or a string with protocol, domain, path, and file name like http://www.treeview.net/treemenu/demopics/beenthere_europe.gif.
gLnk(Target, Title, Link);//創(chuàng)建一個帶有鏈接的節(jié)點 例:gLnk("B", "My File", http://www.mysite.com/MyFile.doc)
Argument
Target
Configures the target location for the link. Specify one of the following values:
"R": Open the document in the right frame (a frame named basefrm)
"B": Open the document in a new window
"T": Open the document in the current browser window, replacing the frameset if one exists
"S": Open the document in the current frame, replacing the tree
Note: This argument is case sensitive; make sure to use uppercase letters.
Title
Specifies the text that appears in the link. This text can include simple HTML tags, such as enclosing formatting tags (i, b, div, and so on). It can even include an img tag if you want to place a small icon in the node name, such as a "new!" icon for example.
Link
Specifies the URL of the document. This can be an absolute URL or a relative URL. Do not enter any other information in this string; adding a target parameter or an event handler will not work.
insFld(Parent Folder, Child Folder); //在父節(jié)點中插入一個子節(jié)點 例:aux1 = insFld(foldersTree, gFld("Europe", "http..."))
Argument
Parent Folder
Specifies the parent folder. That is, this argument specifies the folder node in which you want to place the other folder node.
Child Folder
Specifies the child folder. That is, this argument specifies the folder node that you want to place under the parent folder node.
insDoc(Parent Folder, Document Node); //在節(jié)點中加入一個Dom對象 例:insDoc(aux2, gLnk("S", "Boston", "..."))
Argument
Parent Folder
Specifies the parent folder. That is, this argument specifies the folder node in which you want to place the document node.
Document Node
Specifies the document node. That is, this argument specifies the document node that you want to place in the parent folder node
posted @ 2007-11-07 17:59 Stanley Sun 閱讀(7508) | 評論 (2) | 編輯 收藏
在一年以前一個客戶給我推薦一款文件管理軟件,名叫Total Commander,以下簡稱totalcmd,據(jù)說在歐美國家相當(dāng)?shù)牧餍小.?dāng)時給這個客戶開發(fā)程序是需要打開很多個資源管理器,在這么多的管理器中相互的拷貝文件真是一件非常頭疼的事情。借助totalcmd可以非常好的完成文件的管理,拷貝、刪除,新建,乃至服務(wù)的管理等等。值得一提的就是totalcmd可以通過注入插件實現(xiàn)totalcmd本身不可以完成的功能,這也是它很大的一個亮點。
在使用的一年多的totalcmd后,也有了一些自己的使用習(xí)慣和獨愛的插件,我將羅列如下:
使用習(xí)慣:
1.把F2快捷鍵指定到cm_RenameOnly命令上。
2.把Ctrl+G快捷鍵指定到cm_FocusCmdLine命令上。
3.在開始菜單下建立一個功能,實現(xiàn)cm_SwitchHidSys功能,可以顯示隱藏/系統(tǒng)文件。
4.指定totalcmd只能運行一個實例。
5.最小化到系統(tǒng)托盤里。
6.編輯時默認(rèn)打開的編輯器為ChoiceEditor。這個插件很難找。
7.把快速查找定義為Letters with search dialog
8.當(dāng)改變驅(qū)動盤符的時候直接定位的驅(qū)動的根目錄下
獨愛插件:
1.Choice Editor:默認(rèn)編輯選擇器。
2.File Redirector:臨時目錄,這個插件非常有用,強烈推薦。不過安裝的時候需要下載一個msvcr70.dll的文件放到你的c:\windows\system32目錄下。文件的下載地址:http://www.dll-files.com/dllindex/dll-files.shtml?msvcr70
3.UnInstTC:集成在totalcmd中添加/刪除程序,支持搜索。
4.Office:可以通過Ctrl+Q快速查看Office系列軟件格式。
注:本人只是一個totalcmd的愛好者,而不是在此為他去大廣告。
posted @ 2007-10-31 11:07 Stanley Sun 閱讀(670) | 評論 (0) | 編輯 收藏
AutoSuggest是通過AJAX技術(shù)實現(xiàn)的一種類似于ComboBox之類的輸入框,當(dāng)輸入一些提示字符后,AS會自動的把輸入框中的Value通過AJAX發(fā)送到Server中,Server自定義的解析發(fā)送的數(shù)據(jù),然后把返回數(shù)據(jù)通過XML或JSON方式返回到AS中。AS再根據(jù)Server返回的標(biāo)準(zhǔn)格式的數(shù)據(jù)構(gòu)建出提示候選框,當(dāng)用鼠標(biāo)或鍵盤選中候選項后填充到輸入框中。在寫這篇手冊的時候,AutoSuggest的最新版本是autosuggest_v2.1.3。基本的運行原理如上。
AutoSuggest的主要的物理文件有:bsn.AutoSuggest_2.1.3.js、autosuggest_inquisitor.css。其他的還有一些圖片資源文件,一個測試html與一個test.php的服務(wù)器段頁面。結(jié)構(gòu)如下:





































































































AutoSuggest是一組JavaScript類庫,其中主要的對象就是bsn.AutoSggest對象,基本的功能都是在這個對象中完成的。首先我們構(gòu)建一個簡單的示例:























通過這樣簡單的方式我們就可以完成在頁面中的autosuggest編碼了。其中的參數(shù)表可以看下表:
Property |
Type |
Default |
Description |
script |
String / Function |
- |
REQUIRED! |
varname |
String |
"input" |
Name of variable passed to script holding current input. |
minchars |
Integer |
1 |
Length of input required before AutoSuggest is triggered. |
className |
String |
"autosuggest" |
Value of the class name attribute added to the generated ul. |
delay |
Integer |
500 |
Number of milliseconds before an AutoSuggest AJAX request is fired. |
timeout |
Integer |
2500 |
Number of milliseconds before an AutoSuggest list closes itself. |
cache |
Boolean |
true |
Whether or not a results list should be cached during typing. |
offsety |
Integer |
-5 |
Vertical pixel offset from the text field. |
shownoresults |
Boolean |
true |
Whether to display a message when no results are returned. |
noresults |
String |
No results! |
No results message. |
callback |
Function |
A function taking one argument: an object {id:"1", value:"Foobar", info:"Cheshire"} |
|
json |
Boolean |
false |
Whether or not a results are returned in JSON format. If not, script assumes results are in XML. |
maxentries |
Integer |
25 |
The maximum number of entries being returned by the script. (Should correspond to the LIMIT clause in the SQL query.) |
之后我們只要在我的服務(wù)器中解析傳入的signer參數(shù)返回,如下格式的xml就可以了。當(dāng)然也可以用JSON方式,不過我在這里就不在演示了。











AutoSuggest是比較方便的一種實現(xiàn)類Google Suggest的解決方式,提供的js文件也是比較精巧的,并提供的一個壓縮后的js腳本文件只有8.33 KB大小。如果要查看其代碼可以找到一個沒有壓縮的原始版本的源代碼,其中的代碼也是比較容易閱讀,更改起來也是比較簡單的。我會在以后寫一篇《AutoSuggest代碼解析》。
更多信息可查閱 http://www.brandspankingnew.net/archive/2007/02/ajax_auto_suggest_v2.html
posted @ 2007-10-19 18:17 Stanley Sun 閱讀(2535) | 評論 (2) | 編輯 收藏
<composite-id name="id" class="InfoViewDetaillistId">
<key-property
name="accountno"
column="ACCOUNTNO"
type="string"
/>
<key-property
name="rlsdepid"
column="RLSDEPID"
type="string"
/>
<key-property
name="sequenceno"
column="SEQUENCENO"
type="integer"
/>
<key-property
name="ondate"
column="ONDATE"
type="date"
/>
</composite-id>
在這個復(fù)合主鍵中包括了四個擁有業(yè)務(wù)邏輯的字段,分別是帳號,中心號,序號,日期。問題就在Hibernate對日期類型的映射上,如使用上面的配置方法的話Hibernate在啟動的時候就會報錯。具體的解決方法是把<key-property
name="ondate"
column="ONDATE"
type="date"
/>
替換成
<key-property name="ondate" type="date">
<column name="ONDATE" not-null="true" sql-type="java.sql.Types.DATE"/>
</key-property>
Bug具體的原因我會在一會的文章中解釋。posted @ 2007-10-09 12:57 Stanley Sun 閱讀(311) | 評論 (0) | 編輯 收藏