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 海思 阅读(176) | 评论 (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 海思 阅读(331) | 评论 (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 海思 阅读(417) | 评论 (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 海思 阅读(109) | 评论 (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 海思 阅读(237) | 评论 (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 海思 阅读(467) | 评论 (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 海思 阅读(118) | 评论 (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 海思 阅读(638) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2