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

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

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

    JAVA學習點點滴滴

    用開放的腦子去闖蕩;用開闊的視野去拼搏;用平和的身心去磨練;用美好的理想去追求!

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      18 隨筆 :: 1 文章 :: 2 評論 :: 0 Trackbacks

    #

    說明:復制表(只復制結構,源表名:a  新表名:b)
    SQL:  select  *  into  b  from  a  where  1<>1
    說明:拷貝表(拷貝數據,源表名:a  目標表名:b)
    SQL:  insert  into  b(a,  b,  c)  select  d,e,f  from  b;
    說明:顯示文章、提交人和最后回復時間
    SQL:  select  a.title,a.username,b.adddate  from  table  a,(select  max(adddate)  adddate  from  table  where  table.title=a.title)  b
    說明:外連接查詢(表名1:a  表名2:b)
    SQL:  select  a.a,  a.b,  a.c,  b.c,  b.d,  b.f  from  a  LEFT  OUT  JOIN  b  ON  a.a  =  b.c
    說明:日程安排提前五分鐘提醒
    SQL:    select  *  from  日程安排  where  datediff('minute',f開始時間,getdate())>5
    說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
    SQL:    
    delete  from  info  where  not  exists  (  select  *  from  infobz  where  info.infid=infobz.infid  )  
    說明:--
    SQL:    
    SELECT  A.NUM,  A.NAME,  B.UPD_DATE,  B.PREV_UPD_DATE
       FROM  TABLE1,  
           (SELECT  X.NUM,  X.UPD_DATE,  Y.UPD_DATE  PREV_UPD_DATE
                   FROM  (SELECT  NUM,  UPD_DATE,  INBOUND_QTY,  STOCK_ONHAND
                                   FROM  TABLE2
                               WHERE  TO_CHAR(UPD_DATE,'YYYY/MM')  =  TO_CHAR(SYSDATE,  'YYYY/MM'))  X,  
                           (SELECT  NUM,  UPD_DATE,  STOCK_ONHAND
                                   FROM  TABLE2
                               WHERE  TO_CHAR(UPD_DATE,'YYYY/MM')  =  
                                           TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,  'YYYY/MM')  ||  '/01','YYYY/MM/DD')  -  1,  'YYYY/MM')  )  Y,  
                   WHERE  X.NUM  =  Y.NUM  (+)
                       AND  X.INBOUND_QTY  +  NVL(Y.STOCK_ONHAND,0)  <>  X.STOCK_ONHAND  )  B
    WHERE  A.NUM  =  B.NUM
    說明:--
    SQL:    
    select  *  from  studentinfo  where  not  exists(select  *  from  student  where  studentinfo.id=student.id)  and  系名稱='"&strdepartmentname&"'  and  專業名稱='"&strprofessionname&"'  order  by  性別,生源地,高考總成績
    說明:
    從數據庫中去一年的各單位電話費統計(電話費定額賀電化肥清單兩個表來源)
    SQL:  
    SELECT  a.userper,  a.tel,  a.standfee,  TO_CHAR(a.telfeedate,  'yyyy')  AS  telyear,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '01',  a.factration))  AS  JAN,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '02',  a.factration))  AS  FRI,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '03',  a.factration))  AS  MAR,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '04',  a.factration))  AS  APR,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '05',  a.factration))  AS  MAY,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '06',  a.factration))  AS  JUE,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '07',  a.factration))  AS  JUL,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '08',  a.factration))  AS  AGU,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '09',  a.factration))  AS  SEP,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '10',  a.factration))  AS  OCT,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '11',  a.factration))  AS  NOV,
               SUM(decode(TO_CHAR(a.telfeedate,  'mm'),  '12',  a.factration))  AS  DEC
    FROM  (SELECT  a.userper,  a.tel,  a.standfee,  b.telfeedate,  b.factration
                   FROM  TELFEESTAND  a,  TELFEE  b
                   WHERE  a.tel  =  b.telfax)  a
    GROUP  BY  a.userper,  a.tel,  a.standfee,  TO_CHAR(a.telfeedate,  'yyyy')
    說明:四表聯查問題:
    SQL:  select  *  from  a  left  inner  join  b  on  a.a=b.b  right  inner  join  c  on  a.a=c.c    inner  join  d  on  a.a=d.d  where  .....

    說明:得到表中最小的未使用的ID號
    SQL:
    SELECT  (CASE  WHEN  EXISTS(SELECT  *  FROM  Handle  b  WHERE  b.HandleID  =  1)  THEN  MIN(HandleID)  +  1  ELSE  1  END)  as  HandleID
    FROM    Handle
    WHERE  NOT  HandleID  IN  (SELECT  a.HandleID  -  1  FROM  Handle  a)
    posted @ 2006-02-22 22:04 海思 閱讀(185) | 評論 (0)編輯 收藏

    0.  精彩網址
    http://www.cfanclub.net/fav.htm
    1.vc++技術內幕第四版  (潘愛民)
    ftp://210.32.157.56/課件/c++primer/vc++技術內幕IV(潘愛民).rar
    2.C++經典對話系列
    中文:http://www.jka77.com/book/cvst_cn.chm

    3.MFC  Windows  程序設計(第二版)
    英文版:http://www.jka77.com/book/progmfc2.chm
    中文版:暫無,制作中...
    4.Effective  C++中文版:
    http://dlb.pchome.net/development/reference/effectiveCplus.zip
    5.More  Effective  C++中文版-zhc譯
    http://cable.pchome.net/development/reference/MEC0410.zip

    6.More  Effective  C++中文版-候捷譯
    http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

    7.Essential  C++中文版(全)-候捷譯
    http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

    8.深入淺出MFC  2/e
    http://218.30.21.125:8084/ebook/programme/mfc2e.zip

    9.代碼大全中文版
    http://www.delphidevelopers.com/  ...  /CodeComplet110.zip

    11.C++經典對話系列
    中文:http://www.jka77.com/book/cvst_cn.chm

    12.MFC  Windows  程序設計(第二版)
    英文版:http://www.jka77.com/book/progmfc2.chm
    中文版:暫無,制作中...

    13.數據結構  C++  語言描述(中文版)
    http://www.code-labs.com/manual/c_c015.zip

    14.Java編程思想中文版
    ftp://202.118.72.12/pub/doc-book/Java/Java編程思想.zip

    15.C++標準庫英文版
    ftp://166.111.64.4/incoming/新文件夾/f/The%20C++%20Standard%20Library(with%20TOC).pdf

    16.Windows核心編程  
    英文:http://www.fmdstudio.net/book/prgapps4.zip

    17.TCP-IP詳解卷1:協議
    ftp://202.204.4.161/學習資料/TCPIP/TCP-IP詳解卷1:協議.pdf

    18.TCP-IP詳解卷2:實現
    ftp://202.204.4.161/學習資料/TCPIP/TCP-IP詳解卷3:TCP事務協議,HTTP,NNTP.pdf

    19.TCP-IP詳解卷3:TCP事務協議
    ftp://202.204.4.161/學習資料/TCPIP/TCP-IP詳解卷2:實現.pdf

    20.實用算法的分析與程序設計
    ftp://202.204.8.10/[4]%20編程資源/[%20書籍資料%20]/[算法與數據結構]/實用算法的分析與程序設計.rar

    21.vc++技術內幕第四版  (潘愛民)
    ftp://210.32.157.56/課件/c++primer/vc++技術內幕IV(潘愛民).rar

    22.C++  Primer英文版:
    http://computerstep.w18.net/C/C++%20Primer.zip

    23.Effective  C++中文版:
    http://dlb.pchome.net/development/reference/effectiveCplus.zip

    24.More  Effective  C++中文版-zhc譯
    http://cable.pchome.net/development/reference/MEC0410.zip

    25.More  Effective  C++中文版-候捷譯
    http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

    26.Essential  C++中文版(全)-候捷譯
    http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

    27.Programming  Windows程式開發設計指南-Petzoldi著  余孟學  譯
    中文版:http://www.nethovel.com/resources/ProgrammingWindows_tw.chm
    英文版:http://www.nethovel.com/resources/Petzoldi.chm

    28.WinAsm32匯編教程-  Iczelion
    http://www.nethovel.com/resources/winasm.chm

    29.Windows  95  程序設計指南-候捷譯
    http://www.nethovel.com/resources/win95adg.zip

    30.Thinking  in  C++  2nd  Edition(C++編程思想)
    英文版:http://www.nethovel.com/resources/ThinkinginC++.zip
    中文版:http://www.dingbing.com/book/thinkc.zip

    31.人月神話-中文版
    http://www.goodassister.com/book/rysh.pdf

    32.The  C++  Programming  Language英文
    http://computerstep.w18.net/C/Th  ...  ming%20Language.rar

    33.VC技術內幕第五版  http://www.helpwork.com/downdata  ...  k/vc++2/invcpp5.chm

    34.com技術內幕
    http://www.helpwork.com/book/html/user/download.asp?id=1123

    35.com+技術內幕
    http://www.helpwork.com/book/html/user/download.asp?id=952

    36.新編  Windows  API參考大全
    http://www.4046.com/nnsrc/down/WindowsAPIdq.rar

    37.The  C  programming  Language  //  By  Brian  W.  Kernighan  and  Dennis  M.  Ritchie
    下載地址:http://www.jka77.com/book/The_C_programmin.chm

    38.C語言編程手冊
    下載地址:http://www.jka77.com/book/CL.chm

    39.Delphi  7高效數據庫程序設計  
    By  李維
    下載地址:http://www.codestudy.net/book/download.asp?id=1163&sort=5

    40.Windows網絡編程(第2版)
    By  Anthony  Jones,Jim  Ohlund  清華大學出版社
    下載地址:英文版:http://www.guxiang.com/epubcn/re  ...  rog_for_win_2nd.zip

    41.Windows2000編程技術內幕
    By  Mickey  Williams  機械工業出版社
    下載地址:ftp://ftp.frontfree.net/Pub/Books/C&C++/VC/Windows2000編程技術內幕.rar

    42.數據倉庫
    By  W.H.Inmon  清華大學出版社
    下載地址1:http://tips.9hao.com/vvbksd/20011120/數據倉庫.zip
    下載地址2:  ftp://ftp.math.nankai.edu.cn/Ebo  ...  %BE%DD%B2%D6%BF%E2/

    43.編碼的奧秘
    By  Charles  Petzold  機械工業出版社
    下載地址:ftp://ftp.math.nankai.edu.cn/Ebo  ...  %B5%C4%B0%C2%C3%D8/

    44.編譯原理及實踐
    By  Louden,  K.C  機械工業出版社
    下載地址:ftp://ftp.math.nankai.edu.cn/Ebo  ...  %BC%B0%CA%B5%BC%F9/

    45.Inside  C++  Object  Model(深度探索C++對象模型)
    By  Lippman  候捷譯
    下載地址:http://www.jka77.com/book/inside-the-cpp-object-model.pdf

    46.C++標準程序庫
    By  Josuttis  
    下載地址1:http://www.codestudy.net/book/download.asp?id=1205&sort=5
    下載地址2:  ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The  Cpp  Standard  Library.pdf

    47.STL源碼剖析
    By  候捷
    下載地址:ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL源碼剖析--侯捷.pdf

    48.C++批判(第三版)  -看看C++的壞話!
    By  I  don't  know
    下載地址:http://www.jka77.com/book/CPPPP.pdf

    49.程序設計實踐
    下載地址:ftp://ftp.math.nankai.edu.cn/Ebo  ...  %BC%C6%CA%B5%BC%F9/

    50.c++沉思錄
    By  Andrew  Koenig  Barbara  Moo  人民郵電出版社
    下載地址:http://www.codestudy.net/book/download.asp?id=1261&sort=5

    51.C++Builder4技術內幕  (這本書俺不知道好不好:-))
    By  I  don't  Know
    下載地址:http://www.codestudy.net/book/download.asp?id=1254&sort=5

    52.下面兩本書一般大家硬盤里都有的吧,而且很老了,但是為了全面,就提上來吧
    (1)Windows  95  程式設計指南  -  候捷
    下載地址:http://jjhou.csdn.net/win95-a-developers-guide.pdf
    (2)Windows  95  系統程式設計大奧秘  -  候捷
    下載地址:http://jjhou.csdn.net/windows95-system-programming-secrets.pdf

    53.  中國大百科全書·數學
    下載地址:ftp://ftp.math.nankai.edu.cn/Ebook/中國大百科全書/中國大百科全書·數學.pdf

    54、4.0M  Bjarne  Stroustrup  -  The  C++  Programming  Language
    http://www.u-n-f.com/books/archi  ...  g%20Language.tar.gz

    55、1.0M  Richard  Stevens  -  TCP-IP  Illustrated
    http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz

    56、4.5M  Randall  Hyde  -  Art  Of  Assembly
    http://www.u-n-f.com/books/archi  ...  f%20Assembly.tar.gz

    57、2.1M  M.  Abrash  -  Zen  of  Graphics  Programming
    http://www.u-n-f.com/books/archi  ...  s%20Programming.zip

    58、249k  Kernighan  and  Ritche  -  The  C  Programming  Language
    http://www.u-n-f.com/books/archi  ...  ming%20Language.zip

    59、3.3M  Bruce  Schneier  -  Applied  Cryptography
    http://www.u-n-f.com/books/archi  ...  %20Cryptography.zip

    60、PHP4_Grundlagen_und_Profiwissen
    http://www.u-n-f.com/books/archi  ...  und_Profiwissen.pdf

    61.《C++  Builder高級編程技術》  
    http://www.dingbing.com/book/builder.zip

    62.《VC++  6.0  TLR  模板庫參考手冊》
    http://www.easysea.com/diannao/download/prog/c/mbkc.zip

    63.《BORLAND  C++  BUILDER  實用培訓教程》  
    http://202.101.232.120/book/open  ...  name=BC98_CB526.zip

    64.《Delphi高級開發指南》  
    http://www.pcbookcn.com/s10899bo  ...  phi_gjkfzn_for3.rar

    65.《新編  Windows  API參考大全》  
    ftp://book:book@down.pcbookcn.com/pro/delphi/新編Windows_API_參考大全.rar

    66.《Delphi深度歷險-附書源碼》  
    http://www.pcbookcn.com/s10899bo  ...  elphi_sdlx_code.rar

    67.《Delphi  7高效數據庫程序設計》
    ftp://book:book@down.pcbookcn.com/pro/delphi/李維的新書《Delphi7高效數據庫程序設計》.rar

    68.《Delphi7開發指南》
    ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7開發指南.rar

    69.《Delphi6集成開發環境》  
    ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6集成開發環境.rar

    70.《Delphi6數據庫編程》  
    ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6數據庫編程.rar

    72.《Delphi5.xADO_MTS_COM+高級程序設計篇》
    ftp://book:book@down.pcbookcn.co  ...  lphi5.xADO_MTS_COM+高級程序設計篇.rar

    73.《VISUAL  BASIC  編程標準》  
    http://www.dingbing.com/book/vb.zip

    74.《Visual  Basic6.0中文版程序員指南》  
    http://www.easysea.com/diannao/download/prog/vb/zwbc.zip

    75.《Visual  Basic  6.0  控件參考手冊》  
    http://www.easysea.com/diannao/download/prog/vb/kjck.zip

    76.《Visual  Basic  6.0中文版語言參考手冊》  
    http://www.easysea.com/diannao/download/prog/vb/zwby.zip

    77.《Visual  Basic  6.0  開發寶典》  
    http://www.easysea.com/diannao/download/prog/vb/kfbd.zip

    78.《Visual  Basic  6.0  實例教程》  
    http://www.easysea.com/diannao/download/prog/vb/sljc.zip

    79.《VB  6.0  中文版實用參考手冊》  
    http://www.easysea.com/diannao/download/prog/vb/syck.zip

    80.《Visual  Basic  6開發人員指南》  
    http://www.easysea.com/diannao/download/prog/vb/kfzn.zip

    81.《VB  和  SQL  Server  編程指南(第五版)》  
    http://www.easysea.com/diannao/download/prog/vb/bczn.zip

    82.《Jbuilder  5  中文幫助》  
    http://www.pdown.net/download.asp?downid=2&id=991

    83.《JBuilder開發人員指南》  
    http://youth.dlmu.edu.cn/book/list_down.php?bkid=224

    84.《Win32的Internet函數說明》  
    檔案大小:  245248K  
    http://www.easysea.com/diannao/download/prog/windows/win32int.zip

    85.《Visual  InterDev  從入門到精通》  
    http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl

    86.《Visual  InterDev  6.0  Web  參考手冊  》  
    http://www.easysea.com/diannao/download/prog/interdev/jsck.zip

    87.《Visual  InterDev  6.0  Guide  程序員》
    http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip

    88.《javascript  程序開發手冊》  
    http://www.cty99.com/Templet/bookdownmore.asp?booktype=script#

    89.《JAVA  大全》  
    http://www.easysea.com/diannao/download/prog/java/cxkf.zip

    90.《Visual  J++  6.0  WFC  類庫參考手冊》  
    http://www.easysea.com/diannao/download/prog/java/lkck.zip

    91.《Java聯想(中文)》  
    http://www.easysea.com/diannao/download/prog/java/lkck.zip

    92.《Oracle  8  實用大全》
    http://www.easysea.com/diannao/download/prog/oracle/sydq.zip

    93.《Microsoft  SQL  Server  管理員手冊》  
    http://www.easysea.com/diannao/download/prog/sql/glys.zip

    94.《掌握ACCESS開發》  
    http://www.easysea.com/diannao/download/prog/sql/glys.zip

    95.《Oracle  Performance  Tuning  and  Optimization》  
    http://www.oradb.net/book/oracle_pt.zip

    96.《Oracle  ProC  程序設計》  
    http://www.oradb.net/book/oracleproc.zip

    97.《Oracle8初學者指南》  
    http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip

    98.《RED  HAT  LINUX  6大全》  
    http://www.dingbing.com/book/redhatall.zip

    99.《RED  HAT  LINUX  6管理工具》  
    http://www.dingbing.com/book/redhatman.zip

    100.《VC++高級編程》  
    http://www.easysea.com/diannao/download/prog/c/vcgj.zip
    posted @ 2006-02-22 22:03 海思 閱讀(338) | 評論 (0)編輯 收藏

    本文章對:
    發送普通郵件,接受普通郵件
    發送帶有附件的郵件,接收帶有附件的郵件
    發送html形式的郵件,接受html形式的郵件
    [b[發送帶有圖片的郵件等做了一個總結。
    程序代碼:  
    程序代碼:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import com.borland.jbcl.layout.*;
    import javax.mail.*;
    import java.util.*;
    import javax.mail.internet.*;
    import java.io.*;
    import javax.activation.*;


    public String host="smtp.163.com";
    public String username="abcdefg";
    public String password="abcdefg";
    public String mail_head_name="this is head of this mail";
    public String mail_head_value="this is head of this mail";
    public String mail_to="xyz@163.com";
    public String mail_from="abcdefg@163.com";
    public String mail_subject="this is the subject of this test mail";
    public String mail_body="this is the mail_body of this test mail";
    //此段代碼用來發送普通電子郵件
    void jButton1_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = new Properties();//獲取系統環境
    Authenticator auth = new Email_Autherticator();//進行郵件服務器用戶認證

    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth);
    //設置session,和郵件服務器進行通訊。
    MimeMessage message = new MimeMessage(session);
    message.setContent("Hello","text/plain");//設置郵件格式
    message.setSubject(mail_subject);//設置郵件主題
    message.setText(mail_body);//設置郵件正文
    message.setHeader(mail_head_name,mail_head_value);//設置郵件標題
    message.setSentDate(new Date());//設置郵件發送日期

    Address address = new InternetAddress(mail_from,"sunxiaoming");
    message.setFrom(address); //設置郵件發送者的地址

    //如果要對郵件發送者進行多個參數的設置,可以用以下語句
    // Address address[] = {new InternetAddress("sunxm@oaklet.co.jp","sunxmatoaklet"),new InternetAddress("firstsxm@hotmail.com","sunxmathotmail")};
    // message.addFrom(address);

    Address toAddress = new InternetAddress(mail_to);//設置郵件接收方的地址
    message.addRecipient(Message.RecipientType.TO,toAddress);
    // Address ccAddress = new InternetAddress("firstsxm@hotmail.com");//設置郵件抄送者的地址
    // message.addRecipient(Message.RecipientType.CC,ccAddress);


    Transport.send(message);//發送郵件
    /* // to get a specific instance from the session for your protocol.pass along the username and password
    // (blank if unnecessary).send the message,and close the connection;
    message.saveChanges();
    Transport transport = session.getTransport("smtp");
    transport.connect(host,username,password);
    transport.sendMessage(message,message.getAllRecipients());
    transport.close();
    */

    System.out.println("send ok!");
    }
    catch(Exception ex)
    {
    System.out.println("faild"+ex);
    }
    }

    //此段代碼用來進行服務器對用戶的認證
    public class Email_Autherticator extends Authenticator
    {
    public Email_Autherticator()
    {
    super();
    }
    public PasswordAuthentication getPasswordAuthentication()
    {
    return new PasswordAuthentication(username,password);
    }
    }
    //該程序為接收郵件
    void jButton2_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = System.getProperties(); //獲取系統變量
    Authenticator auth = new Email_Autherticator();
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth); //建立session
    Store store = session.getStore("pop3");
    store.connect(host,username,password);

    //After connecting to the Store,you can get a Folder,which must be opened before you can read messages from it:
    Folder folder = store.getFolder("INBOX");//連接到Store后,取得一個文件夾,一般默認的是INDEX
    folder.open(Folder.READ_WRITE);//READ_ONLY為打開方式
    Message message[] = folder.getMessages();//從文件夾獲取郵件信息

    //可以用兩種方式去獲得郵件信息,getContent()用來獲得郵件的主體信息。而WriteTo()可以用來獲得郵件的全部信息,包括頭部信息
    // System.out.println(((MimeMessage)message).getContent());
    for (int i=0,n=message.length;i
    {

    String out_from_person = ((InternetAddress)message.getFrom()[0]).getPersonal();
    String out_from_address = ((InternetAddress)message.getFrom()[0]).getAddress();
    System.out.println("From:"+out_from_person+"t");
    System.out.println("Address:"+out_from_address+"t");

    String out_subject = message.getSubject();
    System.out.println("Subject:"+out_subject+"t");

    //以下代碼用來獲得郵件的正文信息
    Part messagePart = message;
    Object out_content = messagePart.getContent();
    if (out_content instanceof Multipart)
    {
    messagePart = ((Multipart)out_content).getBodyPart(0);
    System.out.println("[ Multipart Message ]");
    }
    String out_content_type = messagePart.getContentType();
    System.out.println("CONTENT:"+out_content_type);

    if (out_content_type.startsWith("text/plain") | | out_content_type.startsWith("text/html"))
    {
    InputStream ipstm = messagePart.getInputStream();
    BufferedReader bufreader = new BufferedReader(new InputStreamReader(ipstm));
    String thisLine = bufreader.readLine();
    while (thisLine != null)
    {
    System.out.println("thisLine: "+thisLine);
    thisLine = bufreader.readLine();
    }
    }
    System.out.println("------------------------------------------------------------");
    message.setFlag(Flags.Flag.DELETED,true);//最后刪除服務器端的郵件
    }
    //DELETED,ANSWERED,DRAFT,FLAGGED,RECENT,SEEN,USER
    folder.close(true);//true的話,徹底刪除已經標記為DELETE的郵件,如果為false的話,就不刪除
    store.close();//關閉
    }
    catch(Exception ej2)
    {
    System.out.println(ej2);
    }
    }

    void jButton4_actionPerformed(ActionEvent e) {
    try
    {//該程序為回復郵件
    Properties props = System.getProperties(); //獲取系統變量
    Authenticator auth = new Email_Autherticator(); //取得穃uFFFD衿魅現?
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth); //建立session
    Store store = session.getStore("pop3");
    store.connect(host,username,password);

    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_WRITE);
    Message message[] = folder.getMessages();

    for (int i=0,n=message.length;i
    {
    // String out_from_person = ((InternetAddress)message.getFrom()[0]).getPersonal();//獲取郵件發信人的署名

    String out_from_address = ((InternetAddress)message.getFrom()[0]).getAddress();
    System.out.println(out_from_address);

    Message forward = new MimeMessage(session);
    forward.setSubject("Fwd:"+message.getSubject());
    forward.setFrom(new InternetAddress(mail_to));
    forward.addRecipient(Message.RecipientType.TO,new InternetAddress(out_from_address));

    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText("Here you go with the original message:nn");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    messageBodyPart = new MimeBodyPart();
    messageBodyPart.setDataHandler(message.getDataHandler());

    multipart.addBodyPart(messageBodyPart);
    forward.setContent(multipart);

    Transport.send(forward);
    message.setFlag(Flags.Flag.DELETED,true);//DELETED,ANSWERED,DRAFT,FLAGGED,RECENT,SEEN,USER
    }
    folder.close(true);
    store.close();//關閉
    }
    catch(Exception ej2)
    {
    System.out.println(ej2);
    }

    }

    void jButton5_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = new Properties();
    Authenticator auth = new Email_Autherticator();

    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth);
    MimeMessage message = new MimeMessage(session);
    message.setContent("Hello","text/plain");
    message.setSubject(mail_subject);
    message.setText(mail_body);
    message.setHeader(mail_head_name,mail_head_value);
    message.setSentDate(new Date());
    message.setFrom(new InternetAddress(mail_from,"sunxiaoming")); //to signal man 
    //原理:可以將郵件看成有多個部分組成的,如正文是一個部分,附件也是一個部分,所以用BodyPart來設置郵件的格式
    程序代碼:  
    程序代碼:
    message.addRecipient(Message.RecipientType.TO,new InternetAddress(mail_to));
    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText("Pardon Ideas");
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource("./20020423/test.zip");//此處設置郵件的附件
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName("test.zip");
    multipart.addBodyPart(messageBodyPart);
    message.setContent(multipart);
    Transport.send(message);
    System.out.println("send ok!");
    }
    catch(Exception ex)
    {
    System.out.println("faild"+ex);
    }

    }
    //此段代碼用來發送帶有附件的郵件
    void jButton6_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = System.getProperties();
    Authenticator auth = new Email_Autherticator();
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth); //建立session
    Store store = session.getStore("pop3");
    store.connect(host,username,password);

    //After connecting to the Store,you can get a Folder,which must be opened before you can read messages from it:
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_WRITE);
    Message message[] = folder.getMessages();

    for (int i=0,n=message.length;i
    {
    //獲得郵件的部分信息,如頭部信息,送信人的署名,送信人的郵件地址
    String out_from_person = ((InternetAddress)message.getFrom()[0]).getPersonal();
    String out_from_address = ((InternetAddress)message.getFrom()[0]).getAddress();
    System.out.println("From:"+out_from_person+"t");
    System.out.println("Address:"+out_from_address+"t");
    String out_subject = message.getSubject();
    System.out.println("Subject:"+out_subject+"t");

    //以下代碼用來獲取郵件的主體信息
    Part messagePart = message;
    Object out_content = messagePart.getContent();
    if (out_content instanceof Multipart)
    {
    messagePart = ((Multipart)out_content).getBodyPart(0);
    System.out.println("[ Multipart Message ]");
    }
    String out_content_type = messagePart.getContentType();
    System.out.println("CONTENT:"+out_content_type);

    if (out_content_type.startsWith("text/plain") | | out_content_type.startsWith("text/html"))
    {
    InputStream ipstm = messagePart.getInputStream();
    BufferedReader bufreader = new BufferedReader(new InputStreamReader(ipstm));
    String thisLine = bufreader.readLine();
    while (thisLine != null)
    {
    System.out.println("thisLine: "+thisLine);
    thisLine = bufreader.readLine();
    }
    }
    //獲取附件
    Multipart mp = (Multipart)message.getContent();
    for (int j=0,m=mp.getCount();j
    {
    System.out.println("***"+m+"***");
    Part part = mp.getBodyPart(j);
    String disposition = part.getDisposition();
    if ((disposition != null) && ((disposition.equals(part.ATTACHMENT)) | | (disposition.equals(part.INLINE))))
    {

    //以下代碼將獲得的附件保存到當前目錄下,以part.getFileName()為文件名,也既是附件的名稱。
    File filename = new File(part.getFileName());
    for (int k=0;filename.exists();k++)
    {
    filename = new File(part.getFileName()+k);
    }
    FileOutputStream myFileoutputstream = new FileOutputStream(filename);
    int chunk = part.getSize();//獲得附件的大小,不一定很準確。

    byte [] buffer = new byte[chunk];
    InputStream instream = part.getInputStream();
    instream.read(buffer,0,chunk);
    myFileoutputstream.write(buffer,0,chunk);
    instream.close();
    myFileoutputstream.close();
    }
    }
    System.out.println("------------------------------------------------------------");
    message.setFlag(Flags.Flag.DELETED,true);
    }
    folder.close(true);
    store.close();//關閉
    }
    catch(Exception ej2)
    {
    System.out.println(ej2);
    }
    }

    //此段代碼用來發送帶有html信息的郵件
    void jButton8_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = new Properties();
    Authenticator auth = new Email_Autherticator();
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth);
    MimeMessage message = new MimeMessage(session);
    //設置郵件正文
    String htmltext="< h1>hello< /h1>"+"< a href="http://www.sina.com.cn" target="_blank">click me please!< /a>";
    message.setContent(htmltext,"text/html");//text/plain設置郵件的格式因為是帶有html文檔的,所以用text/html格式

    message.setSubject(mail_subject);
    // message.setText(mail_body);在使用message.setContent()時候,好象不能用message.setText()
    message.setHeader(mail_head_name,mail_head_value);
    message.setSentDate(new Date());
    Address address = new InternetAddress(mail_from,"sunxiaoming");
    message.setFrom(address);
    Address toAddress = new InternetAddress(mail_to);
    message.addRecipient(Message.RecipientType.TO,toAddress);
    Transport.send(message);
    System.out.println("send ok!");
    }
    catch(Exception ex)
    {
    System.out.println("faild"+ex);
    }

    }

    //此段代碼用來發送帶有圖片的郵件
    void jButton9_actionPerformed(ActionEvent e) {
    try
    {
    String file = "./20020423/test.gif";
    Properties props = new Properties();
    Authenticator auth = new Email_Autherticator();

    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth);
    MimeMessage message = new MimeMessage(session);

    message.setSubject("Embedded Image");
    Address address = new InternetAddress(mail_from,"sunxiaoming");
    message.setFrom(address);
    Address toAddress = new InternetAddress(mail_to);
    message.addRecipient(Message.RecipientType.TO,toAddress);
    message.setHeader(mail_head_name,mail_head_value);
    message.setSentDate(new Date());

    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "< h1>< /h1>"+"< img src="cid:memememe">";//加入圖片
    messageBodyPart.setContent(htmlText,"text/html");
    //原理同發送附件一樣,將郵件看成有多個部分組成的,先設置每一個部分,然后再全部將它們合起來即可。
    //Create a related multi-part to combine the parts
    MimeMultipart multipart = new MimeMultipart("related");
    multipart.addBodyPart(messageBodyPart);

    //Create part for the image
    messageBodyPart = new MimeBodyPart();

    //Fetch the image and associate to part
    DataSource fds = new FileDataSource(file);
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID","memememe");

    //Add part to multi-part
    multipart.addBodyPart(messageBodyPart);

    //Associate multi-part with message
    message.setContent(multipart);

    Transport.send(message);
    System.out.println("send ok!");
    }
    catch(Exception ex)
    {
    System.out.println("faild"+ex);
    }

    }

    //該程序用來接受帶有html信息的郵件
    void jButton7_actionPerformed(ActionEvent e) {
    try
    {
    Properties props = System.getProperties();
    Authenticator auth = new Email_Autherticator();
    props.put("mail.smtp.host",host);
    props.put("mail.smtp.auth","true");
    Session session = Session.getDefaultInstance(props,auth);
    Store store = session.getStore("pop3");
    store.connect(host,username,password);

    //After connecting to the Store,you can get a Folder,which must be opened before you can read messages from it:
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_WRITE);
    Message message[] = folder.getMessages();

    for (int i=0,n=message.length;i
    // for (int i=0,n=1;i
    {
    String out_from_person = ((InternetAddress)message.getFrom()[0]).getPersonal();
    String out_from_address = ((InternetAddress)message.getFrom()[0]).getAddress();
    System.out.println("From:"+out_from_person+"t");
    System.out.println("Address:"+out_from_address+"t");

    String out_subject = message.getSubject();
    System.out.println("Subject:"+out_subject+"t");

    //獲取郵件的信息,并且對其每一部分進行操作
    Part messagePart = message;
    Object out_content = messagePart.getContent();
    if (out_content instanceof Multipart)
    {
    messagePart = ((Multipart)out_content).getBodyPart(0);
    System.out.println("[ Multipart Message ]");
    }
    String out_content_type = messagePart.getContentType();
    System.out.println("CONTENT:"+out_content_type);

    jEditorPane1.setText("");//將其顯示在jEditorPanel上
    jEditorPane1.setContentType("text/html");
    jEditorPane1.setText((String)out_content);
    jEditorPane1.setEditable(false);

    /*
    if (out_content_type.startsWith("text/plain") | | out_content_type.startsWith("text/html"))
    {
    InputStream ipstm = messagePart.getInputStream();
    BufferedReader bufreader = new BufferedReader(new InputStreamReader(ipstm));
    String thisLine = bufreader.readLine();
    while (thisLine != null)
    {
    System.out.println("thisLine: "+thisLine);
    thisLine = bufreader.readLine();
    }
    }
    */

    System.out.println("------------------------------------------------------------");
    message.setFlag(Flags.Flag.DELETED,true);
    }
    folder.close(true);
    store.close();
    }
    catch(Exception ej2)
    {
    System.out.println(ej2);
    }

    posted @ 2006-02-18 19:40 海思 閱讀(421) | 評論 (0)編輯 收藏

    一、jsp連接Oracle8/8i/9i數據庫(用thin模式)  
    testoracle.jsp如下:  
    <%@  page  contentType="text/html;charset=gb2312"%>  
    <%@  page  import="java.sql.*"%>  
    <html>  
    <body>  
    <%Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
    String  url="jdbc:oracle:thin:@localhost:1521:orcl";  
    //orcl為你的數據庫的SID  
    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);  
    while(rs.next())  {%>  
    您的第一個字段內容為:<%=rs.getString(1)%>  
    您的第二個字段內容為:<%=rs.getString(2)%>  
    <%}%>  
    <%out.print("數據庫操作成功,恭喜你");%>  
    <%rs.close();  
    stmt.close();  
    conn.close();  
    %>  
    </body>  
    </html>  



    二、jsp連接Sql  Server7.0/2000數據庫  
    testsqlserver.jsp如下:  
    <%@  page  contentType="text/html;charset=gb2312"%>  
    <%@  page  import="java.sql.*"%>  
    <html>  
    <body>  
    <%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();  
    String  url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";  
    //pubs為你的數據庫的  
    String  user="sa";  
    String  password="";  
    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);  
    while(rs.next())  {%>  
    您的第一個字段內容為:<%=rs.getString(1)%>  
    您的第二個字段內容為:<%=rs.getString(2)%>  
    <%}%>  
    <%out.print("數據庫操作成功,恭喜你");%>  
    <%rs.close();  
    stmt.close();  
    conn.close();  
    %>  
    </body>  
    </html>  



    三、jsp連接DB2數據庫  
    testdb2.jsp如下:  
    <%@  page  contentType="text/html;charset=gb2312"%>  
    <%@  page  import="java.sql.*"%>  
    <html>  
    <body>  
    <%Class.forName("com.ibm.db2.jdbc.app.DB2Driver  ").newInstance();  
    String  url="jdbc:db2://localhost:5000/sample";  
    //sample為你的數據庫名  
    String  user="admin";  
    String  password="";  
    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);  
    while(rs.next())  {%>  
    您的第一個字段內容為:<%=rs.getString(1)%>  
    您的第二個字段內容為:<%=rs.getString(2)%>  
    <%}%>  
    <%out.print("數據庫操作成功,恭喜你");%>  
    <%rs.close();  
    stmt.close();  
    conn.close();  
    %>  
    </body>  
    </html>  



    四、jsp連接Informix數據庫  
    testinformix.jsp如下:  
    <%@  page  contentType="text/html;charset=gb2312"%>  
    <%@  page  import="java.sql.*"%>  
    <html>  
    <body>  
    <%Class.forName("com.informix.jdbc.IfxDriver").newInstance();  
    String  url  =  
    "jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver;  
    user=testuser;password=testpassword";  
    //testDB為你的數據庫名  
    Connection  conn=  DriverManager.getConnection(url);  
    Statement  stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);  
    String  sql="select  *  from  test";  
    ResultSet  rs=stmt.executeQuery(sql);  
    while(rs.next())  {%>  
    您的第一個字段內容為:<%=rs.getString(1)%>  
    您的第二個字段內容為:<%=rs.getString(2)%>  
    <%}%>  
    <%out.print("數據庫操作成功,恭喜你");%>  
    <%rs.close();  
    stmt.close();  
    conn.close();  
    %>  
    </body>  
    </html>  



    五、jsp連接Access數據庫  
    <%@page  import="java.sql.*"  
    import  ="java.util.*"  
    import  ="java.io.*"  
    import="java.text.*"  
    contentType="text/html;  charset=gb2312"  
    buffer="20kb"  
    %><%!  int  all,i,m_count;  
    String  odbcQuery;  
    Connection  odbcconn;  
    Statement  odbcstmt;  
    ResultSet  odbcrs;  
    String  username,title,content,work,email,url,time,date;  
    String  datetime;  
    %>  
    <%  
    try{  
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
    }catch  (ClassNotFoundException  e)  
    {  out.print  ("驅動程序不存在");  
    }    
    try{  
    odbcconn  =  DriverManager.getConnection("jdbc:odbc:db1");  
    odbcstmt  =  odbcconn.createStatement();            
    odbcQuery="Select  *  From  book  where  datetime>2001-4-26  Order  By  datetime  DESC";  
    odbcrs=odbcstmt.executeQuery(odbcQuery);  
    int  i=0;  
    while  (i<130)  odbcrs.next();  
    while  (odbcrs.next())  
    {  
    //*/////////////////////////顯示數據庫的內容用于調試程序是用//  
    int  ii;  
    try{  
    try{  
    for  (ii=1;;ii++)  
    out.print  ("<br>Cloumn  "+ii+"  is:  "+odbcrs.getString(ii));  
    }catch  (NullPointerException  e)  {  
    out.print  ("有空的指針");  
    }  
    }catch  (SQLException  e){  
    }  
    }  
    odbcrs.close();  
    odbcstmt.close();  
    odbcconn.close();  
    }catch  (SQLException  e)  
    {  out.print  (e);  
    }  
    %>

    六.MYSQL
    import java.sql.*;

    public class MysqlTest {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    // TODO Auto-generated method stub

    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs =null;

    String url = "jdbc:mysql://localhost:3306/mysql";
    conn = DriverManager.getConnection(url,"root","");
    stmt = conn.createStatement();

    rs = stmt.executeQuery("select * from user");

    while(rs.next())
    {
    System.out.println(rs.getObject(1));
    }
    stmt.close();
    conn.close();
    }
    }

    posted @ 2006-02-18 19:34 海思 閱讀(117) | 評論 (0)編輯 收藏

    中國與印度軟件工程師之比較
    shenkai 轉貼  (參與分:4519,專家分:680)   發表:2006-01-16 17:52   版本:1.0   閱讀:693

    在工作中,接觸到印度軟件公司開發出來的軟件: 整個體系架構非常清晰,按照我們的要求實現了全部功能,而且相當穩定。但是打開具體的代碼一看,拖沓冗長,水平不咋樣。我們自己的一些程序員就有怪話了,說他們水平真低。但是! 印度人能夠把軟件整體把握得很好,能夠完成軟件,并得到相當好的設計文檔。而中國人在那里琢磨數據結構、算法,界面人員就還沒編碼就想著是Outlook式的還是Visual Studio式的界面。到最后就成為Code 高手,對某些特定的開發工具精通,但是就是不能保證能夠把一個軟件穩當、完整的開發出來。

    ??舉個簡單的例子:

    ??軟件中需要一個列表,用來表示我們處理的事務。該類表在業務繁忙的時候將變得很大。中國人就用雙向鏈表,抱著《數據結構》書在那里寫鏈表的類。印度人開了一個大數組,然后就開始干。為什么印度人不用鏈表,他們說:1、你們給出的設備(小型機),最少具備512M內存,浪費一些沒有什么。2、數組方式訪問方便、效率高。 看出了一拿到東西就吭哧吭哧作Code,和好好進行軟件分析的不同了嗎?正好前幾天我有幾個同事從印度回來和我們交流,那家公司是CMM4級公司. 我感受的幾點:

    ??1. 流程重于項目

    ??2. QC(就是QA)獨立于研發部門,專門檢查研發部門的開發流程是不是按照既定流程走.如果QC覺得流程不對,他會直接上報高層, 項目肯定就此停止.

    ??3. 所謂的項目經理(PC)一般也是從編碼人員升上來的,并不是所謂的不懂技術,一般都至少有四年以上的經驗

    ??4. PC主要就是制定開發計劃,負責協調,填寫各種表格.

    ??5. 所有的東西(包括草稿)都有文檔.

    ??6. 詳細文檔要求達到只有這個文檔就可以編碼的程度,一般寫文檔時間占60%,編碼時間極少

    ??7. 有各種詳細的review(同行評審),項目組內的,項目組之間的,客戶的...

    ??8. 計劃很詳細,的確能達到小時級,但是實際情況還是誤差比較大,所以他們也有加班.

    ??先學習UML和Rose以及RUP,不要總是要找著證據。在中國的軟件開發水平下,很難給你一個好的例子,OK?中國人總是要看到一個東西有了試驗田,而且稻子長得好,才換稻種。要知道在國外上述的軟件開發模式的應用,大可以看看Rational網頁上的story。Just do it! 一句話,中國的軟件開發水平低得很。趕不上印度人,印度的軟件公司可以讓高中生編代碼,它的軟件工程水平可想而知。當然,你如果是個很牛的程序員。估計夠嗆,因為中國的氣氛中,很牛的程序員都很難接受軟件工程的。你可以測試一下自己, 看看自己適不適合現在學習軟件工程:

    ??1、你是不是不能忍受一個編程序不如你的人做你的項目經理?

    ??2、你是不是覺得你的老板對客戶吹牛皮、夸大自己而感到不舒服?

    ??3、你是不是一個拿到一個需求腦袋里第一念頭就是如何實現的人?

    ??4、你是不是很崇拜Stallman,Linus,很討厭Microsoft?

    ??5、你是不是曾經在深夜編碼的時候,突然感覺到一種乏味,對Code的生涯感到一種無趣?


    ??1、以管窺豹──印度神話 作者:"Kino" 我們現在處于深深的自卑當中,感到中國的軟件工程水平的低下已經是牽涉到民族劣根性的問題了。

    ??他們的軟件教育水平: 我們招聘印度人,給應聘者出了一份與國內差不多的試卷,有基礎概念和編程題目。 等到他們完成后,我們這些中國的自認高手驚呆了!他們的編程題目簡直象是抄襲的?程序結構,注釋,變量命名就不說了吧,全部都是極其類似!反觀中國的牛人、高手,每個人有自己的一套。到了新的崗位,先把前任的程序貶損一通,然后自己再開發更多的問題的代碼來代替。我的公司統計,一個軟件中有4個以上 CSocket版本,

    ??每個人都覺得別人做得差,自己再搞一套。中國人,就是這個樣子,還會辯解說“我們這樣有創造性”。 其實軟件發展,早就走過了求伯君那個編碼英雄的年代,程序員已經是個坐辦公室的藍領了。你具備擰好一個螺絲釘的能力就可以了。Code是最低級的事情了。

    ??2、他們許多公司的項目經理根本就不懂技術。 中國的項目經理如果不能在技術上壓服下屬,那么下屬將與他搞鬼,越是高手越喜歡搞鬼,根本不知道作軟件的終極目的是從別人兜里掏錢,而在內部搞不團結。技術高手都會糾集一些對他技術上崇拜的菜鳥,與管理層作對。而印度的軟件經理根本就不懂正在做的東西,許多甚至直接就是MBA,或者是領域專家 (工業設計、地理專家等),而不是編碼的專家。但是卻能夠領導大群素質良好的程序員把工作做好,沒有內部不團結的情況。許多印度的程序員加入一個公司很長時間,都不知道自己整天編的代碼是干什么用的。給他們的任務可能就是一個函數的聲明以及該函數要實現的功能。我們呢?

    ??3、他們的編程人員的流動率達到30%! 他們的編程人員流動率(包括內部項目之間的流動)高達30%,可以想見他們的文檔水平如何。他們的產品不依賴任何一個人,誰都可以立即辭職,產品的開發還是會正常進行。 而中國,是老板怕總工。技術骨干擁兵自重,抗拒管理。任何制定好的計劃,都有可能被技術人員推翻或者跟你消極怠工。

    ??4、他們的開發計劃能夠做到小時級別。 如果一個印度公司的項目經理沒有上班,那么他的下屬將可能不知道作什么。他們的計劃一般都定到天,每個基層開發人員每天的工作量就是8小時。而我們能夠給出月度計劃的公司就很少,而給出的月度計劃要么不可能實現,要么就可 能被取消。開發人員被初略的給個任務,他在月初,可以慢慢琢磨是做成什么樣子,然 后上上網,聊聊天。到了月中和月末,就開始熬夜編碼。
    posted @ 2006-01-21 16:58 海思 閱讀(243) | 評論 (0)編輯 收藏

    關鍵字:正則表達式  模式匹配 Javascript

    摘要:收集一些常用的正則表達式。

    正則表達式用于字符串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。我將一些常用的表達式收藏在這里,作備忘之用。本貼隨時會更新。

    匹配中文字符的正則表達式: [\u4e00-\u9fa5]

    匹配雙字節字符(包括漢字在內):[^\x00-\xff]

    應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

    String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

    匹配空行的正則表達式:\n[\s| ]*\r

    匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/

    匹配首尾空格的正則表達式:(^\s*)|(\s*$)

    應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:

    String.prototype.trim = function()
    {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    }

    利用正則表達式分解和轉換IP地址:

    下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:

    function IP2V(ip)
    {
     re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正則表達式
    if(re.test(ip))
    {
    return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
    }
    else
    {
     throw new Error("Not a valid IP address!")
    }
    }

    不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:

    var ip="10.100.20.168"
    ip=ip.split(".")
    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

    匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

    匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

    利用正則表達式去除字串中重復的字符的算法程序:[注:此程序不正確,原因見本貼回復]

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*\1/g,"$1")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2)  //結果為:abcefgi

    我原來在CSDN上發貼尋求一個表達式來實現去除重復字符的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用后向引用取出包括重復的字符,再以重復的字符建立第二個表達式,取到不重復的字符,兩者串連。這個方法對于字符順序有要求的字符串可能不適用。

    得用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1

    s="http://www.9499.net/page1.htm"
    s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
    alert(s)

    利用正則表達式限制網頁表單里的文本框輸入內容:

    用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

    用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

    用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

     

    posted on 2004年06月24日 11:32 PM

    Feedback

    # 回復:經典正則表達式 2004-08-03 2:03 PM 阿賴.com

    正則表達式,相關鏈接
    http://blog.csdn.net/laily/category/19548.aspx
    http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微軟的正則表達式教程(五):選擇/編組和后向引用

    http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微軟的正則表達式教程(四):限定符和定位符

    http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微軟的正則表達式教程(三):字符匹配

    http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微軟的正則表達式教程(二):正則表達式語法和優先權順序

    http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微軟的正則表達式教程(一):正則表達式簡介

    http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作為:高級查找/替換、正則表達式練習器、Javascript腳本程序調試器

    http://blog.csdn.net/laily/archive/2004/06/24/25872.aspx 經典正則表達式

    正則表達式,正規表達式,正則表達式匹配,正則表達式語法,模式匹配,正規表達式匹配 javascript正則表達式 ASP正則表達式 ASP.NET正則表達式 C#正則表達式 JSP正則表達式 PHP正則表達式 VB.NET正則表達式 VBSCript正則表達式編程 delphi正則表達式 jscript

     

    正則表達式 regular expression
    正則表達式 RegExp
    模式 pattern
    匹配 Match
    .NET命名空間: System.Text.RegularExpression

     

    補充:
    ^\d+$  //匹配非負整數(正整數 + 0)
    ^[0-9]*[1-9][0-9]*$  //匹配正整數
    ^((-\d+)|(0+))$  //匹配非正整數(負整數 + 0)
    ^-[0-9]*[1-9][0-9]*$  //匹配負整數
    ^-?\d+$    //匹配整數
    ^\d+(\.\d+)?$  //匹配非負浮點數(正浮點數 + 0)
    ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮點數
    ^((-\d+(\.\d+)?)|(0+(\.0+)?))$  //匹配非正浮點數(負浮點數 + 0)
    ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匹配負浮點數
    ^(-?\d+)(\.\d+)?$  //匹配浮點數
    ^[A-Za-z]+$  //匹配由26個英文字母組成的字符串
    ^[A-Z]+$  //匹配由26個英文字母的大寫組成的字符串
    ^[a-z]+$  //匹配由26個英文字母的小寫組成的字符串
    ^[A-Za-z0-9]+$  //匹配由數字和26個英文字母組成的字符串
    ^\w+$  //匹配由數字、26個英文字母或者下劃線組成的字符串
    ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //匹配email地址
    ^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //匹配url

     

    利用正則表達式去除字串中重復的字符的算法程序:

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*\1/g,"$1")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2) //結果為:abcefgi
    ===============================
    如果var s = "abacabefggeeii"
    結果就不對了,結果為:abeicfgg
    正則表達式的能力有限

     

    1.確認有效電子郵件格式
    下面的代碼示例使用靜態 Regex.IsMatch 方法驗證一個字符串是否為有效電子郵件格式。如果字符串包含一個有效的電子郵件地址,則 IsValidEmail 方法返回 true,否則返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在應用程序將地址存儲在數據庫中或顯示在 ASP.NET 頁中之前,篩選出包含無效字符的電子郵件地址。

    [Visual Basic]
    Function IsValidEmail(strIn As String) As Boolean
    ' Return true if strIn is in valid e-mail format.
    Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")
    End Function
    [C#]
    bool IsValidEmail(string strIn)
    {
    // Return true if strIn is in valid e-mail format.
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
    }


    2.清理輸入字符串
    下面的代碼示例使用靜態 Regex.Replace 方法從字符串中抽出無效字符。您可以使用這里定義的 CleanInput 方法,清除掉在接受用戶輸入的窗體的文本字段中輸入的可能有害的字符。CleanInput 在清除掉除 @、-(連字符)和 .(句點)以外的所有非字母數字字符后返回一個字符串。

    [Visual Basic]
    Function CleanInput(strIn As String) As String
    ' Replace invalid characters with empty strings.
    Return Regex.Replace(strIn, "[^\w\.@-]", "")
    End Function
    [C#]
    String CleanInput(string strIn)
    {
    // Replace invalid characters with empty strings.
    return Regex.Replace(strIn, @"[^\w\.@-]", "");
    }


    3.更改日期格式
    以下代碼示例使用 Regex.Replace 方法來用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。

    [Visual Basic]
    Function MDYToDMY(input As String) As String
    Return Regex.Replace(input, _
    "\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b", _
    "${day}-${month}-${year}")
    End Function
    [C#]
    String MDYToDMY(String input)
    {
    return Regex.Replace(input,
    "\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b",
    "${day}-${month}-${year}");
    }
    Regex 替換模式
    本示例說明如何在 Regex.Replace 的替換模式中使用命名的反向引用。其中,替換表達式 ${day} 插入由 (?<day>...) 組捕獲的子字符串。

    有幾種靜態函數使您可以在使用正則表達式操作時無需創建顯式正則表達式對象,而 Regex.Replace 函數正是其中之一。如果您不想保留編譯的正則表達式,這將給您帶來方便


    4.提取 URL 信息
    以下代碼示例使用 Match.Result 來從 URL 提取協議和端口號。例如,“http://www.contoso.com:8080/letters/readme.html”將返回“http:8080”。

    [Visual Basic]
    Function Extension(url As String) As String
    Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _
    RegexOptions.Compiled)
    Return r.Match(url).Result("${proto}${port}")
    End Function
    [C#]
    String Extension(String url)
    {
    Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
    RegexOptions.Compiled);
    return r.Match(url).Result("${proto}${port}");
    }

    posted on 2004-11-19 17:25 yongsheng 閱讀(5517) 評論(10)  編輯 收藏

    評論

    # re: 正則表達式 2005-02-28 00:45 yongsheng

      一、正則表達式基礎知識
      我們先從簡單的開始。假設你要搜索一個包含字符“cat”的字符串,搜索用的正則表達式就是“cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:


      1.1句點符號
      假設你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用正則表達式搜索它的全部內容。要構造出這個正則表達式,你可以使用一個通配符??句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“tn”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符:

      1.2方括號符號
      為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內你只能匹配單個字符:

      1.4表示匹配次數的符號
      表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數:

      假設我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字符(“-”)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上一個轉義字符“\”。

      圖一:匹配所有123-12-1234形式的社會安全號碼
      假設進行搜索的時候,你希望連字符號可以出現,也可以不出現??即,999-99-9999和999999999都屬于正確的格式。這時,你可以在連字符號后面加上“?”數量限定符號,如圖二所示:

      圖二:匹配所有123-12-1234和123121234形式的社會安全號碼
      下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數字加上二個字母。它的正則表達式前面是數字部分“[0-9]{ 4}”,再加上字母部分“[A-Z]{ 2}”。圖三顯示了完整的正則表達式。

      圖三:匹配典型的美國汽車牌照號碼,如8836KV
      1.5“否”符號
      “^”符號稱為“否”符號。如果用在方括號內,“^”表示不想要匹配的字符。例如,圖四的正則表達式匹配所有單詞,但以“X”字母開頭的單詞除外。

      圖四:匹配所有單詞,但“X”開頭的除外
      1.6圓括號和空白符號
      假設要從格式為“June26,1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示:

      圖五:匹配所有MothDD,YYYY格式的日期
      新出現的“\s”符號是空白符號,匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創建一個組,然后用OROAPI(本文后面詳細討論)提取出它的值。修改后的正則表達式如圖六所示:

      圖六:匹配所有MonthDD,YYYY格式的日期,定義月份值為第一個組
      1.7其它符號
      為簡便起見,你可以使用一些為常見正則表達式創建的快捷符號。如表二所示:
      表二:常用符號

      例如,在前面社會安全號碼的例子中,所有出現“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達式如圖七所示:

    # re: 正則表達式 2005-02-28 00:54 yongsheng


    /*------------------------
    功能:替換任何空白字符
    -------------------------*/
    function TrimString (strVal)
    {
    strTmp = strVal + "";
    if (strTmp.length == 0)
    return (strTmp);
    reVal = /^\s*/;
    strTmp = strTmp.replace (reVal, '');
    reVal = /\s*$/;
    return (strTmp.replace (reVal, ''));
    }

    /*------------------------
    功能:檢測是否是有效數字
    -------------------------*/
    function Check_Num( num )
    {
    num = ( TrimString( num ) );
    if (num.length == 0)
    return (false);
    return ( Number( num ) );
    }

    /*------------------------
    功能:檢測是否是有效日期
    -------------------------*/
    function Check_Date (strDate)
    {
    strDate = (TrimString (strDate));
    if (strDate.length == 0)
    return (false);
    reVal = /^([1-2]\d{3})[\/|\-](0?[1-9]|10|11|12)[\/|\-]([1-2]?[0-9]|0[1-9]|30|31)$/;
    return (reVal.test (strDate));
    }

    /*------------------------
    功能:檢測是否是有效Email
    -------------------------*/
    function Check_Email (strEmail)
    {
    strEmail = (TrimString (strEmail));
    if (strEmail.length == 0)
    return (false);

    reVal = /^[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+@[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+(\.[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+)+$/;
    return (reVal.test (strEmail));
    }

    /*------------------------
    功能:檢測是否是有效時間
    -------------------------*/
    function Check_Time (strTime)
    {
    strTime = (TrimString (strTime));
    if (strTime.length == 0)
    return (false);

    reVal = /^(([0-9]|[01][0-9]|2[0-3])(:([0-9]|[0-5][0-9])){0,2}|(0?[0-9]|1[0-1])(:([0-9]|[0-5][0-9])){0,2}\s?[aApP][mM])?$/;
    return (reVal.test (strTime));
    }

    /*------------------------
    功能:檢測是否是有效日期特定格式
    -------------------------*/
    function Check_Date_1 (strDate)
    {
    strDate = (TrimString (strDate));
    if (strDate.length == 0)
    return (false);
    reVal = /^([1-2]\d{3})[\/](0?[1-9]|10|11|12)[\/]([1-2]?[0-9]|0[1-9]|30|31)$/;
    return (reVal.test (strDate));
    }

    /*------------------------
    功能:檢測是否是有效日期特定格式
    -------------------------*/
    function Check_Date_2 (strDate)
    {
    strDate = (TrimString (strDate));
    if (strDate.length == 0)
    return (false);
    reVal = /^([1-2]\d{3})[\-](0[1-9]|10|11|12)[\-]([1-2][0-9]|0[1-9]|30|31)$/;
    return (reVal.test (strDate));
    }

    /*--------------------------------------
    功能:換行定行
    ---------------------------------------*/
    function enter( form, temp )
    {
    if ( window.event.keyCode == 13 )
    {
    eval( form + temp + ".focus()" );
    eval( form + temp + ".select()" );
    }
    else
    return (false);
    }

    /*--------------------------------------
    功能:檢查字符串長度
    ---------------------------------------*/
    function ByteString (strVal)
    {
    nLen = 0;

    for (i = 0; i < strVal.length; i ++)
    {
    if (strVal.charCodeAt (i) > 255)
    nLen += 2;
    else
    nLen ++;
    };
    return (nLen);
    }

    /*--------------------------------------
    功能:按要求截取字符串長度
    ---------------------------------------*/
    function SubString(strVal,nStrLen)
    {
    nLen = 0;
    nTemp = 0;
    for (i = 0; i < strVal.length; i ++)
    {
    if (strVal.charCodeAt (i) > 255)
    nLen += 2;
    else
    nLen ++;
    if(nLen <= nStrLen)
    nTemp = i;
    else
    break;
    };
    return(strVal.substr(0,nTemp+1));
    }

    /*------------------------
    功能:檢測密碼,密碼只能由英文字母、數字、減號、下劃線、$、#、*、(和)構成,且首位必須是英文字母
    -------------------------*/
    function Check_Pass( strPass )
    {
    strPass = ( TrimString( strPass ) );
    if (strPass.length == 0)
    return (false);
    reVal = /^[a-zA-Z]{1}[a-zA-Z0-9-_$#*()]{0,29}$/;
    return ( reVal.test (strPass) );
    }

    這是所有的,不過是PHP的,你自己轉換一下吧~~

    # re: 正則表達式 2005-02-28 00:59 yongsheng

    ^(((19)|(20))\d{2})(((((-|/)0?)|0)[1-9])|((-|/)?1[0-2]))((((((-|/)0?)|0)[1-9])|((-|/)?[1-2][0-9]))|((-|/)?3[0-1]))$


    2004-1-1格式

    # re: 正則表達式 2005-03-07 14:33 yongsheng

    一、驗證類
    1、數字驗證內
    1.1 整數
    1.2 大于0的整數 (用于傳來的ID的驗證)
    1.3 負整數的驗證
    1.4 整數不能大于iMax
    1.5 整數不能小于iMin
    2、時間類
    2.1 短時間,形如 (13:04:06)
    2.2 短日期,形如 (2003-12-05)
    2.3 長時間,形如 (2003-12-05 13:04:06)
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小時和分鐘,形如(12:03)
    3、表單類
    3.1 所有的表單的值都不能為空
    3.2 多行文本框的值不能為空。
    3.3 多行文本框的值不能超過sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判斷單選框是否選擇。
    3.6 判斷復選框是否選擇.
    3.7 復選框的全選,多選,全不選,反選
    3.8 文件上傳過程中判斷文件類型
    4、字符類
    4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
    4.2 判斷字符由字母和數字組成。
    4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
    4.4 字符串替換函數.Replace();
    5、瀏覽器類
    5.1 判斷瀏覽器的類型
    5.2 判斷ie的版本
    5.3 判斷客戶端的分辨率

    6、結合類
    6.1 email的判斷。
    6.2 手機號碼的驗證
    6.3 身份證的驗證


    二、功能類

    1、時間與相關控件類
    1.1 日歷
    1.2 時間控件
    1.3 萬年歷
    1.4 顯示動態顯示時鐘效果(文本,如OA中時間)
    1.5 顯示動態顯示時鐘效果 (圖像,像手表)
    2、表單類
    2.1 自動生成表單
    2.2 動態添加,修改,刪除下拉框中的元素
    2.3 可以輸入內容的下拉框
    2.4 多行文本框中只能輸入iMax文字。如果多輸入了,自動減少到iMax個文字(多用于短信發送)

    3、打印類
    3.1 打印控件
    4、事件類
    4.1 屏蔽右鍵
    4.2 屏蔽所有功能鍵
    4.3 --> 和<-- F5 F11,F9,F1
    4.4 屏蔽組合鍵ctrl+N
    5、網頁設計類
    5.1 連續滾動的文字,圖片(注意是連續的,兩段文字和圖片中沒有空白出現)
    5.2 html編輯控件類
    5.3 顏色選取框控件
    5.4 下拉菜單
    5.5 兩層或多層次的下拉菜單
    5.6 仿IE菜單的按鈕。(效果如rongshuxa.com的導航欄目)
    5.7 狀態欄,title欄的動態效果(例子很多,可以研究一下)
    5.8 雙擊后,網頁自動滾屏
    6、樹型結構。
    6.1 asp+SQL版
    6.2 asp+xml+sql版
    6.3 java+sql或者java+sql+xml
    7、無邊框效果的制作
    8、連動下拉框技術
    9、文本排序


    一、驗證類
    1、數字驗證內
    1.1 整數
    /^(-|\+)?\d+$/.test(str)
    1.2 大于0的整數 (用于傳來的ID的驗證)
    /^\d+$/.test(str)
    1.3 負整數的驗證
    /^-\d+$/.test(str)
    2、時間類
    2.1 短時間,形如 (13:04:06)
    function isTime(str)
    {
    var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
    if (a == null) {alert('輸入的參數不是時間格式'); return false;}
    if (a[1]>24 || a[3]>60 || a[4]>60)
    {
    alert("時間格式不對");
    return false
    }
    return true;
    }
    2.2 短日期,形如 (2003-12-05)
    function strDateTime(str)
    {
    var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1, r[4]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
    }
    2.3 長時間,形如 (2003-12-05 13:04:06)
    function strDateTime(str)
    {
    var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
    var r = str.match(reg);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
    }
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小時和分鐘,形如(12:03)
    3、表單類
    3.1 所有的表單的值都不能為空
    <input onblur="if(this.value.replace(/^\s+|\s+$/g,'')=='')alert('不能為空!')">
    3.2 多行文本框的值不能為空。
    3.3 多行文本框的值不能超過sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判斷單選框是否選擇。
    3.6 判斷復選框是否選擇.
    3.7 復選框的全選,多選,全不選,反選
    3.8 文件上傳過程中判斷文件類型
    4、字符類
    4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
    <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有錯')">
    4.2 判斷字符由字母和數字組成。
    <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有錯')">
    4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
    /^([a-zA-z_]{1})([\w]*)$/g.test(str)
    4.4 字符串替換函數.Replace();
    5、瀏覽器類
    5.1 判斷瀏覽器的類型
    window.navigator.appName
    5.2 判斷ie的版本
    window.navigator.appVersion
    5.3 判斷客戶端的分辨率
    window.screen.height; window.screen.width;

    6、結合類
    6.1 email的判斷。
    function ismail(mail)
    {
    return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
    }
    6.2 手機號碼的驗證
    6.3 身份證的驗證
    function isIdCardNo(num)
    {
    if (isNaN(num)) {alert("輸入的不是數字!"); return false;}
    var len = num.length, re;
    if (len == 15)
    re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
    else if (len == 18)
    re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
    else {alert("輸入的數字位數不對!"); return false;}
    var a = num.match(re);
    if (a != null)
    {
    if (len==15)
    {
    var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    else
    {
    var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    if (!B) {alert("輸入的身份證號 "+ a[0] +" 里出生日期不對!"); return false;}
    }
    return true;
    }

    3.7 復選框的全選,多選,全不選,反選
    <form name=hrong>
    <input type=checkbox name=All onclick="checkAll('mm')">全選<br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/>
    <input type=checkbox name=mm onclick="checkItem('All')"><br/><br/>


    <input type=checkbox name=All2 onclick="checkAll('mm2')">全選<br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
    <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>

    </form>

    <SCRIPT LANGUAGE="JavaScript">
    function checkAll(str)
    {
    var a = document.getElementsByName(str);
    var n = a.length;
    for (var i=0; i<n; i++)
    a[i].checked = window.event.srcElement.checked;
    }
    function checkItem(str)
    {
    var e = window.event.srcElement;
    var all = eval("document.hrong."+ str);
    if (e.checked)
    {
    var a = document.getElementsByName(e.name);
    all.checked = true;
    for (var i=0; i<a.length; i++)
    {
    if (!a[i].checked){ all.checked = false; break;}
    }
    }
    else all.checked = false;
    }
    </SCRIPT>

    3.8 文件上傳過程中判斷文件類型
    <input type=file onchange="alert(this.value.match(/^(.*)(\.)(.{1,8})$/)[3])">

    畫圖:
    <OBJECT
    id=S
    style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px"
    height=240
    width=392
    classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">
    </OBJECT>
    <SCRIPT>
    S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);
    S.DrawingSurface.ArcRadians(30,0,0,30,50,60);
    S.DrawingSurface.Line(10,10,100,100);
    </SCRIPT>

    寫注冊表:
    <SCRIPT>
    var WshShell = WScript.CreateObject("WScript.Shell");
    WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\", 1, "REG_BINARY");
    WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader", "Goocher!", "REG_SZ");
    var bKey = WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\");
    WScript.Echo (WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader"));
    WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader");
    WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\");
    WshShell.RegDelete ("HKCU\\Software\\ACME\\");
    </SCRIPT>

    TABLAE相關(客戶端動態增加行列)
    <HTML>
    <SCRIPT LANGUAGE="JScript">
    function numberCells() {
    var count=0;
    for (i=0; i < document.all.mytable.rows.length; i++) {
    for (j=0; j < document.all.mytable.rows(i).cells.length; j++) {
    document.all.mytable.rows(i).cells(j).innerText = count;
    count++;
    }
    }
    }
    </SCRIPT>
    <BODY onload="numberCells()">
    <TABLE id=mytable border=1>
    <TR><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH></TR>
    <TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
    <TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
    </TABLE>
    </BODY>
    </HTML>

    1.身份證嚴格驗證:

    <script>
    var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"內蒙古",21:"遼寧",22:"吉林",23:"黑龍江",31:"上海",32:"江蘇",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山東",41:"河南",42:"湖北",43:"湖南",44:"廣東",45:"廣西",46:"海南",50:"重慶",51:"四川",52:"貴州",53:"云南",54:"西藏",61:"陜西",62:"甘肅",63:"青海",64:"寧夏",65:"新疆",71:"臺灣",81:"香港",82:"澳門",91:"國外"}

    function cidInfo(sId){
    var iSum=0
    var info=""
    if(!/^\d{17}(\d|x)$/i.test(sId))return false;
    sId=sId.replace(/x$/i,"a");
    if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地區";
    sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
    var d=new Date(sBirthday.replace(/-/g,"/"))
    if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
    for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
    if(iSum%11!=1)return "Error:非法證號";
    return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
    }

    document.write(cidInfo("380524198002300016"),"<br/>");
    document.write(cidInfo("340524198002300019"),"<br/>")
    document.write(cidInfo("340524197711111111"),"<br/>")
    document.write(cidInfo("34052419800101001x"),"<br/>");
    </script>

    2.驗證IP地址
    <SCRIPT LANGUAGE="JavaScript">
    function isip(s){
    var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};
    var re=s.split(".")
    return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false
    }

    var s="202.197.78.129";
    alert(isip(s))
    </SCRIPT>



    3.加sp1后還能用的無邊框窗口!!
    <HTML XMLNS:IE>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <IE:Download ID="include" STYLE="behavior:url(#default#download)" />
    <title>Chromeless Window</title>

    <SCRIPT LANGUAGE="JScript">
    /*--- Special Thanks For andot ---*/

    /*
    This following code are designed and writen by Windy_sk <seasonx@163.net>
    You can use it freely, but u must held all the copyright items!
    */

    /*--- Thanks For andot Again ---*/

    var CW_width = 400;
    var CW_height = 300;
    var CW_top = 100;
    var CW_left = 100;
    var CW_url = "/";
    var New_CW = window.createPopup();
    var CW_Body = New_CW.document.body;
    var content = "";
    var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";

    //Build Window
    include.startDownload(CW_url, function(source){content=source});

    function insert_content(){
    var temp = "";
    CW_Body.style.overflow = "hidden";
    CW_Body.style.backgroundColor = "white";
    CW_Body.style.border = "solid black 1px";
    content = content.replace(/<a ([^>]*)>/g,"<a onclick='parent.open(this.href);return false' $1>");
    temp += "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>";
    temp += "<tr style=';font-size:12px;background:#0099CC;height:20;cursor:default' ondblclick=\"Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'>";
    temp += "<td style='color:#ffffff;padding-left:5px'>Chromeless Window For IE6 SP1</td>";
    temp += "<td style='color:#ffffff;padding-right:5px;' align=right>";
    temp += "<span id=Help onclick=\"alert('Chromeless Window For IE6 SP1 - Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot')\" style=\""+CSStext+"font-family:System;padding-right:2px;\">?</span>";
    temp += "<span id=Min onclick='parent.New_CW.hide();parent.blur()' style=\""+CSStext+"font-family:Webdings;\" title='Minimum'>0</span>";
    temp += "<span id=Max onclick=\"this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" style=\""+CSStext+"font-family:Webdings;\" title='Maximum'>1</span>";
    temp += "<span id=Close onclick='parent.opener=null;parent.close()' style=\""+CSStext+"font-family:System;padding-right:2px;\" title='Close'>x</span>";
    temp += "</td></tr><tr><td colspan=2>";
    temp += "<div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"'>";
    temp += content;
    temp += "</div>";
    temp += "</td></tr></table>";
    CW_Body.innerHTML = temp;
    }

    setTimeout("insert_content()",1000);

    var if_max = true;
    function show_CW(){
    window.moveTo(10000, 10000);
    if(if_max){
    New_CW.show(CW_top, CW_left, CW_width, CW_height);
    if(typeof(New_CW.document.all.include)!="undefined"){
    New_CW.document.all.include.style.width = CW_width;
    New_CW.document.all.Max.innerText = "1";
    }

    }else{
    New_CW.show(0, 0, screen.width, screen.height);
    New_CW.document.all.include.style.width = screen.width;
    }
    }

    window.onfocus = show_CW;
    window.onresize = show_CW;

    // Move Window
    var drag_x,drag_y,draging=false

    function drag_move(e){
    if (draging){
    New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);
    return false;
    }
    }

    function drag_down(e){
    if(e.button==2)return;
    if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return;
    drag_x=e.clientX;
    drag_y=e.clientY;
    draging=true;
    e.srcElement.setCapture();
    }

    function drag_up(e){
    draging=false;
    e.srcElement.releaseCapture();
    if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return;
    CW_top = e.screenX-drag_x;
    CW_left = e.screenY-drag_y;
    }

    </SCRIPT>
    </HTML>

    電話號碼的驗證

    要求:
      (1)電話號碼由數字、"("、")"和"-"構成
      (2)電話號碼為3到8位
      (3)如果電話號碼中包含有區號,那么區號為三位或四位
      (4)區號用"("、")"或"-"和其他部分隔開
      (5)移動電話號碼為11或12位,如果為12位,那么第一位為0
      (6)11位移動電話號碼的第一位和第二位為"13"
      (7)12位移動電話號碼的第二位和第三位為"13"
      根據這幾條規則,可以與出以下正則表達式:
      (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)


    <script language="javascript">
    function PhoneCheck(s) {
    var str=s;
    var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/
    alert(reg.test(str));
    }
    </script>
    <input type=text name="iphone">
    <input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check">

    具有在輸入非數字字符不回顯的效果,即對非數字字符的輸入不作反應。
    function numbersonly(field,event){
    var key,keychar;
    if(window.event){
    key = window.event.keyCode;
    }
    else if (event){
    key = event.which;
    }
    else{
    return true
    }
    keychar = String.fromCharCode(key);
    if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){
    return true;
    }
    else if(("0123456789.").indexOf(keychar)>-1){
    window.status = "";
    return true;
    }
    else {
    window.status = "Field excepts numbers only";
    return false;
    }
    }

    驗證ip

    str=document.RegExpDemo.txtIP.value;
    if(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(str)==false)
    {
    window.alert('錯誤的IP地址格式');
    document.RegExpDemo.txtIP.select();
    document.RegExpDemo.txtIP.focus();
    return;
    }
    if(RegExp.$1<1 || RegExp.$1>254||RegExp.$2<0||RegExp.$2>254||RegExp.$3<0||RegExp.$3>254||RegExp.$4<1||RegExp.$4>254)
    {
    window.alert('錯誤的IP地址');
    document.RegExpDemo.txtIP.select();
    document.RegExpDemo.txtIP.focus();
    return;
    }
    //剔除 如 010.020.020.03 前面 的0
    var str=str.replace(/0(\d)/g,"$1");
    str=str.replace(/0(\d)/g,"$1");
    window.alert(str);


    //一下是取數據的類
    //Obj參數指定數據的來源(限定Table),默認第一行為字段名稱行
    //GetTableData類提供MoveNext方法,參數是表的行向上或向下移動的位數,正數向下移動,負數向上.
    //GetFieldData方法獲得指定的列名的數據
    //Sort_desc方法對指定的列按降序排列
    //Sort_asc方法對指定的列按升序排列
    //GetData方法返回字段值為特定值的數據數組,提供數據,可以在外部進行其他處理
    //Delete方法刪除當前記錄,數組減少一行
    //初始化,Obj:table的名字,Leftlen:左面多余數據長度,Rightlen:右面多余數據長度,
    function GetTableData(Obj,LeftLen,RightLen){
    var MyObj=document.all(Obj);
    var iRow=MyObj.rows.length;
    var iLen=MyObj.rows[0].cells.length;
    var i,j;

    TableData=new Array();
    for (i=0;i< iRow;i++){
    TableData[i]=new Array();
    for (j=0;j<iLen;j++){
    TableStr=MyObj.rows(i).cells(j).innerText;
    TableStr=TableStr.substring(LeftLen, TableStr.length-RightLen).Trim();
    TableStr=TableStr.replace(/ /gi,"").replace(/\r\n/ig,"");
    TableData[i][j]=TableStr;
    }
    }

    this.TableData=TableData;
    this.cols=this.TableData[0].length;
    this.rows=this.TableData.length;
    this.rowindex=0;
    }


    function movenext(Step){
    if (this.rowindex>=this.rows){
    return
    }

    if (Step=="" || typeof(Step)=="undefined") {
    if (this.rowindex<this.rows-1)
    this.rowindex++;
    return;

    }
    else{
    if (this.rowindex + Step<=this.rows-1 && this.rowindex + Step>=0 ){
    this.rowindex=this.rowindex + Step;
    }
    else
    {
    if (this.rowindex + Step<0){
    this.rowindex= 0;
    return;
    }
    if (this.rowindex + Step>this.rows-1){
    this.rowindex= this.rows-1;
    return;
    }
    }
    }
    }


    function getfielddata(Field){
    var colindex=-1;
    var i=0;
    if (typeof(Field) == "number"){
    colindex=Field;
    }
    else
    {
    for (i=0;i<this.cols && this.rowindex<this.rows ;i++){
    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }
    }
    }
    if (colindex!=-1) {
    return this.TableData[this.rowindex][colindex];
    }

    }



    function sort_desc(){//降序
    var colindex=-1;
    var highindex=-1;
    desc_array=new Array();
    var i,j;
    for (n=0; n<arguments.length; n++){
    Field=arguments[arguments.length-1-n];
    for (i=0;i<this.cols;i++){
    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }
    }
    if ( colindex==-1 )
    return;
    else
    {
    desc_array[0]=this.TableData[0];
    for(i=1;i<this.rows;i++){
    desc_array[i]=this.TableData[1];
    highindex=1;
    for(j=1;j<this.TableData.length;j++){
    if (desc_array[i][colindex]<this.TableData[j][colindex]){
    desc_array[i]=this.TableData[j];
    highindex=j;
    }

    }
    if (highindex!=-1)
    this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));
    }
    }


    this.TableData=desc_array;
    }
    return;
    }



    function sort_asc(){//升序
    var colindex=-1;
    var highindex=-1;
    var i,j;
    for (n=0; n<arguments.length; n++){
    asc_array=new Array();
    Field=arguments[arguments.length-1-n];
    for (i=0;i<this.cols;i++){
    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }
    }
    if ( colindex==-1 )
    return;
    else
    {
    asc_array[0]=this.TableData[0];
    for(i=1;i<this.rows;i++){
    asc_array[i]=this.TableData[1];
    highindex=1;
    for(j=1;j<this.TableData.length;j++){//找出最小的列值
    if (asc_array[i][colindex]>this.TableData[j][colindex]){
    asc_array[i]=this.TableData[j];
    highindex=j;

    }

    }
    if (highindex!=-1)
    this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));

    }
    }


    this.TableData=asc_array;
    }
    return;
    }



    function getData(Field,FieldValue){
    var colindex=-1;
    var i,j;

    GetData=new Array();
    if (typeof(Field)=="undefined" || typeof(FieldValue)=="undefined" ){
    return this.TableData;
    }

    for(j=0;j<this.cols;j++){
    if (this.TableData[0][j]==Field){
    colindex=j;
    }
    }
    if (colindex!=-1){

    for(i=1;i<this.rows;i++){
    if (this.TableData[i][colindex]==FieldValue){
    GetData[i]=new Array();
    GetData[i]=this.TableData[i];
    }
    }
    }
    return GetData;
    }
    function DeletE(){
    this.TableData=this.TableData.slice(0,this.rowindex).concat(this.TableData.slice(this.rowindex+1,this.TableData.length));
    this.rows=this.TableData.length;
    return;
    }
    function updateField(Field,FieldValue){
    var colindex=-1;
    var i=0;
    if (typeof(Field) == "number"){
    colindex=Field;
    }
    else
    {
    for (i=0;i<this.cols && this.rowindex<this.rows ;i++){
    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }
    }
    }
    if (colindex!=-1) {
    this.TableData[this.rowindex][colindex]=FieldValue;
    }


    }
    function movefirst(){
    this.rowindex=0;
    }
    function movelast(){
    this.rowindex=this.rows-1;
    }
    function String.prototype.Trim() {return this.replace(/(^\s*)|(\s*$)/g,"");}
    GetTableData.prototype.MoveNext = movenext;
    GetTableData.prototype.GetFieldData = getfielddata;
    GetTableData.prototype.Sort_asc = sort_asc;
    GetTableData.prototype.Sort_desc = sort_desc;
    GetTableData.prototype.GetData = getData;
    GetTableData.prototype.Delete = DeletE;
    GetTableData.prototype.UpdateField = updateField;
    GetTableData.prototype.MoveFirst = movefirst;

    具體的例子:http://202.119.73.208/NetEAn/com/test/jsprint.htm

    在每個文本框的onblur事件中調用校驗代碼,并且每個文本框中onKeyDown事件中寫一個enter轉tab函數

    //回車鍵換為tab
    function enterToTab()
    {
    if(event.srcElement.type != 'button' && event.srcElement.type != 'textarea'
    && event.keyCode == 13)
    {
    event.keyCode = 9;
    }
    }

    # re: 正則表達式 2005-07-13 09:55 youyou

    很好,很全面

    #  blue pacific poker 2005-07-23 21:40 blue pacific poker

     <h1>You may find it interesting to take a look at some helpful info about<A HREF=" pacific poker contact </A>  pacific poker contact  

    # re: 正則表達式 2005-08-31 16:18 阿平

    身份證簡單驗證
    正則表達式為: (\d{17}|\d{14})(\d|x|X|y|Y)

    # re: 正則表達式 2005-08-31 17:13 阿平

    身份證簡單驗證 (18位,15位,尾數為x, y)
    System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"(^\d{17}|^\d{14})(\d|x|X|y|Y)$");
    System.Text.RegularExpressions.Match mc = rg.Match(TextBox1.Text); 
    if(!mc.Success) 

    Response.Write ("<script>window.alert('身份證 填寫不正確!');</script>");
    }

     

    posted @ 2005-11-02 23:06 海思 閱讀(482) | 評論 (1)編輯 收藏

    做一個好的架構師一直是我的一個目標。但是,做過這么多項目后發現自己在設計上仍存在很多不足。下文是一篇不錯的文章。希望大家能夠得到一些啟示或共鳴。歡迎大家發表自己在架構設計方面的觀點。

        我們期待自己成為一個優秀的軟件模型設計者,但是,要怎樣做,又從哪里開始呢?將下列原則應用到你的軟件工程中,你會獲得立桿見影的成果。

        1. 人遠比技術重要

        你開發軟件是為了供別人使用,沒有人使用的軟件只是沒有意義的數據的集合而已。許多在軟件方面很有成就的行家在他們事業的初期卻表現平平,因為他們那時侯將主要精力都集中在技術上。顯然,構件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的東西。但是對于用戶來說,如果你設計的軟件很難使用或者不能滿足他們的需求,后臺用再好的技術也于事無補。多花點時間到軟件需求和設計一個使用戶能很容易理解的界面上。

        2. 理解你要實現的東西

        好的軟件設計人員把大多數時間花費在建立系統模型上,偶爾寫一些源代碼,但那只不過是為了驗證設計過程中所遇到的問題。這將使他們的設計方案更加可行。

        3. 謙虛是必須的品格

        你不可能知道一切,你甚至要很努力才能獲得足夠用的知識。軟件開發是一項復雜而艱巨的工作,因為軟件開發所用到的工具和技術是在不斷更新的。而且,一個人也不可能了解軟件開發的所有過程。在日常生活中你每天接觸到的新鮮事物可能不會太多。但是對于從事軟件開發的人來說,每天可以學習很多新東西(如果愿意的話)。

        4. 需求就是需求

        如果你沒有任何需求,你就不要動手開發任何軟件。成功的軟件取決于時間(在用戶要求的時間內完成)、預算和是否滿足用戶的需求。如果你不能確切知道用戶需要的是什么,或者軟件的需求定義,那么你的工程注定會失敗。

        5. 需求其實很少改變,改變的是你對需求的理解

        Object ToolSmiths公司(www.objecttoolsmiths.com)的Doug Smith常喜歡說:“分析是一門科學,設計是一門藝術”。他的意思是說在眾多的“正確”分析模型中只存在一個最“正確”分析模型可以完全滿足解決某個具體問題的需要(我理解的意思是需求分析需要一絲不茍、精確的完成,而設計的時候反而可以發揮創造力和想象力 - 譯者注)。

        如果需求經常改動,很可能是你沒有作好需求分析,并不是需求真的改變了。

        你可以抱怨用戶不能告訴你他們想得到什么,但是不要忘記,收集需求信息是你工作。

        你可以說是新來的開發人員把事情搞得一團糟,但是,你應該確定在工程的第一天就告訴他們應該做什么和怎樣去做。 如果你覺得公司不讓你與用戶充分接觸,那只能說明公司的管理層并不是真正支持你的項目。

        你可以抱怨公司有關軟件工程的管理制度不合理,但你必須了解大多同行公司是怎么做的。

        你可以借口說你們的競爭對手的成功是因為他們有了一個新的理念,但是為什么你沒先想到呢?

        需求真正改變的情況很少,但是沒有做好需求分析工作的理由卻很多。

        6. 經常閱讀

        在這個每日都在發生變化的產業中,你不可能在已取得的成就上陶醉太久。

        每個月至少讀2、3本專業雜志或者1本專業書籍。保持不落伍需要付出很多的時間和金錢,但會使你成為一個很有實力的競爭者。

        7. 降低軟件模塊間的耦合度

        高耦合度的系統是很難維護的。一處的修改引起另一處甚至更多處的變動。

        你可以通過以下方法降低程序的耦合度:隱藏實現細節,強制構件接口定義,不使用公用數據結構,不讓應用程序直接操作數據庫(我的經驗法則是:當應用程序員在寫SQL代碼的時候,你的程序的耦合度就已經很高了)。

        耦合度低的軟件可以很容易被重用、維護和擴充。

        8. 提高軟件的內聚性

        如果一個軟件的模塊只實現一個功能,那么該模塊具有高內聚性。高內聚性的軟件更容易維護和改進。

        判斷一個模塊是否有高的內聚性,看一看你是否能夠用一個簡單的句子描述它的功能就行了。如果你用了一段話或者你需要使用類似“和”、“或”等連詞,則說明你需要將該模塊細化。

        只有高內聚性的模塊才可能被重用。

        9. 考慮軟件的移植性

        移植是軟件開發中一項具體而又實際的工作,不要相信某些軟件工具的廣告宣傳(比如java 的宣傳口號write once run many 譯者注)。

        即使僅僅對軟件進行常規升級,也要把這看得和向另一個操作系統或數據庫移植一樣重要。

        記得從16位Windows移植到32位windows的“樂趣”嗎 ?當你使用了某個操作系統的特性,如它的進程間通信(IPC)策略,或用某數據庫專有語言寫了存儲過程。你的軟件和那個特定的產品結合度就已經很高了。

        好的軟件設計者把那些特有的實現細節打包隱藏起來,所以,當那些特性該變的時候,你的僅僅需要更新那個包就可以了。

        10. 接受變化

        這是一句老話了:惟一不變的只有變化。

        你應該將所有系統將可能發生的變化以及潛在需求記錄下來,以便將來能夠實現。 通過在建模期間考慮這些假設的情況,你就有可能開發出足夠強壯且容易維護的軟件。設計強壯的軟件是你最基本的目標。

        11. 不要低估對軟件規模的需求

        Internet 帶給我們的最大的教訓是你必須在軟件開發的最初階段就考慮軟件規模的可擴充性。

        今天只有100人的部門使用的應用程序,明天可能會被有好幾萬人的組織使用,下月,通過因特網可能會有幾百萬人使用它。

        在軟件設計的初期,根據在用例模型中定義的必須支持的基本事務處理,確定軟件的基本功能。然后,在建造系統的時候再逐步加入比較常用的功能。

        在設計的開始考慮軟件的規模需求,避免在用戶群突然增大的情況下,重寫軟件。

        12. 性能僅僅是很多設計因素之一

        關注軟件設計中的一個重要因素--性能,這好象也是用戶最關心的事情。一個性能不佳的軟件將不可避免被重寫。

        但是你的設計還必須具有可靠性,可用性,便攜性和可擴展性。你應該在工程開始就應該定義并區分好這些因素,以便在工作中恰當使用。性能可以是,也可以不是優先級最高的因素,我的觀點是,給每個設計因素應有的考慮。

        13. 管理接口

        “UML User Guide”(Grady Booch,Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999)中指出,你應該在開發階段的早期就定義軟件模塊之間的接口。

        這有助于你的開發人員全面理解軟件的設計結構并取得一致意見,讓各模塊開發小組相對獨立的工作。一旦模塊的接口確定之后,模塊怎樣實現就不是很重要了。

        從根本上說,如果你不能夠定義你的模塊“從外部看上去會是什么樣子”,你肯定也不清楚模塊內要實現什么。

        14. 走近路需要更長的時間

        在軟件開發中沒有捷徑可以走。 縮短你的在需求分析上花的時間,結果只能是開發出來的軟件不能滿足用戶的需求,必須被重寫。

        在軟件建模上每節省一周,在將來的編碼階段可能會多花幾周時間,因為你在全面思考之前就動手寫程序。

        你為了節省一天的測試時間而漏掉了一個bug,在將來的維護階段,可能需要花幾周甚至幾個月的時間去修復。與其如此,還不如重新安排一下項目計劃。

        避免走捷徑,只做一次但要做對(do it once by doing it right)。

        15. 別信賴任何人

        產品和服務銷售公司不是你的朋友,你的大部分員工和高層管理人員也不是。

        大部分產品供應商希望把你牢牢綁在他們的產品上,可能是操作系統,數據庫或者某個開發工具。

        大部分的顧問和承包商只關心你的錢并不是你的工程(停止向他們付款,看一看他們會在周圍呆多長時間)。

        大部分程序員認為他們自己比其他人更優秀,他們可能拋棄你設計的模型而用自己認為更好的。

        只有良好的溝通才能解決這些問題。

        要明確的是,不要只依靠一家產品或服務提供商,即使你的公司(或組織)已經在建模、文檔和過程等方面向那個公司投入了很多錢。

        16. 證明你的設計在實踐中可行

        在設計的時候應當先建立一個技術原型, 或者稱為“端到端”原型。以證明你的設計是能夠工作的。

        你應該在開發工作的早期做這些事情,因為,如果軟件的設計方案是不可行的,在編碼實現階段無論采取什么措施都于事無補。技術原型將證明你的設計的可行性,從而,你的設計將更容易獲得支持。

        17. 應用已知的模式

        目前,我們有大量現成的分析和設計模式以及問題的解決方案可以使用。

        一般來說,好的模型設計和開發人員,都會避免重新設計已經成熟的并被廣泛應用的東西。 http://www.ambysoft.com/processPatternsPage.html 收藏了許多開發模式的信息。

        18. 研究每個模型的長處和弱點

        目前有很多種類的模型可以使用,用例捕獲的是系統行為需求,數據模型則描述支持一個系統運行所需要的數據構成。你可能會試圖在用例中加入實際數據描述,但是,這對開發者不是非常有用。同樣,數據模型對描述軟件需求來說是無用的。每個模型在你建模過程中有其相應的位置,但是,你需要明白在什么地方,什么時候使用它們。

        19. 在現有任務中應用多個模型

        當你收集需求的時候,考慮使用用例模型,用戶界面模型和領域級的類模型。

        當你設計軟件的時候,應該考慮制作類模型,順序圖、狀態圖、協作圖和最終的軟件實際物理模型。

        程序設計人員應該慢慢意識到,僅僅使用一個模型而實現的軟件要么不能夠很好地滿足用戶的需求,要么很難擴展。

        20. 教育你的聽眾

        你花了很大力氣建立一個很成熟的系統模型,而你的聽眾卻不能理解它們,甚至更糟-連為什么要先建立模型都不知道。那么你的工作是毫無意義的。 教給你開發人員基本的建模知識;否則,他們會只看看你畫的漂亮圖表,然后繼續編寫不規范的程序。

        另外, 你還需要告訴你的用戶一些需求建模的基礎知識。給他們解釋你的用例(uses case)和用戶界面模型,以使他們能夠明白你要表達地東西。當每個人都能使用一個通用的設計語言的時候(比如UML-譯者注),你的團隊才能實現真正的合作。

        21. 帶工具的傻瓜還是傻瓜

        你給我CAD/CAM工具,請我設計一座橋。但是,如果那座橋建成的話,我肯定不想當第一個從橋上過的人,因為我對建筑一竅不通。

        使用一個很優秀的CASE工具并不能使你成為一個建模專家,只能使你成為一個優秀CASE工具的使用者。成為一個優秀的建模專家需要多年的積累,不會是一周針對某個價值幾千美元工具的培訓。一個優秀的CASE工具是很重要,但你必須學習使用它,并能夠使用它設計它支持的模型。

        22. 理解完整的過程

        好的設計人員應該理解整個軟件過程,盡管他們可能不是精通全部實現細節。軟件開發是一個很復雜的過程,除了編程、建模、測試等你擅長工作外,還有很多工作要做。好的設計者需要考慮全局。必須從長遠考慮如何使軟件滿足用戶需要,如何提供維護和技術支持等。

        23. 常做測試,早做測試

        如果測試對你的軟件來說是無所謂的,那么你的軟件多半也沒什么必要被開發出來。建立一個技術原型供技術評審使用,以檢驗你的軟件模型。在軟件生命周期中,越晚發現的錯誤越難修改,修改成本越昂貴。盡可能早的做測試是很值得的。

        24. 把你的工作歸檔

        不值得歸檔的工作往往也不值得做。歸檔你的設想,以及根據設想做出的決定;歸檔軟件模型中很重要但不很明顯的部分。給每個模型一些概要描述以使別人很快明白模型所表達的內容。

        25. 技術會變,基本原理不會

        如果有人說“使用某種開發語言、某個工具或某某技術,我們就不需要再做需求分析,建模,編碼或測試”。不要相信,這只說明他還缺乏經驗。拋開技術和人的因素,實際上軟件開發的基本原理自20世紀70年代以來就沒有改變過。你必須還定義需求,建模,編碼,測試,配置,面對風險,發布產品,管理工作人員等等。

        軟件建模技術是需要多年的實際工作才能完全掌握的。好在你可以從我的建議開始,完善你們自己的軟件開發經驗。以雞湯開始,加入自己的蔬菜。然后,開始享受你自己的豐盛晚餐吧。
        作者: Scott Ambler著 樂林峰 譯  來源: umlchina    風之語 轉載
    posted @ 2005-10-10 22:17 海思 閱讀(123) | 評論 (0)編輯 收藏

    引自:http://kb.csdn.net/java/Articles/200507/fd779837-9a8d-448d-8ef9-b4c6ca501fb7.html
    http://blog.csdn.net/goldrain/
    WEB層是通過調用業務層來實現一次業務操作的。所以WEB是依賴業務層的實現的。如何解偶使兩者能獨立開發而互不影響?我傾向使用統一的調用接口:使用一個命令字符串,加一堆DTO參數就能調用業務,然后取得DTO返回值。這里一個業務的調用就是一個命令的執行Ofbiz的service engine就是這樣的做法,而且很成功,這也是一種關注業務的理念。使用統一的調用接口,WEB層的開發就可獨立進行了,不用依賴業務層就能進行編譯。而且這種做法還帶來了更多的好處:權限,日志都能集中管理;將來可能的話,分布式部署業務層也變得方便,因為所有業務都是一個命令接口調用。

    MVC架構中,展示層View的技術是五花八門,可選擇的太多太多,jsp可能是用的最多的,模版語言也多種多樣,我分為兩類:腳本模版和簡單模版。而簡單模版的理念則是將頁面邏輯從模版中抽取出來,模版只是用固定的布局展示數據,保證“所見即所得”的開發效果;


    較復雜的web交互struts和webwork是如何做的
    對付較復雜的交互,我一般讓struts的formBean的scope設置為session,經過多次頁面交互后,從這個組裝好數據的formBean里獲取業務需要的參數,然后調用業務層;
    其中struts在每次映射值前能先運行reset,把需要清空的字段清空以便接受傳進來的參數,而需要保持的數據就不用清空,感覺挺方便的;
    然后在業務完成后,將session中的formBean清掉。
    所以自我感覺作復雜的交互,使用session scope的formBean,struts還是挺管用的,因為這時的formBean能在用戶頁面交互時仍然能保持數據。我對webwork不很了解,大致看了些資料,里面沒有formBean的概念,也就沒有sesseion scope的概念了,不知webwork對保持客戶端多次交互提交的數據,是否有方便的做法?
    研究過了webwork,可以做到,而且更優雅:
    使用ioc功能,將session中的對象映射到action屬性中即可

    posted @ 2005-09-11 17:41 海思 閱讀(647) | 評論 (0)編輯 收藏

    僅列出標題
    共2頁: 上一頁 1 2 
    主站蜘蛛池模板: 4480yy私人影院亚洲| 亚洲色精品aⅴ一区区三区| 亚洲剧情在线观看| 久久中文字幕免费视频| 国产亚洲综合色就色| 国产精品成人啪精品视频免费| 四虎国产精品免费视| 亚洲AV无码国产精品永久一区| 人禽杂交18禁网站免费| 亚洲一区免费视频| 久久不见久久见免费影院| 久久精品国产亚洲AV久| 成人免费激情视频| 亚洲一区在线视频观看| 热久久精品免费视频| 大桥未久亚洲无av码在线| 免费吃奶摸下激烈视频| 香蕉国产在线观看免费| 亚洲自偷自偷偷色无码中文| 久草免费福利视频| 亚洲综合激情九月婷婷| 一个人看的www在线观看免费| 亚洲一区二区三区高清在线观看| 暖暖免费高清日本中文| 理论秋霞在线看免费| 亚洲精品无码久久千人斩| 免费无码毛片一区二区APP| 亚洲av无码电影网| 免费人成年激情视频在线观看| 中文在线日本免费永久18近| 久久亚洲精品中文字幕| 嫩草影院免费观看| 成人国产网站v片免费观看| 亚洲AV无码欧洲AV无码网站| 午夜国产精品免费观看| 香蕉视频免费在线| 1区1区3区4区产品亚洲 | 999任你躁在线精品免费不卡| 亚洲免费中文字幕| 亚洲精品专区在线观看| 97青青草原国产免费观看|