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

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

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

    posts - 11,  comments - 9,  trackbacks - 0
    關鍵字:js驗證表單大全,用JS控制表單提交 ,javascript提交表單:
    目錄:
    1:js 字符串長度限制、判斷字符長度 、js限制輸入、限制不能輸入、textarea 長度限制
    2.:js判斷漢字、判斷是否漢字 、只能輸入漢字
    3:js判斷是否輸入英文、只能輸入英文
    4:js只能輸入數字,判斷數字、驗證數字、檢測數字、判斷是否為數字、只能輸入數字
    5:只能輸入英文字符和數字
    6: js email驗證 、js 判斷email 、信箱/郵箱格式驗證
    7:js字符過濾,屏蔽關鍵字
    8:js密碼驗證、判斷密碼
    2.1: js 不為空、為空或不是對象 、判斷為空 、判斷不為空
    2.2:比較兩個表單項的值是否相同
    2.3:表單只能為數字和"_",
    2.4:表單項輸入數值/長度限定
    2.5:中文/英文/數字/郵件地址合法性判斷
    2.6:限定表單項不能輸入的字符
    2.7表單的自符控制
    2.8:form文本域的通用校驗函數

    1. 長度限制

    <script>
    function test()
    {
    if(document.a.b.value.length>50)
    {
    alert("不能超過50個字符!");
    document.a.b.focus();
    return false;
    }
    }
    </script>
    <form. name=a nsubmit="return test()">
    <textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
    <input type="submit" name="Submit" value="check">
    </form>


    2. 只能是漢字

    <input nkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">


    3." 只能是英文

    <script. language=javascript>
    function onlyEng()
    {
    if(!(event.keyCode>=65&&event.keyCode<=90))
    event.returnvalue=false;
    }
    </script>

    <input nkeydown="onlyEng();">


    4. 只能是數字

    <script. language=javascript>
    function onlyNum()
    {
    if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
    //考慮小鍵盤上的數字鍵
    event.returnvalue=false;
    }
    </script>

    <input nkeydown="onlyNum();">


    5. 只能是英文字符和數字


    6. 驗證油箱格式

    <SCRIPT. LANGUAGE=javascript. RUNAT=Server>
    function isEmail(strEmail) {
    if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
    return true;
    else
    alert("oh");
    }
    </SCRIPT>
    <input type=text nblur=isEmail(this.value)>


    7. 屏蔽關鍵字(這里屏蔽***和****)

    <script. language="javascript1.2">
    function test() {
    if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
    alert(":)");
    a.b.focus();
    return false;}
    }
    </script>
    <form. name=a nsubmit="return test()">
    <input type=text name=b>
    <input type="submit" name="Submit" value="check">
    </form>


    8. 兩次輸入密碼是否相同

    <FORM. METHOD=POST ACTION="">
    <input type="password" id="input1">
    <input type="password" id="input2">
    <input type="button" value="test" nclick="check()">
    </FORM>
    <script>
    function check()
    {
    with(document.all){
    if(input1.value!=input2.value)
    {
    alert("false")
    input1.value = "";
    input2.value = "";
    }
    else document.forms[0].submit();
    }
    }
    </script>
    夠了吧 :)
    屏蔽右鍵 很酷
    oncontextmenu="return false" ndragstart="return false" nselectstart="return false"
    加在body中




    2.1   表單項不能為空


    <script   language="javascript">
    <!--
    function   CheckForm()
    {  
    if   (document.form.name.value.length   ==   0)   {  
    alert("請輸入您姓名!");
    document.form.name.focus();
    return   false;
    }
    return   true;
    }
    -->
    </script>


    2.2   比較兩個表單項的值是否相同


    <script   language="javascript">
    <!--
    function   CheckForm()
    if   (document.form.PWD.value   !=   document.form.PWD_Again.value)   {  
    alert("您兩次輸入的密碼不一樣!請重新輸入.");
    document.ADDUser.PWD.focus();
    return   false;
    }
    return   true;
    }
    -->
    </script>


    2.3   表單項只能為數字和"_",用于電話/銀行帳號驗證上,可擴展到域名注冊等


    <script   language="javascript">
    <!--
    function   isNumber(String)
    {  
    var   Letters   =   "1234567890-";   //可以自己增加可輸入值
    var   i;
    var   c;
    if(String.charAt(   0   )=='-')
    return   false;
    if(   String.charAt(   String.length   -   1   )   ==   '-'   )
    return   false;
    for(   i   =   0;   i   <   String.length;   i   ++   )
    {  
    c   =   String.charAt(   i   );
    if   (Letters.indexOf(   c   )   <   0)
    return   false;
    }
    return   true;
    }
    function   CheckForm()
    {  
    if(!   isNumber(document.form.TEL.value))   {  
    alert("您的電話號碼不合法!");
    document.form.TEL.focus();
    return   false;
    }
    return   true;
    }
    -->
    </script>



    2.4   表單項輸入數值/長度限定


    <script   language="javascript">
    <!--
    function   CheckForm()  
    {  
    if   (document.form.count.value   >   100   ||   document.form.count.value   <   1)
    {  
    alert("輸入數值不能小于零大于100!");
    document.form.count.focus();
    return   false;
    }
    if   (document.form.MESSAGE.value.length<10)
    {  
    alert("輸入文字小于10!");
    document.form.MESSAGE.focus();
    return   false;
    }
    return   true;
    }
    //-->
    </script>


    2.5   中文/英文/數字/郵件地址合法性判斷


    <SCRIPT   LANGUAGE="javascript">
    <!--

    function   isEnglish(name)   //英文值檢測
    {  
    if(name.length   ==   0)
    return   false;
    for(i   =   0;   i   <   name.length;   i++)   {  
    if(name.charCodeAt(i)   >   128)
    return   false;
    }
    return   true;
    }

    function   isChinese(name)   //中文值檢測
    {  
    if(name.length   ==   0)
    return   false;
    for(i   =   0;   i   <   name.length;   i++)   {  
    if(name.charCodeAt(i)   >   128)
    return   true;
    }
    return   false;
    }

    function   isMail(name)   //   E-mail值檢測
    {  
    if(!   isEnglish(name))
    return   false;
    i   =   name.indexOf("   at   ");
    j   =   name   dot   lastIndexOf("   at   ");
    if(i   ==   -1)
    return   false;
    if(i   !=   j)
    return   false;
    if(i   ==   name   dot   length)
    return   false;
    return   true;
    }

    function   isNumber(name)   //數值檢測
    {  
    if(name.length   ==   0)
    return   false;
    for(i   =   0;   i   <   name.length;   i++)   {  
    if(name.charAt(i)   <   "0"   ||   name.charAt(i)   >   "9")
    return   false;
    }
    return   true;
    }

    function   CheckForm()
    {  
    if(!   isMail(form.Email.value))   {  
    alert("您的電子郵件不合法!");
    form.Email.focus();
    return   false;
    }
    if(!   isEnglish(form.name.value))   {  
    alert("英文名不合法!");
    form.name.focus();
    return   false;
    }
    if(!   isChinese(form.cnname.value))   {  
    alert("中文名不合法!");
    form.cnname.focus();
    return   false;
    }
    if(!   isNumber(form.PublicZipCode.value))   {  
    alert("郵政編碼不合法!");
    form.PublicZipCode.focus();
    return   false;
    }
    return   true;
    }
    //-->
    </SCRIPT>


    2.6   限定表單項不能輸入的字符


    <script   language="javascript">
    <!--

    function   contain(str,charset)//   字符串包含測試函數
    {  
    var   i;
    for(i=0;i<charset.length;i++)
    if(str.indexOf(charset.charAt(i))>=0)
    return   true;
    return   false;
    }

    function   CheckForm()
    {  
    if   ((contain(document.form.NAME.value,   "%\(\)><"))   ||   (contain(document.form.MESSAGE.value,   "%\(\)><")))
    {  
    alert("輸入了非法字符");
    document.form.NAME.focus();
    return   false;
    }
    return   true;
    }
    //-->
    </script>
      

    1. 檢查一段字符串是否全由數字組成      

    ---------------------------------------      
    <script. language="Javascript"><!--          
    function checkNum(str){return str.match(/\D/)==null}          
    alert(checkNum("1232142141"))          
    alert(checkNum("123214214a1"))          
    // --></script>    
        
          
    2. 怎么判斷是否是字符        
    ---------------------------------------      

    if (/[^\x00-\xff]/g.test(s)) alert("含有漢字");          
    else alert("全是字符");  
      
              
    3. 怎么判斷是否含有漢字        
    ---------------------------------------        

    if (escape(str).indexOf("%u")!=-1) alert("含有漢字");        
    else alert("全是字符");    
          
        
    4. 郵箱格式驗證    
    ---------------------------------------      

    //函數名:chkemail    
    //功能介紹:檢查是否為Email Address    
    //參數說明:要檢查的字符串    
    //返回值:0:不是 1:是    
    function chkemail(a)    
    { var i=a.length;    
    var temp = a.indexOf('@');    
    var tempd = a.indexOf('.');    
    if (temp > 1) {    
    if ((i-temp) > 3){    
    if ((i-tempd)>0){    
    return 1;    
    }    
        
    }    
    }    
    return 0;    
    }


    5. 數字格式驗證    
    ---------------------------------------      

    //函數名:fucCheckNUM    
    //功能介紹:檢查是否為數字    
    //參數說明:要檢查的數字    
    //返回值:1為是數字,0為不是數字    
    function fucCheckNUM(NUM)    
    {    
    var i,j,strTemp;    
    strTemp="0123456789";    
    if ( NUM.length== 0)    
    return 0    
    for (i=0;i<NUM.length;i++)    
    {    
    j=strTemp.indexOf(NUM.charAt(i));    
    if (j==-1)    
    {    
    //說明有字符不是數字    
    return 0;    
    }    
    }    
    //說明是數字    
    return 1;    
    }  
      
        
    6. 電話號碼格式驗證    
    ---------------------------------------      

    //函數名:fucCheckTEL    
    //功能介紹:檢查是否為電話號碼    
    //參數說明:要檢查的字符串    
    //返回值:1為是合法,0為不合法    
    function fucCheckTEL(TEL)    
    {    
    var i,j,strTemp;    
    strTemp="0123456789-()# ";    
    for (i=0;i<TEL.length;i++)    
    {    
    j=strTemp.indexOf(TEL.charAt(i));    
    if (j==-1)    
    {    
    //說明有字符不合法    
    return 0;    
    }    
    }    
    //說明合法    
    return 1;    
    }    
      
    7. 判斷輸入是否為中文的函數  
    ---------------------------------------      

    function ischinese(s){  
    var ret=true;  
    for(var i=0;i<s.length;i++)  
    ret=ret && (s.charCodeAt(i)>=10000);  
    return ret;  
    }
        
      
    8. 綜合的判斷用戶輸入的合法性的函數  
    ---------------------------------------      

    <script. language="javascript">  
    //限制輸入字符的位數開始  
    //m是用戶輸入,n是要限制的位數  
    function issmall(m,n)  
    {  
    if ((m<n) && (m>0))  
       {  
       return(false);  
       }  
    else  
    {return(true);}  
    }

      
    9. 判斷密碼是否輸入一致  
    ---------------------------------------      

    function issame(str1,str2)  
    {  
    if (str1==str2)  
    {return(true);}  
    else  
    {return(false);}  
    }
      
      
    10. 判斷用戶名是否為數字字母下滑線
    ---------------------------------------      

    function notchinese(str){
    var reg=/[^A-Za-z0-9_]/g
         if (reg.test(str)){
         return (false);
         }else{
    return(true);     }
    }


    2.8. form文本域的通用校驗函數
    ---------------------------------------      
    作用:檢測所有必須非空的input文本,比如姓名,賬號,郵件地址等等。
    該校驗現在只針對文本域,如果要針對form里面的其他域對象,可以改變判斷條件。

    使用方法:在要檢測的文本域中加入title文字。文字是在提示信息,你要提示給用戶的該字段的中文名。比如要檢測用戶名
    html如下,當然,最好用可視化工具比如dreamweaver什么的來編輯域。
    如果要檢測數字類型數據的話,再把域的id統一為sz.
    javascript判斷日期類型比較麻煩,所以就沒有做日期類型校驗的程序了.高手可以補充。

    程序比較草,只是提供一個思路。拋磚引玉! :)
    哦,對了,函數調用方法:< form   nsubmit="return dovalidate()">


    function dovalidate()
    {
    fm=document.forms[0] //只檢測一個form,如果是多個可以改變判斷條件
         for(i=0;i<fm.length;i++)
         {  
         //檢測判斷條件,根據類型不同可以修改
         if(fm[i].tagName.toUpperCase()=="INPUT" &&fm[i].type.toUpperCase()=="TEXT" && (fm[i].title!=""))
        
              if(fm[i].value="/blog/="")//
              {
              str_warn1=fm[i].title+"不能為空!";
              alert(str_warn1);
             fm[i].focus();
              return false;        
              }
              if(fm[i].id.toUpperCase()=="SZ")//數字校驗
              {
                      if(isNaN(fm[i].value))
                     { str_warn2=fm[i].title+"格式不對";
                     alert(str_warn2);
                     fm[i].focus();
                      return false;
                      }
             }
         }
         return true;
    }

    posted @ 2008-08-30 21:27 square 閱讀(1435) | 評論 (0)編輯 收藏

    20060627UMLChinaIntrotoUML.part1.rar
    20060627UMLChinaIntrotoUML.part2.rar
    20060627UMLChinaIntrotoUML.part3.rar
    20060627UMLChinaIntrotoUML.part4.rar
    20060627UMLChinaIntrotoUML.part5.rar

    posted @ 2007-11-25 17:18 square 閱讀(306) | 評論 (0)編輯 收藏

    以下是網友王垠寫的關于學習Linux的忠告。但只要稍加替換,它完全可以用來解決FF與IE,五筆與拼音,QQ與MSN,IBM與HP,甚至是SONY與任天堂粉絲之間的種種爭端。

    1. 不要當“傳教士”

    很多人在討論區不斷的引起 "Linux vs. Windows" 之類的討論,甚至爭的面紅耳赤,這是沒有必要的。 這種爭論是浪費時間而沒有任何用處的。對,你花了一下午,用許多事實“捍衛”了 “Linux 比 Windows 好” 這個說法。但是 Windows 的支持者并不會喜歡上 Linux,他們只是稍微退縮一下,然后找一些新的證據來跟你辯論。 世界上的人們都在利用Linux 研究最前沿的科學,我們還在這里討論 “要不要用Linux” 這種無聊的問題,什么時候才能趕上時代前進的步伐? 什么叫做“Windows 支持者”,什么叫做“Linux 支持者”?我們為什么要支持某一個而反對另外一個?你不需要為 Linux “護法”,不需要成為“Linux 支持者”或者“GNU傳教士”,GNU/Linux 已經用事實向世界證明了它們的威力,已經被大多數人接受。你只需要安安靜靜享受 GNU/Linux 給你的樂趣和自由。 你需要關心的不是你的工具是什么,而是你用它做了什么。精通 Linux 并不說明任何問題,因為它只是一個工具而已。如果你用 Windows 能很好的完成你的任務,那你就沒有必要費時間去熟悉 Linux。直到有一天你發現一項任務只有 Linux 才能完成的時候再換也不遲,因為你身邊的 Linux 的愛好者一定會很樂意的幫助你。

     工具不是人,不應該對工具有感情。這是你在進行任何對工具的討論前需要提醒自己的事情。面對一些容易引起爭論的東西:Word 和 TeX;Emacs 和 VIM;MAXIMA,Mathematica 和 Maple;Gnome, FVWM 和 KDE;Mutt 和 Pine …… 一定要冷靜的對自己說:“我不站在它們任何一邊,因為它們不是人。” 各人的需要不同,生活的環境不同。對你來說好的東西,對別人來說不一定好,我們需要尊重別人的選擇。如果你當面說別人正在用的程序不好,沒有人會樂意接受你的意見。我從來沒有建議過我爸爸不用 Windows + WPS,而用 Linux + LaTeX 來處理他的英語試卷。因為 WPS 是我爸爸的選擇,他能用 WPS 編輯出很好的試題去測試他的學生,那就足夠了。

     我曾經幫我爸爸做了一個 perl 程序,能夠自動從一種我自己設計的 markup 語言轉化成 LaTeX 格式的英語試卷。可以自動對試題編號,亂序排版選擇題的選項,自動生成答案表,生成老師用的顯示答案的版本,自動對短文改錯題進行優化分段,自動拼寫檢查,圖形化的配置方式…… 我爸爸高興的用了一段時間,可是后來他想用 WPS 里的一種標題樣式,而我不在家,無法為他修改程序。所以他又換回了 WPS。這就像有人送愛因斯坦一罐剃須泡沫一樣,剛開始幾天,發現他神采飛揚,不斷夸這個東西真舒服。過了幾天,發現愛因斯坦又開始用白水剃胡子了,因為剃須泡沫用完了,他懶得自己去買那個東西。這只是習慣問題。

    2. 不要強迫自己

    喜歡電腦的人總是有某些心理強迫傾向。有的人說:“鍵盤比鼠標快。我不要用鼠標。這樣才有高效率。” 所以他在編輯器里無論什么時候總是用 20w, 10j 這樣的命令到達目的點。他甚至覺得圖形界面是多余的,干脆 Xwindow 都不裝。 全部用鍵盤看起來的確比讓手離開鍵盤去拿鼠標,再回來“快” 多了,但是快的擊鍵頻率不等于工作的高效率,對你的健康更沒有什么好處。這只能把你變成打鍵盤的機器。 當你正在檢查你的文章或者程序,思維正在隨著字符的含義流動,突然 20w, 10j 這樣的東西出現在你的腦子里,是不是會打斷思路?不?那說明你當時思考的問題比較簡單,這些干擾還不會起到副作用。

     其實很多人用電腦的時候,思想都受到某種教條的束縛,上面這個只是眾多教條中的一種。某些人制造了很多這種教條,用他的工作方式來要求別人,嘲笑方式跟他不一樣的人。比如有的人嘲笑其它人寫 C 程序不按 8 字符縮進,嘲笑別人在 vi 里用方向鍵,嘲笑別人不知道 PVM 是什么,嘲笑其它人用 JAVA, C# 這種由 GC 回收內存語言…… 你不用管各種各樣的教條,電腦只是你的奴隸,你想怎么用就怎么用。沒有人能夠約束你,沒有人可以嘲笑你的工作方式。電腦明天就不再是這個樣子,所以今天你不用完全了解它。你沒有必要知道別人創造的一切,因為你需要留點時間自己創造些東西。Just have fun! 當你下次修改文章的時候,不妨試試悠閑的用鼠標在你眼睛看到的地方輕輕點一下。

    3. 不要“玩 Linux”

    很多人用 Linux 的時候會感覺很迷茫,該用哪個發行呢?是不是我少裝了什么?怎么升級這么快啊!怎么這么不穩定!每當遇到新的軟件他就想試用,每當新的版本出現,他就更新,然后用鼠標在新的菜單里選擇從來沒見過的程序來用用。 其實你是為了Linux而使用Linux,而沒有找到正確的理由來利用 Linux。你首先要明確用電腦的目的,你用它是為了解決你的實際問題,而不是為了學習安裝操作系統,不是為了測試哪個版本好用,不是為了“趕上潮流”,更不是因為你硬盤太大了,你想多占點空間。 如果你啟動了電腦之后不知道應該干什么,那么最好先不要用電腦,因為你可能有更重要的事情需要做。

    4. 不用挑剔發行版本

    很多人剛開始用 Linux 的時候,總是在懷疑別的發行版本是否比自己正在用的這個好,總是懷疑自己以后時候會失去支持,不得不換用別的發行。所以很多人今天是 Redhat,明天又換成了 debian, 一會兒又是 gentoo, …… 甚至有的人在一臺機器上裝了兩個版本的 Linux,然后比較哪一個好。 其實你完全沒有必要這樣做,任何發行,只要你熟悉了,你在上面的工作方式幾乎是不會受到任何影響的。

    我以前一直用的 Redhat,當我有一天在我的一臺新機器上安裝 debian 時,我發現使用 Redhat 的經驗完全沒有浪費。我用了一個下午就配置好了 debian,使它服服貼貼的聽我的話,就跟沒有換發行一樣。 Debian, TurboLinux, SuSE, Redhat, Gentoo, ... 任何一個版本都是不錯的。很多人認為自己攢一個 LFS 是高水平黑客的象征,但是不是每個人都有精力去了解所有細節。 如果你是用于個人的日常事物和科研,可以試試 debian。它是我見過的最方便的一個發行。

    5. 不要盲目升級

    不知道這是心理作用還是什么,有的人看到比較大的版本號,就會很想換成那個。很多人的 Redhat 本來配置的很舒服了,可是一旦 Redhat 發行新的版本,他們就會盡快下載過來,然后選擇升級安裝。結果很多時候把自己原來修改得很好的配置文件給沖掉了。新的軟件又帶來了新的問題,比如有一次我的 rxvt 升級到 2.7.8 就跟 miniChinput 沖突了,升級到 Redhat 8.0,發現 xmms 居然缺省不能放mp3了,XFree86 的 xtt 模塊在 I810 上有新的 bug,會導致 Mozilla 突然退出。 如果你已經配置好了一切,千萬別再整體升級了,這會浪費你很多很多時間的,不值得。有句話說得好:"If it's not broken, don't fix it." 如果你的程序能夠完成你需要做的事情,你何必升級呢?

    6. 不要配置你不需要的東西

    如果你只想做一個像我這樣的普通用戶,主要目的是用 Linux 來完成自己的科研任務和日常工作,那就可以不用系統管理員或者網絡管理員的標準來要求自己,因為當一個系統和網絡管理員確實很辛苦。普通用戶學習那些不經常用到的復雜的維護系統的工具,其實是浪費時間,學了不用是會很快忘記的! 我不是一個合格的網絡管理員,我的服務器都只設置了我自己需要的功能,設置好 ssh, ftp 已經足夠了,那樣可以省去我很多麻煩。我從來不過度考慮“安全”,因為 Linux 缺省已經很安全了。我沒有磁帶機,就不用管 tar 的那些稀奇古怪的參數了,czf, xzf, ztf 已經可以滿足我所有的需要。sed, awk, ... 我也只會幾種常用的命令行。

    7. 不要習慣的使用 root 帳號。

    在需要的時候才 su! 這是很多剛接觸 UNIX 類操作系統的人常見的現象,他們不喜歡在管理系統的時候才 su, 而是一直用 root 帳號干所有事情,配置系統,安裝程序,瀏覽網頁,玩游戲,編程 …… 結果有一天,他不小心在某個系統目錄使用了 rm * ... 后果不堪設想……

    8. 不要用商業的眼光來看 Linux。

     Linux 不是商業軟件,所以不要用要求 Solaris, Windows 那樣的眼光來看 Linux. 自由軟件的作者們從來不拉攏用戶,他們對用戶不負有任何責任。實際上在自由軟件的世界里,“開發者”和“用戶” 并沒有明確的界限,大家是朋友。 自由軟件很可能只是滿足作者和他的朋友的需要,甚至是為了好玩而創造的。自由軟件不是完美的,自由軟件承認自己有缺點,它不會自吹自擂,蒙蔽“用戶”的耳目。這種對作者責任的解脫激發了作者的創造力,他們不用過分考慮“向上兼容”,他們往往比背上重重包袱的商業軟件結構更合理,技術更先進。 所以當你用某個自由軟件遇到困難的時候,不應該埋怨軟件的作者,因為他們對你并沒有義務。

    你不應該把自己當成一個挑剔的顧客,而要把自己作為這個軟件的顧問和一個和藹的建議者,這樣你才能理解作者寫這個程序時的快樂,在遇到問題時向作者反映,幫助他完善這個軟件,成為一個快樂的參與者。就像你的哥哥送你一個他用舊了的自行車,你應該珍惜這份友情,而不要在車壞了,或者騎車摔了一交的時候大罵你的哥哥。如果你真的不能使用這種合作的心態,那么最好不要使用這個軟件。 這是一種先進的文化,它包含了互相合作,科學創新的精神。理解這一點不是很容易,很多人往往是因為不能理解這種文化而離開自由軟件。這對于作者來說并沒有什么損失。

    9. 干你的正事去

     很多人跟我說,你的網頁浪費我好多時間來配置這配置那,一會兒是 FVWM,一會兒是 Mutt …… 嗯……那些東西都是我有空的時候一點一點積累的,如果你想一次性搞定所有那些東西,恐怕得花你幾個星期甚至幾個月的時間!并不是一定要搞定所有這些東西你才能正常工作的。除非你真的非得利用某個程序,或者你閑著沒事,否則你可以不管這些東西。

    10. 上面幾條僅供參考 以上只是個人意見,不一定適合所有人。取舍由你了!

    posted @ 2007-11-25 17:09 square 閱讀(326) | 評論 (0)編輯 收藏
         摘要: 基礎知識: 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員...  閱讀全文
    posted @ 2006-07-17 22:06 square 閱讀(701) | 評論 (0)編輯 收藏
    abstract class和interface是Java語言中對于抽象類定義進行支持的兩種機制,正是由于這兩種機制的存在,才賦予了Java強大的面向對象能力。abstract class和interface之間在對于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對于abstract class和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區別的,對于它們的選擇甚至反映出對于問題領域本質的理解、對于設計意圖的理解是否正確、合理。本文將對它們之間的區別進行一番剖析,試圖給開發者提供一個在二者之間進行選擇的依據。


    理解抽象類

    abstract class和interface在Java語言中都是用來進行抽象類(本文中的抽象類并非從abstract class翻譯而來,它表示的是一個抽象體,而abstract class為Java語言中用于定義抽象類的一種方法,請讀者注意區分)定義的,那么什么是抽象類,使用抽象類能為我們帶來什么好處呢?

    在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表征我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟件的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能夠實例化的。

    在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向對象設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。


    從語法定義層面看abstract class和interface

    在語法層面,Java語言對于abstract class和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。

    使用abstract class的方式定義Demo抽象類的方式如下:

    abstract class Demo {
    ????????abstract void method1();
    ????????abstract void method2();
    ????????…


    使用interface的方式定義Demo抽象類的方式如下:

    interface Demo {
    ????????void method1();
    ????????void method2();
    ????????…
    }

    在abstract class方式中,Demo可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface方式的實現中,Demo只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstract class。

    對于abstract class和interface在語法定義層面更多的細節問題,不是本文的重點,不再贅述,讀者可以參閱參考文獻〔1〕獲得更多的相關內容。


    從編程層面看abstract class和interface

    從編程的角度來看,abstract class和interface都可以用來實現"design by contract"的思想。但是在具體的使用上面還是有一些區別的。

    首先,abstract class在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface。也許,這是Java語言的設計者在考慮Java對于多重繼承的支持方面的一種折中考慮吧。

    其次,在abstract class的定義中,我們可以賦予方法的默認行為。但是在interface的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委托,但是這會 增加一些復雜性,有時會造成很大的麻煩。

    在抽象類中不能定義默認行為還存在另一個比較嚴重的問題,那就是可能會造成維護上的麻煩。因為如果后來想修改類的界面(一般通過abstract class或者interface來表示)以適應新的情況(比如,添加新的方法或者給已用的方法中添加新的參數)時,就會非常的麻煩,可能要花費很多的時間(對于派生類很多的情況,尤為如此)。但是如果界面是通過abstract class來實現的,那么可能就只需要修改定義在abstract class中的默認行為就可以了。

    同樣,如果不能在抽象類中定義默認行為,就會導致同樣的方法實現出現在該抽象類的每一個派生類中,違反了"one rule,one place"原則,造成代碼重復,同樣不利于以后的維護。因此,在abstract class和interface間進行選擇時要非常的小心。


    從設計理念層面看abstract class和interface

    上面主要從語法定義和編程的角度論述了abstract class和interface的區別,這些層面的區別是比較低層次的、非本質的。本小節將從另一個層面:abstract class和interface所反映出的設計理念,來分析一下二者的區別。作者認為,從這個層面進行分析才能理解二者概念的本質所在。

    前面已經提到過,abstarct class在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is a"關系,即父類和派生類在概念本質上應該是相同的(參考文獻〔3〕中有關于"is a"關系的大篇幅深入的論述,有興趣的讀者可以參考)。對于interface 來說則不然,并不要求interface的實現者和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約而已。為了使論述便于理解,下面將通過一個簡單的實例進行說明。

    考慮這樣一個例子,假設在我們的問題領域中有一個關于Door的抽象概念,該Door具有執行兩個動作open和close,此時我們可以通過abstract class或者interface來定義一個表示該抽象概念的類型,定義方式分別如下所示:

    使用abstract class方式定義Door:

    abstract class Door {
    ????????abstract void open();
    ????????abstract void close();
    }


    使用interface方式定義Door:


    interface Door {
    ????????void open();
    ????????void close();
    }


    其他具體的Door類型可以extends使用abstract class方式定義的Door或者implements使用interface方式定義的Door。看起來好像使用abstract class和interface沒有大的區別。

    如果現在要求Door還要具有報警的功能。我們該如何設計針對該例子的類結構呢(在本例中,主要是為了展示abstract class和interface反映在設計理念上的區別,其他方面無關的問題都做了簡化或者忽略)?下面將羅列出可能的解決方案,并從設計理念層面對這些不同的方案進行分析。

    解決方案一:

    簡單的在Door的定義中增加一個alarm方法,如下:

    abstract class Door {
    ????????abstract void open();
    ????????abstract void close();
    ????????abstract void alarm();
    }


    或者

    interface Door {
    ????????void open();
    ????????void close();
    ????????void alarm();
    }


    那么具有報警功能的AlarmDoor的定義方式如下:

    class AlarmDoor extends Door {
    ????????void open() { … }
    ????????void close() { … }
    ????????void alarm() { … }
    }


    或者

    class AlarmDoor implements Door {
    ????????void open() { … }
    ????????void close() { … }
    ????????void alarm() { … }


    這種方法違反了面向對象設計中的一個核心原則ISP(Interface Segregation Priciple),在Door的定義中把Door概念本身固有的行為方法和另外一個概念"報警器"的行為方法混在了一起。這樣引起的一個問題是那些僅僅依賴于Door這個概念的模塊會因為"報警器"這個概念的改變(比如:修改alarm方法的參數)而改變,反之依然。

    解決方案二:

    既然open、close和alarm屬于兩個不同的概念,根據ISP原則應該把它們分別定義在代表這兩個概念的抽象類中。定義方式有:這兩個概念都使用abstract class方式定義;兩個概念都使用interface方式定義;一個概念使用abstract class方式定義,另一個概念使用interface方式定義。

    顯然,由于Java語言不支持多重繼承,所以兩個概念都使用abstract class方式定義是不可行的。后面兩種方式都是可行的,但是對于它們的選擇卻反映出對于問題領域中的概念本質的理解、對于設計意圖的反映是否正確、合理。我們一一來分析、說明。

    如果兩個概念都使用interface方式來定義,那么就反映出兩個問題:1、我們可能沒有理解清楚問題領域,AlarmDoor在概念本質上到底是Door還是報警器?2、如果我們對于問題領域的理解沒有問題,比如:我們通過對于問題領域的分析發現AlarmDoor在概念本質上和Door是一致的,那么我們在實現時就沒有能夠正確的揭示我們的設計意圖,因為在這兩個概念的定義上(均使用interface方式定義)反映不出上述含義。

    如果我們對于問題領域的理解是:AlarmDoor在概念本質上是Door,同時它有具有報警的功能。我們該如何來設計、實現來明確的反映出我們的意思呢?前面已經說過,abstract class在Java語言中表示一種繼承關系,而繼承關系在本質上是"is a"關系。所以對于Door這個概念,我們應該使用abstarct class方式來定義。另外,AlarmDoor又具有報警功能,說明它又能夠完成報警概念中定義的行為,所以報警概念可以通過interface方式定義。如下所示:

    abstract class Door {
    ????????abstract void open();
    ????????abstract void close();
    }
    interface Alarm {
    ????????void alarm();
    }
    class AlarmDoor extends Door implements Alarm {
    ????????void open() { … }
    ????????void close() { … }
    ?? ????????void alarm() { … }
    }


    這種實現方式基本上能夠明確的反映出我們對于問題領域的理解,正確的揭示我們的設計意圖。其實abstract class表示的是"is a"關系,interface表示的是"like a"關系,大家在選擇時可以作為一個依據,當然這是建立在對問題領域的理解上的,比如:如果我們認為AlarmDoor在概念本質上是報警器,同時又具有Door的功能,那么上述的定義方式就要反過來了。



    結論

    abstract class和interface是Java語言中的兩種定義抽象類的方式,它們之間有很大的相似性。但是對于它們的選擇卻又往往反映出對于問題領域中的概念本質的理解、對于設計意圖的反映是否正確、合理,因為它們表現了概念間的不同的關系(雖然都能夠實現需求的功能)。這其實也是語言的一種的慣用法,希望讀者朋友能夠細細體會。
    posted @ 2006-07-15 20:59 square 閱讀(389) | 評論 (0)編輯 收藏

    Oracle公司宣稱在Linux下安裝Oracle9i數據庫至少要有512MB的內存和至少1GB或者兩倍????
    內存大小的交換空間,對于系統內存大于2GB的服務器,交換空間可以介于2GB—4GB之間。????

    如果是為了在一臺僅有256M內存的普通PC機上試用Oracle9i,在分配了1GB左右的交換空間的情況下,也可以正常運行Oracle數????
    據庫。????
    要檢查內存空間,登錄進入Linux,在命令行方式(bash環境)下執行如下命令:????
    grep MemTotal /proc/meminfo????
    要檢查交換空間,在命令行下執行如下命令:????
    grep SwapTotal /proc/meminfo

    1.解壓.cpio文件
    ? #cpio -idvm < lnx_920_disk1.cpio
    ? #cpio -idvm < lnx_920_disk2.cpio
    ? #cpio -idvm < lnx_920_disk3.cpio
    ? 在當前目錄下生成Disk1和Disk2,Disk3三個目錄.
    ??
    2.打補丁
    ? unzip oraclerpm.zip
    ? #rpm -ivh *.i586.rpm --nodeps --force

    3.建立用戶和組
    ? #groupadd dba
    ? #mkdir /opt/OracleHome
    ? #adduser -u 499 -d /opt/OracleHome/ -g dba oracle
    ? 注:-u 后可以是1-500(系統用戶) -g 添加到私有組dba中
    ? #chown oracle.dba /opt/OracleHome/
    ? #mkdir /opt/OracleHome/Ora9i
    ? #chown oracle.dba /opt/OracleHome/Ora9i
    ? #touch /etc/rac_on
    ? #mkdir /opt/tmp
    ? #chmod 1777 /opt/tmp
    ? #cp oracle.bashrc /opt/OraclHome/.bashrc

    4.linux系統優化
    ? #dd if=/dev/zero of=/opt/tmpswap bs=1k count=1024000
    ? #chmod 600 /opt/tmpswap
    ? #mkswap /opt/tmpswap
    ? #swapon -v /opt/tmpswap
    ? #sysctl -w kernel.sem="250 32000 100 128"
    ? #sysctl -w kernel.shmmax=`expr 512 \* 1024 \* 1024`
    ? shmmax 注釋:決定了Oracle或操做系統最多可以使用的內存數目.
    ? #echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
    ? #echo "kernel.shmmax=`expr 512 \* 1024 \* 1024`" >> /etc/sysctl.conf
    ? 注:上兩行命令執行后請查看/etc/sysctl.conf的變化.

    ? #echo 65536 >/proc/sys/fs/file-max
    ? #ulimit -n 65536
    ? #ulimit -u 16384
    ? 注:上三行命令是系統優化,建議也添加到/etc/rc.local文件中,每次啟動系統自動優化

    5.安裝
    ? #xhost localhost
    ? #su - oracle
    ? #cd /opt/source/Disk1
    ? #./runInstaller

    以下是幾點注意事項

    選擇software only
    然后用命令dbca創建數據庫

    1.安裝時字體問題的解決:
    ?? #unset LANG?
    ?? 如果執行上述指令不行的話再修改/root/.i18n和/etc/sysconfig/i18n
    ?? #vi /root/.i18n??
    ???? 注:root用戶的語言環境,注釋掉所有項后添加一行LANG="en_US"
    ?? #vi /etc/sysconfig/i18n??
    ???? 注:系統中新增加用戶的語言環境(每增加一個用戶把它拷貝到其宿主目錄生成.i18n)

    2.安裝過程中的報錯:
    ?? 前幾個按報錯信息的指示做,
    ?? 只有最后一個/opt/OraclHome/Oracle9i/ctx/lib/下某一文件錯,應修改
    ?? /opt/OraclHome/Oracle9i/ctx/lib/env_ctx.mk文件
    ?? 在INSO_LINK= 這一行添加一條記錄 $(LDLIBFLAG)dl

    3.oracle用戶SHELL有問題
    ? #userdel oracle
    ? #adduser -u 499 -d /opt/OracleHome/ -g dba oracle

    小秘籍:

    ?#hdparm -t /dev/hda 查看硬盤讀寫速度,如只有2M左右,則執行
    ?#hdparm -d 1 /dev/hda 開啟DMA功能,可把它添加到/etc/rc.local文件中.

    posted @ 2006-03-31 22:39 square 閱讀(440) | 評論 (0)編輯 收藏


    public class TestDate {

    ?

    ?????? public String yesteday() {

    ??????????????
    //?????????? 當前時間
    ???????????????Calendar cal = Calendar.getInstance();

    ???????????//??日期的DATE減去10??就是往后推10 天 同理 +10 就是往后推十天
    ?????????????
    cal.add(Calendar.DATE, -10);

    ?

    ????????????? SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");

    ?????????????

    ????????????? String str = sf.format(cal.getTime());

    ?????????????

    ????????????? System.out.print(str);

    ????????????? return str;

    ?????? }

    ?

    ?????? public static void main(String args[]) {

    ????????????? new TestDate().yesteday();

    ?????? }

    ?

    }



    記的用DATE 類的時候要先得到當前的年,月,日,再將日數減或加.再new Date(year,month,day);
    有了?Calendar 感覺方便多了.

    posted @ 2006-03-18 07:52 square 閱讀(2755) | 評論 (1)編輯 收藏
         摘要:   Derby 是一種功能完備的關系數據庫,具有能與大型企業數據庫相抗衡的能力。不要讓它極小的規模(2 MB)和成本(0 美元)給騙了。 Derby 是純事務型的,當和 J2EE 服務器的 JTA 事務管理器一起使用時,可以參與全局(分布式)事務。 Derby 數據庫系統(二進制文件和數據庫)可以復制到任何帶有 J2SE JVM 的平臺,并且無需重新編譯或作其他修改就能運行。 ...  閱讀全文
    posted @ 2006-03-06 23:01 square 閱讀(3917) | 評論 (1)編輯 收藏
    關于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=web@www.wuset.com log4j.appender.MAIL.SMTPHost=www.wusetu.com
    log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.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

    #自定義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 = corlin@cybercorlin.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 @ 2006-03-04 21:24 square 閱讀(468) | 評論 (0)編輯 收藏
    僅列出標題  下一頁
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章檔案

    收藏夾

    IBM developerworks JAVA

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲高清视频免费| 免费成人在线电影| 成人奭片免费观看| 亚洲三级电影网址| 久久免费精品一区二区| 亚洲人成精品久久久久| 一个人看的www在线免费视频 | 日韩在线永久免费播放| 亚洲午夜福利在线观看| A国产一区二区免费入口| 国产精品亚洲综合一区| 成在线人直播免费视频| 亚洲乳大丰满中文字幕| 在线观看人成视频免费无遮挡| 国产亚洲精品a在线观看 | 亚洲精品在线免费看| 亚洲欧洲日产国码www| 波多野结衣在线免费视频| 一本色道久久88—综合亚洲精品| 黄页网站在线看免费| 久久亚洲色WWW成人欧美| 亚洲国产中文字幕在线观看| 亚洲免费视频一区二区三区| 亚洲无线观看国产精品| 国产曰批免费视频播放免费s| 亚洲国产乱码最新视频| 亚洲精品老司机在线观看| 精品成人免费自拍视频| 亚洲色偷精品一区二区三区| 亚洲精品无码av天堂| 中国人xxxxx69免费视频| 国产亚洲精品免费| 7777久久亚洲中文字幕蜜桃| 国产精品视频免费一区二区三区| 一区免费在线观看| 亚洲人成网站在线观看播放动漫| 男人的天堂亚洲一区二区三区 | 久久er国产精品免费观看8| 亚洲精品国产成人中文| 又爽又黄无遮挡高清免费视频 | 777亚洲精品乱码久久久久久|