| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 1 | 2 | 3 | 4 | 5 |
引用
邵波的空間 的 java中文件操作大全
一.獲得控制臺用戶輸入的信息
/**獲得控制臺用戶輸入的信息 * @return * @throws IOException */ public String getInputMessage() throws IOException...{ System.out.println("請輸入您的命令∶"); byte buffer[]=new byte[1024]; int count=System.in.read(buffer); char[] ch=new char[count-2];//最后兩位為結束符,刪去不要 for(int i=0;i<count-2;i++) ch[i]=(char)buffer[i]; String str=new String(ch); return str;
- /**獲得控制臺用戶輸入的信息
- * @return
- * @throws IOException
- */
- public String getInputMessage() throws IOException...{
- System.out.println("請輸入您的命令∶");
- byte buffer[]=new byte[1024];
- int count=System.in.read(buffer);
- char[] ch=new char[count-2];//最后兩位為結束符,刪去不要
- for(int i=0;i<count-2;i++)
- ch[i]=(char)buffer[i];
- String str=new String(ch);
- return str;
可以返回用戶輸入的信息,不足之處在于不支持中文輸入,有待進一步改進
二.復制文件
以文件流的方式復制文件
**以文件流的方式復制文件 * @param src 文件源目錄 * @param dest 文件目的目錄 * @throws IOException */ public void copyFile(String src,String dest) throws IOException...{ FileInputStream in=new FileInputStream(src); File file=new File(dest); if(!file.exists()) file.createNewFile(); FileOutputStream out=new FileOutputStream(file); int c; byte buffer[]=new byte[1024]; while((c=in.read(buffer))!=-1)...{ for(int i=0;i<c;i++) out.write(buffer[i]); } in.close(); out.close();
- **以文件流的方式復制文件
- * @param src 文件源目錄
- * @param dest 文件目的目錄
- * @throws IOException
- */
- public void copyFile(String src,String dest) throws IOException...{
- FileInputStream in=new FileInputStream(src);
- File file=new File(dest);
- if(!file.exists())
- file.createNewFile();
- FileOutputStream out=new FileOutputStream(file);
- int c;
- byte buffer[]=new byte[1024];
- while((c=in.read(buffer))!=-1)...{
- for(int i=0;i<c;i++)
- out.write(buffer[i]);
- }
- in.close();
- out.close();
該方法經過測試,支持中文處理,并且可以復制多種類型,比如txt,xml,jpg,doc等多種格式
三.寫文件
1.利用PrintStream寫文件
/** * 文件輸出示例 */ public void PrintStreamDemo()...{ try ...{ FileOutputStream out=new FileOutputStream("D:/test.txt"); PrintStream p=new PrintStream(out); for(int i=0;i<10;i++) p.println("This is "+i+" line"); } catch (FileNotFoundException e) ...{ e.printStackTrace(); } }
- /**
- * 文件輸出示例
- */
- public void PrintStreamDemo()...{
- try ...{
- FileOutputStream out=new FileOutputStream("D:/test.txt");
- PrintStream p=new PrintStream(out);
- for(int i=0;i<10;i++)
- p.println("This is "+i+" line");
- } catch (FileNotFoundException e) ...{
- e.printStackTrace();
- }
- }
2.利用StringBuffer寫文件
public void StringBufferDemo() throws IOException......{ File file=new File("/root/sms.log"); if(!file.exists()) file.createNewFile(); FileOutputStream out=new FileOutputStream(file,true); for(int i=0;i<10000;i++)......{ StringBuffer sb=new StringBuffer(); sb.append("這是第"+i+"行:前面介紹的各種方法都不關用,為什么總是奇怪的問題 "); out.write(sb.toString().getBytes("utf-8")); } out.close(); }
- public void StringBufferDemo() throws IOException......{
- File file=new File("/root/sms.log");
- if(!file.exists())
- file.createNewFile();
- FileOutputStream out=new FileOutputStream(file,true);
- for(int i=0;i<10000;i++)......{
- StringBuffer sb=new StringBuffer();
- sb.append("這是第"+i+"行:前面介紹的各種方法都不關用,為什么總是奇怪的問題 ");
- out.write(sb.toString().getBytes("utf-8"));
- }
- out.close();
- }
該方法可以設定使用何種編碼,有效解決中文問題。
四.文件重命名
/** *//**文件重命名 * @param path 文件目錄 * @param oldname 原來的文件名 * @param newname 新文件名 */ public void renameFile(String path,String oldname,String newname)...{ if(!oldname.equals(newname))...{//新的文件名和以前文件名不同時,才有必要進行重命名 File oldfile=new File(path+"/"+oldname); File newfile=new File(path+"/"+newname); if(newfile.exists())//若在該目錄下已經有一個文件和新文件名相同,則不允許重命名 System.out.println(newname+"已經存在!"); else...{ oldfile.renameTo(newfile); } } }
- /** *//**文件重命名
- * @param path 文件目錄
- * @param oldname 原來的文件名
- * @param newname 新文件名
- */
- public void renameFile(String path,String oldname,String newname)...{
- if(!oldname.equals(newname))...{//新的文件名和以前文件名不同時,才有必要進行重命名
- File oldfile=new File(path+"/"+oldname);
- File newfile=new File(path+"/"+newname);
- if(newfile.exists())//若在該目錄下已經有一個文件和新文件名相同,則不允許重命名
- System.out.println(newname+"已經存在!");
- else...{
- oldfile.renameTo(newfile);
- }
- }
- }
五.轉移文件目錄
轉移文件目錄不等同于復制文件,復制文件是復制后兩個目錄都存在該文件,而轉移文件目錄則是轉移后,只有新目錄中存在該文件。
if(!oldpath.equals(newpath))...{ File oldfile=new File(oldpath+"/"+filename); File newfile=new File(newpath+"/"+filename); if(newfile.exists())...{//若在待轉移目錄下,已經存在待轉移文件 if(cover)//覆蓋 oldfile.renameTo(newfile); else System.out.println("在新目錄下已經存在:"+filename); } else...{ oldfile.renameTo(newfile); } } } /**轉移文件目錄 * @param filename 文件名 * @param oldpath 舊目錄 * @param newpath 新目錄 * @param cover 若新目錄下存在和轉移文件具有相同文件名的文件時,是否覆蓋新目錄下文件,cover=true將會覆蓋原文件,否則不操作 */ public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{ if(!oldpath.equals(newpath))...{ File oldfile=new File(oldpath+"/"+filename); File newfile=new File(newpath+"/"+filename); if(newfile.exists())...{//若在待轉移目錄下,已經存在待轉移文件 if(cover)//覆蓋 oldfile.renameTo(newfile); else System.out.println("在新目錄下已經存在:"+filename); } else...{ oldfile.renameTo(newfile); } } }
六.讀文件
1.利用FileInputStream讀取文件
File file=new File(path); if(!file.exists()||file.isDirectory()) throw new FileNotFoundException(); FileInputStream fis=new FileInputStream(file); byte[] buf = new byte[1024]; StringBuffer sb=new StringBuffer(); while((fis.read(buf))!=-1)...{ sb.append(new String(buf)); buf=new byte[1024];//重新生成,避免和上次讀取的數據重復 } return sb.toString(); } /** *//**讀文件 * @param path * @return * @throws IOException */ public String FileInputStreamDemo(String path) throws IOException...{ File file=new File(path); if(!file.exists()||file.isDirectory()) throw new FileNotFoundException(); FileInputStream fis=new FileInputStream(file); byte[] buf = new byte[1024]; StringBuffer sb=new StringBuffer(); while((fis.read(buf))!=-1)...{ sb.append(new String(buf)); buf=new byte[1024];//重新生成,避免和上次讀取的數據重復 } return sb.toString(); }
2.利用BufferedReader讀取在IO操作,利用BufferedReader和BufferedWriter效率會更高一點
引用
邵波的空間 的 Javamail操作指南
怎樣才算比較完整的Javamail操作指南?我想應該包括絕大多數基本的email操作,能夠應付一般的應用。在本指南中打算囊括以下內容:● 發送email:包括文本郵件、HTML郵件、帶附件的郵件、SMTP驗證
● 接收email:pop3遠程連接、收取不同MIME的郵件、處理附件我想有了上述功能的介紹,應該可以應付很多email的相關應用了。所以請允許我給本文擬了一個比較狂妄的名字,這樣才能保證收視率,。還是那句話,寫這個post的原因就是沒有在網上看到更全面的,你看過的話記得要告訴我。
下面的所有例子都經過實際測試,你可以說它寫得不夠OO,不夠plugable,但是它的確是可以參考的。自從有了javamail,發垃圾郵件就方便多了。本文代碼多說明少,這倒不是我偷懶,而是很多東西都涉及pop3等協議的規范,如果不了解這些規范的話,由的東西我實在不知道怎么跟你解釋;如果了解的話,那我基本上就不用再解釋。所以本著實用的原則就省略了,由興趣的話自己去翻翻協議規范。
廢話少說,首先需要配置環境。需要的包是mail.jar和activation.jar。高版本的J2SDK EE自帶。地址嘛,再java.sun.com上搜索一下,很容易找到。放到classpath中就KO。
一、 郵件的發送
下面了弄個發郵件的Hello World,熱熱身:
/*************
Name:TextMailSender.java
Author:Bromon
Version:1.0
Date:2004-4-26
Note:發送email到bromon@163.com,需要安裝SMTP服務器
*************/
package org.bromon.mail;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class TextMailSender
{
public static void main(String args[])
{
try
{
Properties prop=new Properties();
//指定要使用的SMTP服務器為bromon2k
prop.put("mail.smtp.host","bromon2k");
Session mailSession=Session.getDefaultInstance(prop);//發件人地址
InternetAddress from=new InternetAddress("bromon@bromon2k");
//收件人地址
InternetAddress to=new InternetAddress("bromon@163.com");
MimeMessage msg=new MimeMessage(mailSession);
msg.setFrom(from);
msg.addRecipient(javax.mail.Message.RecipientType.TO,to);
//發信日期
msg.setSentDate(new java.util.Date());
//title
msg.setSubject("你好");
//郵件正文
msg.setText("hello,bromon");
Transport.send(msg);
}catch(Exception e)
{
System.out.println(e);
}
}
}
程序很簡單,但是它是不能運行的(倒)。除非你的機器上安裝了一個SMTP服務器,而且你的機器還叫做bromon2k。寫這么一段不能執行的程序不是為了找打,而是讓各位對javamail有個基本印象,我就懶得改了。下面演示的是如何通過163、sohu等email服務商提供的免費郵箱來發郵件,基本操作和上面的一樣,只是多一個SMTP驗證而已:/*
* Created on 2004-4-26
*/
package org.bromon.mail;
import javax.mail.*;
import java.util.*;
import javax.mail.internet.*;/**
* @author Bromon
*/
public class SenderWithSMTPVer
{
String host="";
String user="";
String password="";public void setHost(String host)
{
this.host=host;
}public void setAccount(String user,String password)
{
this.user=user;
this.password=password;
}public void send(String from,String to,String subject,String content)
{
Properties props = new Properties();
props.put("mail.smtp.host", host);//指定SMTP服務器
props.put("mail.smtp.auth", "true");//指定是否需要SMTP驗證
try
{
Session mailSession = Session.getDefaultInstance(props);
mailSession.setDebug(true);//是否在控制臺顯示debug信息
Message message=new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from));//發件人
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//收件人
message.setSubject(subject);//郵件主題
message.setText(content);//郵件內容
message.saveChanges();
Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}catch(Exception e)
{
System.out.println(e);
}
}public static void main(String args[])
{
SenderWithSMTPVer sm=new SenderWithSMTPVer();sm.setHost("smtp.163.com");//指定要使用的郵件服務器
sm.setAccount("abc","123");//指定帳號和密碼/*
* @param String 發件人的地址
* @param String 收件人地址
* @param String 郵件標題
* @param String 郵件正文
*/
sm.send("abc@163.com","bromon@163.com","標題","內容");
}}
這段程序好像也不需要解釋了吧,把SMTP地址、帳號、密碼等配置信息寫到Properties里面,Java里面很多API都需要這么干,比如再程序中加入對代理服務器的支持等。上面的程序修改一下服務器地址、帳號、密碼就可以使用,非常簡單。
如何發送一個HTML格式的Email呢?也很簡單,再郵件正文中寫入HTML代碼,然后指定郵件的ContentType就OK,下面只給出關鍵代碼:
………..
MimeMessage msg=new MimeMessage(mailSession);
msg.setContent(content,"text/html");
msg.setText(“<html><body><h1>下面的,你們好嗎?</body></html>”);
………..下面是發送帶有附件的email,稍微復雜一點,而且和前面的程序有一些不同,請仔細一點,同時需要一點IO的知識。相同的代碼就不在列出,只寫關鍵部分,誰都想偷懶不是?
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
……….
MimeMessage msg=new MimeMessage(mailSession);
msg.setSentDate(new Date());
msg.setSubject("hello");MimeBodyPart textBodyPart=new MimeBodyPart();
textBodyPart.setText(“郵件正文”);MimeBodyPart fileBodyPart=new MimeBodyPart();
FileDataSource fds=new FileDataSource("GIS.rar");//要發送的附件
fileBodyPart.setDataHandler(new DataHandler(fds));
fileBodyPart.setFileName(fds.getName());
Multipart container=new MimeMultipart();
container.addBodyPart(textBodyPart);
container.addBodyPart(fileBodyPart);
msg.setContent(container);
Transport.send(msg);
…………二、 郵件的收取
這里的msg由兩個MimeBodyPart構成,這個東西解釋起來基本上比較難,如果不了解相關的規范就不太好解釋,如果了解的話,我就不用解釋了,這個這個………唉。
通常情況下我們都使用pop3協議來收郵件,IMAP嘛現在就不涉及了。收郵件的功能雖然我用了很多時間才基本搞清楚,不過講起來就so easy了,一個程序就可以基本包括。
郵件大致可以分三種:純文本郵件、含有其他數據的文本郵件、含有附件的郵件。
CODE
/*
* Created on 2004-4-26
*/
package org.bromon.mail;
import javax.mail.*;
import java.util.*;
import java.io.*;/**
* @author Bromon
*/
public class Receiver
{
Folder inbox;
Store store;//連接郵件服務器,獲得所有郵件的列表
public Message[] getMail(String host,String name,String password) throws Exception
{
Properties prop=new Properties();
prop.put("mail.pop3.host",host);
Session session=Session.getDefaultInstance(prop);
store=session.getStore("pop3");
store.connect(host,name,password);
inbox=store.getDefaultFolder().getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
Message[] msg=inbox.getMessages();
FetchProfile profile=new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg,profile);
return(msg);
}//處理任何一種郵件都需要的方法
private void handle(Message msg) throws Exception
{
System.out.println("郵件主題:"+msg.getSubject());
System.out.println("郵件作者:"+msg.getFrom()[0].toString());
System.out.println("發送日期:"+msg.getSentDate());
}//處理文本郵件
public void handleText(Message msg) throws Exception
{
this.handle(msg);
System.out.println("郵件內容:"+msg.getContent());
}//處理Multipart郵件,包括了保存附件的功能
public void handleMultipart(Message msg) throws Exception
{
String disposition;
BodyPart part;
Multipart mp=(Multipart)msg.getContent();
int mpCount=mp.getCount();//Miltipart的數量,用于除了多個part,比如多個附件
for(int m=0;m<mpCount;m++)
{
this.handle(msg);
part=mp.getBodyPart(m);
disposition=part.getDisposition();
if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判斷是否有附件
{
//this.saveAttach(part);//這個方法負責保存附件,注釋掉是因為附件可能有病毒,請清理信箱之后再取掉注釋
}else{
System.out.println(part.getContent());
}
}
}private void saveAttach(BodyPart part) throws Exception
{
String temp=part.getFileName();//得到未經處理的附件名字
String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
//文件名一般都經過了base64編碼,下面是解碼
String fileName=this.base64Decoder(s);
System.out.println("有附件:"+fileName);
InputStream in=part.getInputStream();
FileOutputStream writer=new FileOutputStream(new File(fileName));
byte[] content=new byte[255];
int read=0;
while((read=in.read(content))!=-1)
{
writer.write(content);
}
writer.close();
in.close();
}//base64解碼
private String base64Decoder(String s) throws Exception
{
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] b=decoder.decodeBuffer(s);
return(new String(b));
}//關閉連接
public void close() throws Exception
{
if(inbox!=null)
{
inbox.close(false);
}
if(store!=null)
{
store.close();
}
}public static void main(String args[])
{
String host="pop.163.com";
String name="bromon";
String password="My password";
Receiver receiver=new Receiver();
try
{
Message[] msg=receiver.getMail(host,name,password);
for(int i=0;i<msg.length;i++)
{
if(msg[i].isMimeType("text/*"))//判斷郵件類型
{
receiver.handleText(msg[i]);
}else{
receiver.handleMultipart(msg[i]);
}
System.out.println("****************************");
}
receiver.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
沒有習慣讀java代碼的兄弟可能會覺得麻煩了一點,其中有個小問題,下載的附件會再文件名后面加上一個”#”符號,不知道這是javamail的特別處理還是pop3的規范。通過程序更改文件名很簡單,就不說了。對于email還有很多其他的操作,可以自己取查看一下javadoc,我就不影響大家探索的樂趣了。在Properties里配置代理服務器,可以讓程序通過代理收發郵件,一般的HTTP、socks 4、socks 5都支持。
引用
邵波的空間 的 java的幾種對象(PO,VO,DAO,BO,POJO)解釋
一、PO:persistant object 持久對象,可以看成是與數據庫中的表相映射的java對象。最簡單的PO就是對應數據庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對數據庫的操作。
二、VO:value object值對象。通常用于業務層之間的數據傳遞,和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不,這根據業務的需要.個人覺得同DTO(數據傳輸對象),在web上傳遞。
三、DAO:data access object 數據訪問對象,此對象用于訪問數據庫。通常和PO結合使用,DAO中包含了各種數據庫的操作方法。通過它的方法,結合PO對數據庫進行相關的操作。
四、BO:business object 業務對象,封裝業務邏輯的java對象,通過調用DAO方法,結合PO,VO進行業務操作。
五、POJO:plain ordinary java object 簡單無規則java對象,我個人覺得它和其他不是一個層面上的東西,VO和PO應該都屬于它。
O/R Mapping 是 Object Relational Mapping(對象關系映射)的縮寫。通俗點講,就是將對象與關系數據庫綁定,用對象來表示關系數據。在O/R Mapping的世界里,有兩個基本的也是重要的東東需要了解,即VO,PO。
VO,值對象(Value Object),PO,持久對象(Persisent Object),它們是由一組屬性和屬性的get和set方法組成。從結構上看,它們并沒有什么不同的地方。但從其意義和本質上來看是完全不同的。
1.VO是用new關鍵字創建,由GC回收的。
PO則是向數據庫中添加新數據時創建,刪除數據庫中數據時削除的。并且它只能存活在一個數據庫連接中,斷開連接即被銷毀。
2.VO是值對象,精確點講它是業務對象,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為數據提供一個生存的地方。
PO則是有狀態的,每個屬性代表其當前的狀態。它是物理數據的對象表示。使用它,可以使我們的程序與物理數據解耦,并且可以簡化對象數據與物理數據之間的轉換。
3.VO的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的數據的名稱。
PO的屬性是跟數據庫表的字段一一對應的。
PO對象需要實現序列化接口。
引用
邵波的空間 的 JS通用表單驗證函數
Check.js JS函數文件
////////////////////////////////////////////////////////////////////////////////
/*
*--------------- 客戶端表單通用驗證CheckForm(oForm) -----------------
* 功能:通用驗證所有的表單元素.
* 使用:
* <form name="form1" onsubmit="return CheckForm(this)">
* <input type="text" name="id" check="^\S+$" warning="id不能為空,且不能含有空格">
* <input type="submit">
* </form>
* author:wanghr100(灰豆寶寶.net)
* email:wanghr100@126.com
* update:19:28 2004-8-23
* 注意:寫正則表達式時一定要小心.不要讓"有心人"有空子鉆.
* 已實現功能:
* 對text,password,hidden,file,textarea,select,radio,checkbox進行合法性驗證
* 待實現功能:把正則表式寫成個庫.
*--------------- 客戶端表單通用驗證CheckForm(oForm) -----------------
*/
////////////////////////////////////////////////////////////////////////////////
//主函數
function CheckForm(oForm)
{
var els = oForm.elements;
//遍歷所有表元素
for(var i=0;i<els.length;i++)
{
//是否需要驗證
if(els[i].check)
{
//取得驗證的正則字符串
var sReg = els[i].check;
//取得表單的值,用通用取值函數
var sVal = GetValue(els[i]);
//字符串->正則表達式,不區分大小寫
var reg = new RegExp(sReg,"i");
if(!reg.test(sVal))
{
//驗證不通過,彈出提示warning
alert(els[i].warning);
//該表單元素取得焦點,用通用返回函數
GoBack(els[i])
return false;
}
}
}
}
//通用取值函數分三類進行取值
//文本輸入框,直接取值el.value
//單多選,遍歷所有選項取得被選中的個數返回結果"00"表示選中兩個
//單多下拉菜單,遍歷所有選項取得被選中的個數返回結果"0"表示選中一個
function GetValue(el)
{
//取得表單元素的類型
var sType = el.type;
switch(sType)
{
case "text":
case "hidden":
case "password":
case "file":
case "textarea": return el.value;
case "checkbox":
case "radio": return GetValueChoose(el);
case "select-one":
case "select-multiple": return GetValueSel(el);
}
//取得radio,checkbox的選中數,用"0"來表示選中的個數,我們寫正則的時候就可以通過0{1,}來表示選中個數
function GetValueChoose(el)
{
var sValue = "";
//取得第一個元素的name,搜索這個元素組
var tmpels = document.getElementsByName(el.name);
for(var i=0;i<tmpels.length;i++)
{
if(tmpels[i].checked)
{
sValue += "0";
}
}
return sValue;
}
//取得select的選中數,用"0"來表示選中的個數,我們寫正則的時候就可以通過0{1,}來表示選中個數
function GetValueSel(el)
{
var sValue = "";
for(var i=0;i<el.options.length;i++)
{
//單選下拉框提示選項設置為value=""
if(el.options[i].selected && el.options[i].value!="")
{
sValue += "0";
}
}
return sValue;
}
}
//通用返回函數,驗證沒通過返回的效果.分三類進行取值
//文本輸入框,光標定位在文本輸入框的末尾
//單多選,第一選項取得焦點
//單多下拉菜單,取得焦點
function GoBack(el)
{
//取得表單元素的類型
var sType = el.type;
switch(sType)
{
case "text":
case "hidden":
case "password":
case "file":
case "textarea": el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();
case "checkbox":
case "radio": var els = document.getElementsByName(el.name);els[0].focus();
case "select-one":
case "select-multiple":el.focus();
}
}
demo.htm 演示文件
<script language="JavaScript" src="Check.js"></script>
通用表單函數測試:
<form name="form1" onsubmit="return CheckForm(this)">
test:<input type="text" name="test">不驗證<br>
賬號:<input type="text" check="^\S+$" warning="賬號不能為空,且不能含有空格" name="id">不能為空<br>
密碼:<input type="password" check="\S{6,}" warning="密碼六位以上" name="id">六位以上<br>
電話:<input type="text" check="^\d+$" warning="電話號碼含有非法字符" name="number" value=""><br>
相片上傳:<input type="file" check="(.*)(\.jpg|\.bmp)$" warning="相片應該為JPG,BMP格式的" name="pic" value="1"><br>
出生日期:<input type="text" check="^\d{4}\-\d{1,2}-\d{1,2}$" warning="日期格式2004-08-10" name="dt" value="">日期格式2004-08-10<br>
省份:
<select name="sel" check="^0$" warning="請選擇所在省份">
<option value="">請選擇
<option value="1">福建省
<option value="2">湖北省
</select>
<br>
選擇你喜歡的運動:<br>
游泳<input type="checkbox" name="c" check="^0{2,}$" warning="請選擇2項或以上">
籃球<input type="checkbox" name="c">
足球<input type="checkbox" name="c">
排球<input type="checkbox" name="c">
<br>
你的學歷:
大學<input type="radio" name="r" check="^0$" warning="請選擇一項學歷">
中學<input type="radio" name="r">
小學<input type="radio" name="r">
<br>
個人介紹:
<textarea name="txts" check="^[\s|\S]{20,}$" warning="個人介紹不能為空,且不少于20字"></textarea>20個字以上
<input type="submit">
</form>不管是動態網站,還是其它B/S結構的系統,都離不開表單
表單做為客戶端向服務器提交數據的載體擔當相當重要的角色.
這就引出了一個問題,提交的數據合法嗎?擺在我們面前的問題就是驗證這些數據
保證所提交的數據是合法的.所以,我們寫了一個大堆的驗證函數.當我們開始新的一個
項目的開發時,我們又得寫一大堆的驗證函數,然后再調試這一大堆的函數...
本文將介紹一種方法來提高我的代碼的可重用性,提高我們的開發效率.
個人以為表單的驗證應該包含兩部分:
第一,判斷用戶輸入的數據是否合法.
第二,提示用戶你的數據為什么是不合法的.
所以,我們的通用表單驗證函數要實現的功能就是:
第一,取得用戶輸入的數據GetValue(el)
第二,驗證用戶的數據CheckForm(oForm)
IE支持自定義屬性,這就是這個通用函數實現的基礎
我們可以在表單元素上加入描述自身信息的屬性.有點像XML吧.
check屬性:該屬性用于存儲數據合法性的正則表達式.
warning屬性:該性性用于存儲出錯誤提示信息.
第三,返回有誤的表單提示GoBack(el)
這三個步驟的觸發事件是onsubmit,記住是return CheckForm(this)
搞錯了就全功盡棄了 :)
<form onsubmit="return CheckForm(this)">
寫到這里,整體框架就出來了,通過取得表單元素的check屬性,取得字符串,構建正則表達式.再驗證其值.如果通過驗證就提交,如是數據不合法則取得表單元素的warning屬性,產生提示信息.并返回到該表單元素.整個的框架也比較簡單.
我們要做的就是寫好正則表達式!
接下來我們來分析一下所有的表單元素
按其共性,我們將它們分為三類
每類表單的特點不一樣,我們的目標就是寫出通用的.
1.文輸入框Text
<input type="text" name="txt">
<input type="password" name="pwd">
<input type="hidden" name="hid">
<input type="file" name="myfile">
<textarea name="txts"></textarea>
2.單多選框Choose
<input type="checkbox" name="c">
<input type="checkbox" name="c">
<input type="radio" name="r">
<input type="radio" name="r">
3.單多下拉菜單Select
<select name="sel"></select>
<select name="sels" multiple></select>
講了一堆"大道理"太抽象了,代碼更有說服力!
引用
邵波的空間 的 JavaScript密碼強度檢測源代碼
1.Body代碼部分
- <body>
- <h4>密碼強度檢測</h4>
- <table width="100%" border="0" cellspacing="1" cellpadding="0">
- <tr>
- <td width="100" align="right">強度顯示:</td>
- <td>
- <script language="javascript">
- var ps = new PasswordStrength();
- ps.setSize("200","20");
- ps.setMinLength(5);
- </script>
- </td>
- </tr>
- <tr>
- <td align="right">密碼檢測:</td>
- <td><input name="pwd" type="password" id="pwd" style="width:200px" onKeyUp="ps.update(this.value);"></td>
- </tr>
- </table>
- </body>
2.JS代碼部分
- //密碼強度;
- function PasswordStrength(showed){
- this.showed = (typeof(showed) == "boolean")?showed:true;
- this.styles = new Array();
- this.styles[0] = {backgroundColor:"#EBEBEB",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #BEBEBE",borderBottom:"solid 1px #BEBEBE"};
- this.styles[1] = {backgroundColor:"#FF4545",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #BB2B2B",borderBottom:"solid 1px #BB2B2B"};
- this.styles[2] = {backgroundColor:"#FFD35E",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #E9AE10",borderBottom:"solid 1px #E9AE10"};
- this.styles[3] = {backgroundColor:"#95EB81",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #3BBC1B",borderBottom:"solid 1px #3BBC1B"};
- this.labels= ["弱","中","強"];
- this.divName = "pwd_div_"+Math.ceil(Math.random()*100000);
- this.minLen = 5;
- this.width = "150px";
- this.height = "16px";
- this.content = "";
- this.selectedIndex = 0;
- this.init();
- }
- PasswordStrength.prototype.init = function(){
- var s = '<table cellpadding="0" id="'+this.divName+'_table" cellspacing="0" style="width:'+this.width+';height:'+this.height+';">';
- s += '<tr>';
- for(var i=0;i<3;i++){
- s += '<td id="'+this.divName+'_td_'+i+'" width="33%" align="center"><span style="font-size:1px"> </span><span id="'+this.divName+'_label_'+i+'" style="display:none;font-family: Courier New, Courier, mono;font-size: 12px;color: #000000;">'+this.labels[i]+'</span></td>';
- }
- s += '</tr>';
- s += '</table>';
- this.content = s;
- if(this.showed){
- document.write(s);
- this.copyToStyle(this.selectedIndex);
- }
- }
- PasswordStrength.prototype.copyToObject = function(o1,o2){
- for(var i in o1){
- o2[i] = o1[i];
- }
- }
- PasswordStrength.prototype.copyToStyle = function(id){
- this.selectedIndex = id;
- for(var i=0;i<3;i++){
- if(i == id-1){
- this.$(this.divName+"_label_"+i).style.display = "inline";
- }else{
- this.$(this.divName+"_label_"+i).style.display = "none";
- }
- }
- for(var i=0;i<id;i++){
- this.copyToObject(this.styles[id],this.$(this.divName+"_td_"+i).style);
- }
- for(;i<3;i++){
- this.copyToObject(this.styles[0],this.$(this.divName+"_td_"+i).style);
- }
- }
- PasswordStrength.prototype.$ = function(s){
- return document.getElementById(s);
- }
- PasswordStrength.prototype.setSize = function(w,h){
- this.width = w;
- this.height = h;
- }
- PasswordStrength.prototype.setMinLength = function(n){
- if(isNaN(n)){
- return ;
- }
- n = Number(n);
- if(n>1){
- this.minLength = n;
- }
- }
- PasswordStrength.prototype.setStyles = function(){
- if(arguments.length == 0){
- return ;
- }
- for(var i=0;i<arguments.length && i < 4;i++){
- this.styles[i] = arguments[i];
- }
- this.copyToStyle(this.selectedIndex);
- }
- PasswordStrength.prototype.write = function(s){
- if(this.showed){
- return ;
- }
- var n = (s == 'string') ? this.$(s) : s;
- if(typeof(n) != "object"){
- return ;
- }
- n.innerHTML = this.content;
- this.copyToStyle(this.selectedIndex);
- }
- PasswordStrength.prototype.update = function(s){
- if(s.length < this.minLen){
- this.copyToStyle(0);
- return;
- }
- var ls = -1;
- if (s.match(/[a-z]/ig)){
- ls++;
- }
- if (s.match(/[0-9]/ig)){
- ls++;
- }
- if (s.match(/(.[^a-z0-9])/ig)){
- ls++;
- }
- if (s.length < 6 && ls > 0){
- ls--;
- }
- switch(ls) {
- case 0:
- this.copyToStyle(1);
- break;
- case 1:
- this.copyToStyle(2);
- break;
- case 2:
- this.copyToStyle(3);
- break;
- default:
- this.copyToStyle(0);
- }
- }
引用
邵波的空間 的 javascript 取table中內容
1,有如下表格,我們要取第2行第2列的值<table id="table1"><tr><td>1行1列</td><td>1行2列</td></tr><tr><td>2行1列</td><td>2行2列</td></tr></table>2,取值方法var value==window.table1.rows.item(0).cells.item(0).innerText;注意:行號,列號是從 0 開始的例如 var value =window.table1.rows.item(1).cells.item(1).innerText;這就取到了第2行第2列的值3.改進方法上面的方法,需要知道行號,實踐中是不方便獲得的,下面是改進的方法<script language="javascript">
var str;
</script><table ><tr onMouseDown="str=this.cells.item(0).innerText"><td>1行1列</td><td>1行2列</td></tr><tr onMouseDown="str=this.cells.item(0).innerText"><td>2行1列</td><td>2行2列</td></tr></table>當鼠標按下時,我們就取到了該行第1列的值<td onMouseDown="str=this.innerText">2行1列</td>這可以取鼠標所在列的值
無聊在電腦上亂點.點出一個DWR的例子.于是乎開始學習DWR
拿出自己的練習曬下;
在做練習的時候遇到一個問題。web-inf下不生成classes文件夾,也不生成.class文件
經過研究解決辦法為:右鍵點擊webmodule 選擇properties,再選擇Content,選擇Include All classes and resources 確定。OK
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee <display-name>WebModule1</display-name>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<!-- javascript的對象是jsmethodname,create="new"是DWR自己創建類 -->
<create javascript="jsmethodname" creator="new" scope="application">
<!-- value是java中的類名 -->
<param name="class" value="org.li.dwr.Hello"></param>
<!--<include>標簽指定要公開給javascript的方法。不指定的話就公開所有方法。
<exclude>標簽指定要防止被訪問的方法。-->
<include method="alertStr"/>
<include method="alertJSStr"/>
<include method="returnAl"/>
<include method="getList"/>
<include method="getObj"/>
</create>
<!--轉換java類型 -->
<convert converter="bean" match="org.li.dwr.InputRecord">
</convert>
</allow>
</dwr>
jsp頁面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>DWR</title>
<meta http-equiv="content-type" content="text/html; charset=GBK">
<script type='text/javascript' src='dwr/interface/jsmethodname.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type="text/javascript" src="hello.js"></script>
<!--其中jsmethodname.js是dwr根據配置文件自動生成的,engine.js和util.js是dwr自帶的腳本文件。
-->
</head>
<body>
<input id="jbutton" type="button" value="Hello World" onclick="jbClick()"/>
<div id="jdiv"></div>
<div id="jdiv2"></div>
<div id="uid"></div>
<div id="uname"></div>
<div id="usex"></div>
<div id="uaddress"></div>
</body>
</html>
js :hello.js
/*
function load()//載入的時候調用
{
var jbutton = document.getElementById("jbutton");
jbutton.onclick=function(event)//注冊按鈕點擊事件
{
jbClick();
};
}
*/
function jbClick()//按鈕點擊事件
{
// jshello.getHelloWorld(callback);//沒有參數傳遞,只傳遞回調函數就行
// jsmethodname.alertStr(callback1);//無參數
var data="js傳入java中的值";
// jsmethodname.alertJSStr(data,callback);//有參數。第一個為參數,第二個為回調方法接收返回值
jsmethodname.getList(callbackList); //無參數,返回list
//jsmethodname.getObj(callbackObj);
}
function callback1(msg)//回調函數 ,調用java方法的javascript函數
{
//msg就是java方法的返回值
alert(msg);
}
function callback(msg)//回調函數
{
//這里可以進行參數處理DWRUtil 的 setValue() 方法會將傳回的 msg 設定給指定 id 的 DOM
DWRUtil.setValue('jdiv',msg);
}
function callbackList(data){
for(var i=0;i<data.length;i++){
DWRUtil.setValue("uid", data[i].id);
DWRUtil.setValue("uname", data[i].name);
DWRUtil.setValue("usex", data[i].sex);
DWRUtil.setValue("uaddress", data[i].address);
}
}
function callbackObj(data){
//知道屬性
DWRUtil.setValue("uid", data.id);
DWRUtil.setValue("uname", data.name);
DWRUtil.setValue("usex", data.sex);
DWRUtil.setValue("uaddress", data.address);
/**
* 不知道屬性
for(var property in data){
//alert("property:"+property);
alert(property+":"+data[property]);
}
*/
}
java類
Hello.java
package org.li.dwr;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
public class Hello {
public String getHelloWorld() {
return "現在的時間為:" + new Date();
}
public String alertStr() {
return "DWR框架:無參數";
}
public String alertJSStr(String jsvalue) {
return "DWR框架:" + jsvalue;
}
public ArrayList returnAl() {
ArrayList al = new ArrayList();
al.set(1, "a");
al.set(2, "b");
al.set(3, "c");
al.set(4, "d");
return al;
}
public List getList() {
List list = new ArrayList();
for(int i=0;i<5;i++){
InputRecord ir = new InputRecord();
ir.setId(1);
ir.setName("依韻");
ir.setSex("男");
ir.setAddress("北京市");
list.add(ir);
}
return list;
}
public InputRecord getObj() {
InputRecord ir = new InputRecord();
ir.setId(2);
ir.setName("白色黃昏");
ir.setSex("女");
ir.setAddress("河南");
return ir;
}
}
InputRecord.java
package org.li.dwr;
public class InputRecord {
private int id;
private String name;
private String sex;
private String address;
public String getAddress() {
return address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setId(int id) {
this.id = id;
}
}