準備想在框架的基礎上寫一個后臺模板生成類,就好像之前用的那個框架一樣.

          因為后臺的樣式基本上都是一樣的,不需要什么特殊或者不規則的html,一些form,input,列表,分頁,tab…不外乎就那么幾種,完全沒有必要花時間在逐個頁面寫HTML,很費時間,修改也麻煩.寫好一個類之后,就通過簡單的PHP語句生成你想要的html,幾句php就搞掂一個頁面了.

          嗯,那第一步就找一個好看,結構又簡單的后臺模板.

          1.Free Admin Template For Web Applications - 三欄標簽式模板,整體淡藍色、橙色、白色。給人感覺非常舒服。

          演示地址  下載地址

          2.Gooey Templates Proton - 非常簡潔的模板,主題黑白色調。

          下載地址

          3.Bloganje Free Admin Template

          演示地址  下載地址

          4.Transdmin Light - 包括html格式和PSD格式。

          演示地址  下載地址

           

          人力資源管理系統(HR)HTML模板

          人力資源管理系統(HR)HTML模板

          模板名稱: 人力資源管理系統(HR)HTML模板
          添加日期: 2009-4-23 08:55:34 下載方式: 免費下載
          模板大小: 173KB HTML文件:
          模板說明: 人力資源管理系統(HR)HTML模板,藍色風格,帶登陸頁面及后臺操作頁面html文件,該模板屬本人前不久開發的一款簡單的人力資源管理系統,現在整成HTML文件,供需要的朋友下載。
          [模板下載]

          一款簡單黑色后臺管理模板

          一款簡單黑色后臺管理模板

          模板名稱:一款簡單黑色后臺管理模板
          添加日期: 2009-4-23 08:48:18 下載方式: 免費下載
          模板大小: 1220KB HTML文件:
          模板說明: 一款簡單黑色后臺管理模板,黑色風格,有登陸頁面及操作頁面,含PSD文件,會設計的朋友自己切割會好很多,因為此模板的HTML文件切割的不是很好,水平有限,嘿嘿。
          [模板下載] 

          鄉鎮農戶評級系統后臺模板

          鄉鎮農戶評級系統后臺模板模板名稱: 鄉鎮農戶評級系統后臺模板
          添加日期: 2009-4-15 08:45:44 下載方式: 免費下載
          模板大小: 180KB HTML文件:
          模板說明: 鄉鎮農戶評級系統后臺模板,淡綠色風格,帶登陸頁面及后臺操作頁面html文件,菜單有點復雜,橫向縱向結合,不過本人覺得還行,適合開發各類系統后臺,有心思改的朋友可以下。
          [模板下載]

          TaskMenu3.0仿WindowsXP后臺模板

          TaskMenu3.0仿WindowsXP后臺模板模板名稱:TaskMenu3.0仿WindowsXP后臺模板
          添加日期: 2009-4-15 08:38:28 下載方式: 免費下載
          模板大小: 31KB HTML文件:
          模板說明: TaskMenu3.0仿WindowsXP后臺模板,WindowsXP藍色、銀色、經典三種風格,因為全是js控制,所以自帶了風格切換功能以及菜單控制功能,這款后臺出來應該有幾年了,經典值得收藏。

          三款簡單通用的后臺管理模板

          三款簡單通用的后臺管理模板模板名稱: 三款簡單通用的后臺管理模板
          添加日期: 2009-4-11 09:55:47 下載方式: 免費下載
          模板大小: 13KB HTML文件:
          模板說明: 三款簡單通用的后臺管理模板,一款黑色,兩款藍色,帶登陸頁面及后臺操作頁面,三款模板結構上都差不多,設計的挺簡單的,適合簡單的后臺管理功能開發。
          [模板下載]

          漂亮的深藍色登陸界面

          漂亮的深藍色登陸界面模板名稱:漂亮的深藍色登陸界面
          添加日期: 2009-4-11 09:18:18 下載方式: 免費下載
          模板大小: 61KB HTML文件:
          模板說明: 漂亮的深藍色登陸界面,深藍色風格,只含登陸界面html文件,缺登陸界面的朋友可以考慮下載。
          [模板下載] 

          一款不錯的物業管理系統全套html模板

          一款不錯的物業管理系統全套html模板模板名稱: 一款不錯的物業管理系統全套html模板
          添加日期: 2009-3-31 09:41:22 下載方式: 免費下載
          模板大小: 274KB HTML文件:
          模板說明: 一款不錯的物業管理系統全套html模板,綠色風格,帶登陸頁面及后臺操作頁面,看上去跟前幾款的設計模式差不多,不過風格比較清新,個人覺得挺喜歡的。
          [模板下載]

          國外簡單后臺模板[3]

          國外簡單后臺模板[3]模板名稱: 國外簡單后臺模板[3]
          添加日期: 2009-3-31 09:23:12 下載方式: 免費下載
          模板大小: 28KB HTML文件:
          模板說明: 國外簡單后臺模板[3],藍白風格,國外的模板沒的說,簡單,后臺就更不用說了,設計超簡單的,但功能又介于其內,真是不多得的好模板。
          [模板下載] 

          國外簡單后臺模板[1]

          國外簡單后臺模板[1]模板名稱: 國外簡單后臺模板[1]
          添加日期: 2009-3-23 16:20:23 下載方式: 免費下載
          模板大小: 140KB HTML文件:
          模板說明: 國外簡單后臺模板[1],多種風格,藍色、橙色、黑色等,可相互切換,如果開發網站的時候有會員機制的話用這套就再簡單不過了。含PSD文件,懂設計的朋友可以自己修改。
          [模板下載]

          國外簡單后臺模板[2]

          國外簡單后臺模板[2]模板名稱: 國外簡單后臺模板[2]
          添加日期: 2009-3-23 15:43:22 下載方式: 免費下載
          模板大小: 120KB HTML文件:
          模板說明: 國外簡單后臺模板[2],白色風格,相對于上面那套模板來說,不提供風格切換功能,但是在用戶操作方面設計的超簡單的,所謂后臺越簡單越好嘛,所以前臺有會員功能要做的時候可以借鑒一下哦。含PSD文件,懂設計的朋友可以自己修改。
          [模板下載] 

          黃色動網風格后臺模板

          黃色動網風格后臺模板模板名稱: 黃色動網風格后臺模板
          添加日期: 2009-3-18 11:51:36 下載方式: 免費下載
          模板大小: 35KB HTML文件:
          模板說明: 黃色動網風格后臺模板,黃色風格,相信前兩年大多數的后臺都是采用動網風格或是模仿動網風格吧。
          [模板下載]

          藍色動網風格后臺模板

          藍色動網風格后臺模板模板名稱: 藍色動網風格后臺模板
          添加日期: 2009-3-18 11:43:12 下載方式: 免費下載
          模板大小: 20KB HTML文件:
          模板說明: 藍色動網風格后臺模板,藍色風格,經典的動網藍色風格后臺,好像又回到幾年前了,結構簡單,開發起來速度快。
          [模板下載] 

          網站后臺管理系統模板

          網站后臺管理系統模板模板名稱: 網站后臺管理系統模板
          添加日期: 2009-3-16 11:33:22 下載方式: 免費下載
          模板大小: 29KB HTML文件:
          模板說明: 網站后臺管理系統模板,藍色風格,菜單較復雜,帶橫向菜單和縱向菜單,功能交錯處理,權限不好控制,有需要的下吧。
          [模板下載] 

          一款超炫的后臺,Ext模擬Windows桌面

          一款超炫的后臺,Ext模擬Windows桌面模板名稱: 一款超炫的后臺,Ext模擬Windows桌面
          添加日期: 2009-3-14 15:33:46 下載方式: 免費下載
          模板大小: 492KB HTML文件:
          模板說明: 一款超炫的后臺,Ext模擬Windows桌面,Ext經典淺藍風格,功能非常強大,包括最大化、最小化、狀態欄、桌面圖標等,不過需要非常懂Ext腳本的才可駕馭它。
          [模板下載]

          仿163簡約風格郵件系統后臺模板

          仿163簡約風格郵件系統后臺模板模板名稱: 仿163簡約風格郵件系統后臺模板
          添加日期: 2009-3-14 14:56:22 下載方式: 免費下載
          模板大小: 90KB HTML文件:
          模板說明: 仿163簡約風格郵件系統后臺模板,藍色風格,花了一個上午修改出來的,開發郵件系統應該有用,并且去掉了163原有的冗余腳本代碼,其他不必要的東西也已經被我清理的非常干凈了。
          [模板下載] 

          學校管理系統后臺模板

          學校管理系統后臺模板模板名稱: 學校管理系統后臺模板
          添加日期: 2009-3-12 15:36:26 下載方式: 免費下載
          模板大小: 253KB HTML文件:
          模板說明: 學校管理系統后臺模板,淺藍色風格,登陸頁面挺時尚哦,后臺功能菜單也是半透明效果,喜歡的趕緊下吧。
          [模板下載] 

          綠色經典后臺模板,適合開發CMS、HR、OA、CRM等

          綠色經典后臺模板,適合開發CMS、HR、OA、CRM等模板名稱: 綠色經典后臺模板,適合開發CMS、HR、OA、CRM等
          添加日期: 2009-3-11 09:06:26 下載方式: 免費下載
          模板大小: 148KB HTML文件:
          模板說明: 綠色經典后臺模板,適合開發CMS、HR、OA、CRM等,綠色風格,是一套結構稍微復雜的模板,適合開發各類中小型系統,并包含配套登陸頁面模板,確實值得收藏哦。
          [模板下載] 

          Ext 做的清爽簡單后臺模板

          Ext 做的清爽簡單后臺模板模板名稱: Ext 做的清爽簡單后臺模板
          添加日期: 2009-3-9 15:46:26 下載方式: 免費下載
          模板大小: 9KB HTML文件:
          模板說明: Ext 做的清爽簡單后臺模板,清爽淡藍色風格,功能較簡單,以選項卡方式打開功能,前臺中要做用戶后臺的時候可以考慮下。
          [模板下載] 

          posted @ 2009-06-15 16:25 希 閱讀(5541) | 評論 (4)編輯 收藏

          js驗證表單大全
          1. 長度限制
          <script>
          function test() 
          {
          if(document.a.b.value.length>50)
          {
          alert("不能超過50個字符!");
          document.a.b.focus();
          return false;
          }
          }
          </script>
          <form name=a onsubmit="return test()">
          <textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
          <input type="submit" name="Submit" value="check">
          </form> 

          2. 只能是漢字 
          <input onkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">

          3." 只能是英文
          <script language=javascript>
          function onlyEng()
          {
          if(!(event.keyCode>=65&&event.keyCode<=90))
          event.returnvalue=false;
          }
          </script>

          <input onkeydown="onlyEng();">

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

          <input onkeydown="onlyNum();">

          5. 只能是英文字符和數字
          <input onkeyup="value="/oblog/value.replace(/[\W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

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

          7. 屏蔽關鍵字(這里屏蔽***和****)
          <script language="javascript1.2">
          function test() {
          if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
          alert(":)");
          a.b.focus();
          return false;}
          }
          </script>
          <form name=a onsubmit="return test()">
          <input type=text name=b>
          <input type="submit" name="Submit" value="check">
          </form>

          8. 兩次輸入密碼是否相同
          <FORM METHOD=POST ACTION="">
          <input type="password" id="input1">
          <input type="password" id="input2">
          <input type="button" value="test" onclick="check()">
          </FORM>
          <script>
          function check()

          with(document.all){
          if(input1.value!=input2.value)
          {
          alert("false")
          input1.value = "";
          input2.value = "";
          }
          else document.forms[0].submit();
          }
          }
          </script>
          夠了吧 :)
          屏蔽右鍵 很酷 
          oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
          加在body中




          2.1  表單項不能為空

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

          1. 檢查一段字符串是否全由數字組成       
          ---------------------------------------       
          <script language="Javascript"><!--           
          function checkNum(str){return str.match(/\D/)==null}           
          alert(checkNum("1232142141"))           
          alert(checkNum("123214214a1"))           
          // --></script>         
                
          2. 怎么判斷是否是字符         
          ---------------------------------------       
          if (/[^\x00-\xff]/g.test(s)) alert("含有漢字");          
          else alert("全是字符");      
                     
          3. 怎么判斷是否含有漢字        
          ---------------------------------------        
          if (escape(str).indexOf("%u")!=-1) alert("含有漢字");         
          else alert("全是字符");           
              
          4. 郵箱格式驗證    
          ---------------------------------------      
          //函數名:chkemail     
          //功能介紹:檢查是否為Email Address     
          //參數說明:要檢查的字符串     
          //返回值:0:不是 1:是     
          function chkemail(a)     
          { var i=a.length;     
          var temp = a.indexOf('@');     
          var tempd = a.indexOf('.');     
          if (temp > 1) {     
          if ((i-temp) > 3){     
          if ((i-tempd)>0){     
          return 1;     
          }     
              
          }     
          }     
          return 0;     
          }     
              
          5. 數字格式驗證    
          ---------------------------------------      
          //函數名:fucCheckNUM     
          //功能介紹:檢查是否為數字     
          //參數說明:要檢查的數字     
          //返回值:1為是數字,0為不是數字     
          function fucCheckNUM(NUM)     
          {     
          var i,j,strTemp;     
          strTemp="0123456789";     
          if ( NUM.length== 0)     
          return 0     
          for (i=0;i<NUM.length;i++)     
          {     
          j=strTemp.indexOf(NUM.charAt(i));     
          if (j==-1)     
          {     
          //說明有字符不是數字     
          return 0;     
          }     
          }     
          //說明是數字     
          return 1;     
          }     
              
          6. 電話號碼格式驗證    
          ---------------------------------------      
          //函數名:fucCheckTEL     
          //功能介紹:檢查是否為電話號碼     
          //參數說明:要檢查的字符串     
          //返回值:1為是合法,0為不合法     
          function fucCheckTEL(TEL)     
          {     
          var i,j,strTemp;     
          strTemp="0123456789-()# ";     
          for (i=0;i<TEL.length;i++)     
          {     
          j=strTemp.indexOf(TEL.charAt(i));     
          if (j==-1)     
          {     
          //說明有字符不合法     
          return 0;     
          }     
          }     
          //說明合法     
          return 1;     
          }    
             
          7. 判斷輸入是否為中文的函數   
          ---------------------------------------      
          function ischinese(s){   
          var ret=true;   
          for(var i=0;i<s.length;i++)   
          ret=ret && (s.charCodeAt(i)>=10000);   
          return ret;   
          }    
             
          8. 綜合的判斷用戶輸入的合法性的函數  
          ---------------------------------------      
          <script language="javascript">  
          //限制輸入字符的位數開始  
          //m是用戶輸入,n是要限制的位數  
          function issmall(m,n)  
          {  
          if ((m<n) && (m>0))  
            {  
            return(false);  
            }  
          else  
          {return(true);}  
          }  
            
          9. 判斷密碼是否輸入一致  
          ---------------------------------------      
          function issame(str1,str2)  
          {  
          if (str1==str2)  
          {return(true);}  
          else  
          {return(false);}  
          }  
            
          10. 判斷用戶名是否為數字字母下滑線 
          ---------------------------------------      
          function notchinese(str){ 
          var reg=/[^A-Za-z0-9_]/g 
              if (reg.test(str)){ 
              return (false); 
              }else{ 
          return(true);    } 


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

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

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

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


          2 >表單提交驗證類 


          2.1 表單項不能為空

          <script language="javascript">
          <!--
          function CheckForm()

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

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

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

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

          <script language="javascript">
          <!--
          function isNumber(String)

          var Letters = "1234567890-"; //可以自己增加可輸入值
          var i;
          var c;
          if(String.charAt( 0 )=='-')
          return false;
          if( String.charAt( String.length - 1 ) == '-' )
          return false;
          for( i = 0; i < String.length; i ++ )

          c = String.charAt( i );
          if (Letters.indexOf( c ) < 0)
          return false;
          }
          return true;
          }
          function CheckForm()

          if(! isNumber(document.form.TEL.value)) { 
          alert("您的電話號碼不合法!");
          document.form.TEL.focus();
          return false;
          }
          return true;
          }
          -->
          </script>


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

          <script language="javascript">
          <!--
          function CheckForm() 

          if (document.form.count.value > 100 || document.form.count.value < 1)

          alert("輸入數值不能小于零大于100!");
          document.form.count.focus();
          return false;
          }
          if (document.form.MESSAGE.value.length<10)

          alert("輸入文字小于10!");
          document.form.MESSAGE.focus();
          return false;
          }
          return true;
          }
          //-->
          </script>

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

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

          function isEnglish(name) //英文值檢測

          if(name.length == 0)
          return false;
          for(i = 0; i < name.length; i++) { 
          if(name.charCodeAt(i) > 128)
          return false;
          }
          return true;
          }

          function isChinese(name) //中文值檢測

          if(name.length == 0)
          return false;
          for(i = 0; i < name.length; i++) { 
          if(name.charCodeAt(i) > 128)
          return true;
          }
          return false;
          }

          function isMail(name) // E-mail值檢測

          if(! isEnglish(name))
          return false;
          i = name.indexOf(" at ");
          j = name dot lastIndexOf(" at ");
          if(i == -1)
          return false;
          if(i != j)
          return false;
          if(i == name dot length)
          return false;
          return true;
          }

          function isNumber(name) //數值檢測

          if(name.length == 0)
          return false;
          for(i = 0; i < name.length; i++) { 
          if(name.charAt(i) < "0" || name.charAt(i) > "9")
          return false;
          }
          return true;
          }

          function CheckForm()

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

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

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

          function contain(str,charset)// 字符串包含測試函數

          var i;
          for(i=0;i<charset.length;i++)
          if(str.indexOf(charset.charAt(i))>=0)
          return true;
          return false;
          }

          function CheckForm()

          if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))

          alert("輸入了非法字符");
          document.form.NAME.focus();
          return false;
          }
          return true;
          }
          //-->
          </script>

          posted @ 2009-06-11 15:15 希 閱讀(214) | 評論 (0)編輯 收藏

          Javascript的document對象

          對象屬性:

          document.title                 //設置文檔標題等價于HTML的<title>標簽
          document.bgColor               //設置頁面背景色
          document.fgColor               //設置前景色(文本顏色)
          document.linkColor             //未點擊過的鏈接顏色
          document.alinkColor            //激活鏈接(焦點在此鏈接上)的顏色
          document.vlinkColor            //已點擊過的鏈接顏色
          document.URL                   //設置URL屬性從而在同一窗口打開另一網頁
          document.fileCreatedDate       //文件建立日期,只讀屬性
          document.fileModifiedDate      //文件修改日期,只讀屬性
          document.fileSize              //文件大小,只讀屬性
          document.cookie                //設置和讀出cookie
          document.charset               //設置字符集 簡體中文:gb2312
          ----------------------------
          常用對象方法:

          document.write()                      //動態向頁面寫入內容
          document.createElement(Tag)           //創建一個html標簽對象
          document.getElementById(ID)           //獲得指定ID值的對象
          document.getElementsByName(Name)      //獲得指定Name值的對象
          document.body.appendChild(oTag)
          ========================================================================
          body-主體子對象

          document.body                   //指定文檔主體的開始和結束等價于<body></body>
          document.body.bgColor           //設置或獲取對象后面的背景顏色
          document.body.link              //未點擊過的鏈接顏色
          document.body.alink             //激活鏈接(焦點在此鏈接上)的顏色
          document.body.vlink             //已點擊過的鏈接顏色
          document.body.text              //文本色
          document.body.innerText         //設置<body>...</body>之間的文本
          document.body.innerHTML         //設置<body>...</body>之間的HTML代碼
          document.body.topMargin         //頁面上邊距
          document.body.leftMargin        //頁面左邊距
          document.body.rightMargin       //頁面右邊距
          document.body.bottomMargin      //頁面下邊距
          document.body.background        //背景圖片
          document.body.appendChild(oTag) //動態生成一個HTML對象
          ----------------------------
          常用對象事件:

          document.body.onclick="func()"              //鼠標指針單擊對象是觸發
          document.body.onmouseover="func()"          //鼠標指針移到對象時觸發
          document.body.onmouseout="func()"           //鼠標指針移出對象時觸發
          ========================================================================
          location-位置子對象:

          document.location.hash          // #號后的部分
          document.location.host          // 域名+端口號
          document.location.hostname      // 域名
          document.location.href          // 完整URL
          document.location.pathname      // 目錄部分
          document.location.port          // 端口號
          document.location.protocol      // 網絡協議(http:)
          document.location.search        // ?號后的部分
          ----------------------------
          常用對象事件:

          documeny.location.reload()          //刷新網頁
          document.location.reload(URL)       //打開新的網頁
          document.location.assign(URL)       //打開新的網頁
          document.location.replace(URL)      //打開新的網頁
          ========================================================================
          selection-選區子對象
          document.selection
          ========================================================================
          images集合(頁面中的圖象):
          ----------------------------
          a)通過集合引用
          document.images                 //對應頁面上的<img>標簽
          document.images.length          //對應頁面上<img>標簽的個數
          document.images[0]              //第1個<img>標簽          
          document.images[i]              //第i-1個<img>標簽
          ----------------------------
          b)通過name屬性直接引用
          <img name="oImage">
          document.images.oImage          //document.images.name屬性
          ----------------------------
          c)引用圖片的src屬性
          document.images.oImage.src      //document.images.name屬性.src
          ----------------------------
          d)創建一個圖象
          var oImage
          oImage = new Image()
          document.images.oImage.src="1.jpg"
          同時在頁面上建立一個<img>標簽與之對應就可以顯示
          ----------------------------
          示例代碼(動態創建圖象):
          <html>
          <img name=oImage>
          <script language="javascript">
                 var oImage
                 oImage = new Image()
                 document.images.oImage.src="1.jpg"
          </script>
          </html>

          <html>
          <script language="javascript">
                 oImage=document.caeateElement("IMG")
                 oImage.src="1.jpg"
                 document.body.appendChild(oImage)
          </script>
          </html>
          ========================================================================
          forms集合(頁面中的表單):
          ----------------------------
          a)通過集合引用
          document.forms                     //對應頁面上的<form>標簽
          document.forms.length              //對應頁面上<form>標簽的個數
          document.forms[0]                  //第1個<form>標簽
          document.forms[i]                  //第i-1個<form>標簽
          document.forms[i].length           //第i-1個<form>中的控件數
          document.forms[i].elements[j]      //第i-1個<form>中第j-1個控件
          ----------------------------
          b)通過標簽name屬性直接引用
          <form name="Myform"><input name="myctrl"></form>
          document.Myform.myctrl             //document.表單名.控件名
          ----------------------------
          c)訪問表單的屬性
          document.forms[i].name             //對應<form name>屬性
          document.forms[i].action           //對應<form action>屬性
          document.forms[i].encoding         //對應<form enctype>屬性
          document.forms[i].target           //對應<form target>屬性
          document.forms[i].appendChild(oTag) //動態插入一個控件
          ----------------------------
          示例代碼(form):
          <html>
          <!--Text控件相關Script-->
          <form name="Myform">
          <input type="text" name="oText">
          <input type="password" name="oPswd">
          <form>
          <script language="javascript">
          //獲取文本密碼框的值
          document.write(document.Myform.oText.value)
          document.write(document.Myform.oPswd.value)
          </script>
          </html>
          ----------------------------
          示例代碼(checkbox):
          <html>
          <!--checkbox,radio控件相關script-->
          <form name="Myform">
          <input type="checkbox" name="chk" value="1">1    
          <input type="checkbox" name="chk" value="2">2    
          </form>    
          <script language="javascript">    
          function fun(){    
                //遍歷checkbox控件的值并判斷是否選中    
                var length    
                length=document.forms[0].chk.length    
                for(i=0;i<length;i++){    
                v=document.forms[0].chk[i].value    
                b=document.forms[0].chk[i].checked    
                if(b)    
                  alert(v=v+"被選中")    
                else    
                  alert(v=v+"未選中")   
                }    
                }    
          </script>     
          <a href=# onclick="fun()">ddd</a>                     
          </html>
          ----------------------------
          示例代碼(Select):
          <html>
          <!--Select控件相關Script-->
          <form name="Myform">
          <select name="oSelect">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          </select>
          </form>

          <script language="javascript">
                 //遍歷select控件的option項
                 var length
                 length=document.Myform.oSelect.length
                 for(i=0;i<length;i++)
                 document.write(document.Myform.oSelect[i].value)
          </script>

          <script language="javascript">
                 //遍歷option項并且判斷某個option是否被選中
                 for(i=0;i<document.Myform.oSelect.length;i++){
                 if(document.Myform.oSelect[i].selected!=true)
                 document.write(document.Myform.oSelect[i].value)
                 else
                 document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")  
                 }
          </script>

          <script language="javascript">
                 //根據SelectedIndex打印出選中的option
                 //(0到document.Myform.oSelect.length-1)
                 i=document.Myform.oSelect.selectedIndex
                 document.write(document.Myform.oSelect[i].value)
          </script>

          <script language="javascript">
                 //動態增加select控件的option項
                 var oOption = document.createElement("OPTION");
                 oOption.text="4";
                 oOption.value="4";
                 document.Myform.oSelect.add(oOption);
          </script>
          <html>
          ========================================================================
          Div集合(頁面中的層):
          <Div id="oDiv">Text</Div>
          document.all.oDiv                                  //引用圖層oDiv               
          document.all.oDiv.style.display=""                 //圖層設置為可視
          document.all.oDiv.style.display="none"             //圖層設置為隱藏
          document.getElementId("oDiv")                      //通過getElementId引用對象
          document.getElementId("oDiv").
          document.getElementId("oDiv").display="none"
          /*document.all表示document中所有對象的集合
          只有ie支持此屬性,因此也用來判斷瀏覽器的種類*/
          ----------------------------
          圖層對象的4個屬性
          document.getElementById("ID").innerText      //動態輸出文本
          document.getElementById("ID").innerHTML      //動態輸出HTML
          document.getElementById("ID").outerText      //同innerText
          document.getElementById("ID").outerHTML      //同innerHTML
          ----------------------------
          示例代碼:
          <html>
          <script language="javascript">
          function change(){
          document.all.oDiv.style.display="none"
          }
          </script>
          <Div id="oDiv" onclick="change()">Text</Div>
          </html>

          <html>
          <script language="javascript">
          function changeText(){
          document.getElementById("oDiv").innerText="NewText"
          }
          </script>
          <Div id="oDiv" onmouseover="changeText()">Text</Div>
          </html>

          posted @ 2009-06-11 14:45 希 閱讀(765) | 評論 (1)編輯 收藏

          ioc

          一、IOC的概念
                  Inversion of control 控制反轉;
                  以前: 對象的協作關系A類自己來負責;
                      A do() ---> B f1()
                             ---> C f2()
                      do(){
                          new B().f1();
                          new C().f2();
                      }
                      對象A負責建立與其協作對象的關系;
                      問題:
                          1)對象協作關系的建立與業務本身的邏輯糾纏在一起;
                          2)協作關系也是不容易維護的;(B, C發生改變)

                   現在: 對象的協作關系容器來負責;
                      
                       A do() ---> IB <---B f1()
                              ---> IC <---C f2()
                       setIB(B)
                       setIC(C)
                     對象不再負責建立與協作對象的關系, 由容器來負責對象的協作關系;       
                      
                 控制: 指對象的協作關系由誰來建立;
                 反轉: 原來由對象自己調用的變成了容器調用;
                
                 好處: 代碼更好維護, 協作關系不需要考慮了;
                                                對象依賴于接口, 協作對象發生改變以后, 不需要改變;
                 控制反轉又叫依賴注入: 將對象的協作關系由容器來注入;                               
                 
          二、 基本的容器與IOC的使用
          1, spring-framework-2.0.6-with-dependencies
                MyEclipse 自帶的有jar包,但是會有一些問題;

                我們再創建自己的user庫: spring2_lib:
                需要三個地方的包:
                spring framework/dist/spring.jar
                                 lib/jakarta-commons/*.jar
                                 lib/cglib/*.jar

                新建工程springdev 右擊, myeclipse-- add spring capabilities--- add user libriay--spring2_lib

                接口: Greeter
                      package ioc1;

                      public interface Greeter {
                             public String sayHello();
                      }
                實現類: GreeterImpl
                      package ioc1;

                      public class GreeterImpl implements Greeter{
                      private String user;
                      //提供一個set方法, 可以注入
                      public void setUser(String user) {
                         this.user = user;
                      }
                     
                      public String sayHello() {
                        
                         return "你好 " +user;
                      }
                      }

                  配置文件: applicationContext.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <beans
          xmlns=" xmlns:xsi=" xsi:schemaLocation="http://www.springframework.org/schema/beans             <bean id="greeter" class="ioc1.GreeterImpl">
                        <property name="user"><!-- 屬性名字 -->
                  <value>zhangsan</value>
                        </property>
                      </bean>
                  </beans>

                  測試類:Test
                      import org.springframework.beans.factory.BeanFactory;
                      import org.springframework.beans.factory.xml.XmlBeanFactory;
                      import org.springframework.core.io.ClassPathResource;
                      import org.springframework.core.io.Resource;
                     
                      public class Test {
                      public static void main(String[] args) {
                         //配置文件的路徑
                         Resource rs=new ClassPathResource("/ioc1/applicationContext.xml");
                         BeanFactory bf=new XmlBeanFactory(rs);
                         Greeter gt=(Greeter) bf.getBean("greeter");//配置文件中id的名字
                         System.out.println(gt.sayHello());
                        
                      }
                      }

          2, IOC的類型:
                   1) set 方式來注入:
                          <property name=””></property>
                          其中,name屬性的取值依setter方法名而定
                          對于基本類型,spring容器會自動做類型轉換,以便賦值;

                   2)構造器的方式來注入;
                          <constructor-arg index=””></ constructor-arg>
                          其中,index表示構造方法中的參數位置(第一個參數索引為0)

                   3)實現特定的接口來注入,
                          這種方式已經不采用了,因為業務對象會依賴框架的特定接口;
                          " 侵入式 "方案;

              注入的類型:
                  1)八種基本類型+String ;
                  2)對象
                  3)集合: list, set , map , properties
                  4)null

          3, Spring 容器 :
                用于實例化對象, 然后賦值或者裝配, 生命周期管理的一種類;
                容器的種類:
                      BeanFactory: 1)所有容器的父接口, 組件的生成和組裝;
                                   2)提供了基本的IOC的功能;
                                   3)一個實現: XmlBeanFactory ,
                                     需要提供一個Resource的實例給XmlFactory, Resource對象來包裝配置文件;
                                   4)getBean(String)方法,返回一個裝配好的對象;
                                   5)在默認情況下返回的對象都采用的單例模式;
                                   6)直到調用getBean方法時, 才會實例化并且裝配對象;
                                   實例化 -- 構造對象, 給屬性賦值 -- 裝配/注入 ;

                      ApplicationContext: Spring的上下文, 也是一個容器, 是BeanFactory的子接口;
                                          增強了BeanFactory, 提供了事件處理, 國際化,復雜的生命周期管理;
                                          一般情況下用ApplicationContext, 而不用BeanFactory;
                                          實現類:
                                               ClassPathXmlApplicationContext: 依據classpath查找配置文件;
                                               容器初始化的時候會預先實例化單例的對象; 可以配置, 有的采用單例有的不用; 三、set 方式注入:
          <1>. 基本類型的注入:
                注入簡單類型: 八種基本類型+String
                方式: id是bean的id號, 唯一的; class是bean類的全路徑;
                <bean id="" ,class="">     
                      <property name=""> <!--屬性名, set方法去掉set并將首字母小寫后的名字 -->     
                          <value>屬性值</value>
                      </property>     
               </bean>                
               對于基本類型, 會自動轉換數據類型; 跟序列化的意思差不多;
                用ApplicationContext 容器寫測試類:
                  ApplicationContext ctx=new ClassPathXmlApplicationContext("/ioc1/applicationContext.xml");
                  Greeter gt2=(Greeter) ctx.getBean("greeter");
                  Greeter gt3=(Greeter) ctx.getBean("greeter");
                   System.out.println(gt2.sayHello());
                  //測試單例模式;true
                  System.out.println(gt2==gt3);

          <2>. 對象類型的注入:
               1) <ref local> 要注入的對象在同一個配置文件中;
                2) <ref bean> 要注入的對象可以分散在其他的配置文件中;
                3) 將要注入的bean類的配置信息直接嵌入到bean類中;(有點象內部類)
                   不讓客戶端直接用getBean方式獲得,該對象只被注入的對象使用;

          例子1:
                  實現類:
                  public class OderServiceImpl implements OrderService{
               private SomeBean sb; //最好用接口
          }

                  ============================第一種:<ref local>=================================
          配置文件1: <ref local>
                              使用local則定義的兩個類必須出現在同一個配置文件中
                  <!-- 第一個bean -->
                  <bean id="otherBean" class="IOC.pm.set.Class.OtherBean">
                  <property name="str"><!-- 屬性名字 -->
                     <value>someinfo</value>
                  </property>
                  </bean>
                 
                  <!-- 第二個bean -->
                  <bean id="someBean" class="IOC.pm.set.Class.SomeBean">
                  <property name="ob">
                     <ref local="otherBean"/> //另外一個bean的id;
                  </property>
                  </bean>
                
                  ===========================第二種:嵌套==================================
                  或者2: 嵌到一起: 被嵌套的bean就不能夠使用getBean()來返回了;
                         使用嵌套定義的兩個類必須出現在同一個配置文件中
                   <bean id="someBean" class="IOC.pm.set.Class.SomeBean">
             <property name="ob">
                           <!--這樣的話ohterBean只能被someBean調用 -->
                     <bean id="otherBean" class="IOC.pm.set.Class.OtherBean">
                                  <property name="str1"><!-- 屬性名字 -->
                                     <value>tarena</value>
               </property>
              </bean>
             </property>
          </bean>

                  ============================第三種:<ref bean>==================================
                  或者3: <ref bean>: 功能最強大的搜索多個配置文件;
                           加一個配置文件: otherContext.xml 放someBean的配置;
                           applicationContext.xml中 <ref bean="otherBean"/>
                           測試類中: 寫成一個字符串數組;
                           ApplicationContext ctx=new ClassPathXmlApplicationContext(
                                         new String[]{"/ioc2/applicationContext.xml","/ioc2/other-config.xml.xml"});

             <3>. 集合的注入: (看老師的示例; )
                   List: 可重復的,有序
                          可以存放字符串,對象, 以及集合;
                          <property name="list">
                     <list>
                      <value>String1</value>
                      <value>String2</value>
                     </list>
                   </property>

                   Set: 不重復, 無序
                          可以存放字符串,對象, 以及集合;
                          <property name="set">
              <set>
               <value>String1</value>
               <value>String1</value>
              </set>
             </property>

                   Map:Key(只能用String), value 鍵值對;
                          <property name="map">
              <map>
               <entry key="key1"><!-- 用key來存放key的值,用value來存放value值 -->
                <value>value1</value>
               </entry>
               <entry key="key2">
                <value>value2</value>
               </entry>
              </map>
             </property>
            
                   Properties: key(String),value(String) 鍵值對
                  
                          <property name="properties">
              <props>
               <prop key="key11">value11</prop>
               <prop key="key22">value22</prop>
              </props>
             </property>
          四、構造器的方式注入:      
                        <1>. <constructor-arg>
             <value>基本類型</value>
          </constructor-arg>
                       <2>. <constructor-arg>
             <ref bean=""></ref>
          </constructor-arg>
              <bean id="someBean" class="ioc4.SomeBean">
             <constructor-arg index="1"><!--參數的順序可以改變,下標從0開始 -->
               <value>String1</value>
             </constructor-arg>
             <constructor-arg index="0">
               <value>String2</value>
             </constructor-arg>
          </bean>

          構造器注入和set方式注入比較:
                       用構造器注入:如果要注入的對象,屬性不是特別多,并且屬性值一定要被注入后才能來使用;
                       其他情況用set方式注入;
                                           
          五、IOC的特例 ;

              1, 自動裝配, 讓容器依據某種規則,自動的對組件實施裝配;
                       在bean中:
                        autowire=""
                             <1>. byName: 匹配屬性的名字與bean的id號進行匹配; 找set方法;

                                 someBean中有一個ob的屬性:
                                  <bean id="ob" class="ioc6.OtherBean">
                          <property name="str1">
                           <value>String1</value>
                          </property>
                          </bean>
                          <bean id="someBean" class="ioc6.SomeBean" autowire="byName">
                             <property name="str1">
                              <value>String1</value>
                             </property>
                          </bean>
                         
                             <2>. byType: 尋找配置文件, 匹配的屬性類型與bean一致; 找set方法;
                                           上面例子改成byType 也是正確的, 并且ob可以改為別的名字;
                                           如果在配置文件中找到符合條件的bean的個數超過一個,會報錯;

                             <3>. constructor: 匹配構造器,看構造器的參數類型和配置文件bean的類型是否一致,
                                               一致就成功,否則報錯;
                                               匹配個數超過一個,也報錯;
                                               提供一個構造器;

                             <4>. autodetect: 自動檢測, 先構造器, 再set方法(也就是可以set方法和構造方法可以同時使用);

                        自動從配置文件中尋找對應的bean的名字;
                        注意:手動裝配會覆蓋自動裝配的策略;
                       
                    問題:
                              1)自動裝配用的很少, 配置文件中,bean的關系不清晰, 易出錯;
                                 在建立原型的時候, 快速搭建, 真正開發的時候, 一般手動配置;
                              2)自動裝配和手動裝配配合在一起使用; 手動可以覆蓋自動的;
                              3)自動裝配搭配一個裝配檢查; 屬性先檢查, 出錯后就不再進行了;
                               dependency-check=""
                                      simple :只檢查基本類型屬性是否裝配成功;
                                      objects:只檢查Object類型是否裝配成功;
                                      all:全檢查;
                               既可以和自動裝配一起使用, 也可以單獨用來檢查是否裝配成功;

                    自動裝配的使用情況:
                             1,構建系統原形;
                             2,與dependency-check=""配合使用;
                             3,手動裝配會和自動裝配要配合使用;             


               2, 用工廠的方式創建對象: 靜態工廠, 實例工廠;
                    原因是: 很多對象不方便采用配置文件去裝配;
                    如: 獲得數據庫連接, 可以寫一個ConnectionFactory, getConnection方法
                    靜態工廠類, 靜態方法, getBean("connection")就可以得到連接;
                          public static Car createCar(){// 靜態工廠,靜態方法
                return new Car();
             }
                          <bean id="car" class="ioc5.CarFactory" factory-method="createCar" />
                          Car car=(Car) ctx.getBean("car");
             System.out.println(car);
                    實例工廠: 指工廠實例化后才能使用,
                          public Car createCar(){// 必須是實例方法
                return new Car();
             }
                         <bean id="carFactory" class="ioc5.CarFactory" />
                 <bean id="car" factory-bean="carFactory"   factory-method="createCar" />

              3,繼承關系:
                   <bean id="abstractBean" class="day02.ioc7.SomeBean" abstract="true">
              <property name="str1">
               <value>string1</value>
              </property>
              <property name="num">
               <value>20</value>
              </property>
             </bean>
             <!-- 繼承關系 -->
             <bean id="someBean" parent="abstractBean">
              <property name="num">
               <value>30</value>
              </property>
                   </bean>
                 
              得到的bean不想用單例時, 在bean標簽上加 Scope=singleton/prototype


              裝配中的其它情況:
              
             單例:scope=""
                  singleton,prototype
                
             初始化與銷毀: init-method,destroy-method

          posted @ 2009-06-05 14:22 希 閱讀(200) | 評論 (0)編輯 收藏

          在GUI下:
          (1)可按i進入插入模式
          (2)使用鼠標拖動反選要粘貼的內容,按鼠標左鍵復制選定塊到緩沖區
          (3)然后將光標移到要粘貼處,按鼠標中鍵(兩鍵鼠標可同時按左右鍵),粘貼緩沖區內容。

          在純文本終端下:
          (1)選定文本塊,使用v進入可視模式;移動光標鍵選定內容
          (2)復制選定塊到緩沖區,用y;復制整行,用yy
          (3)剪切選定塊到緩沖區,用d;剪切整行用dd
          (4)粘貼緩沖區中的內容,用p

          在同一編輯窗打開第二個文件,用:sp [filename]
          在多個編輯文件之間切換,用Ctrl+w

          命令前面加數字表示重復次數,加字

          posted @ 2009-06-03 17:37 希 閱讀(908) | 評論 (0)編輯 收藏

          1、使用SHOW語句找出在服務器上當前存在什么數據庫:

          mysql> SHOW DATABASES;
          +----------+
          | Database |
          +----------+
          | mysql |
          | test |
          +----------+
          3 rows in set (0.00 sec)


              2、創建一個數據庫abccs
              mysql> CREATE DATABASE abccs;
              注意不同操作系統對大小寫的敏感。

              3、選擇你所創建的數據庫
              mysql> USE abccs
              Database changed
              此時你已經進入你剛才所建立的數據庫abccs.

              4、 創建一個數據庫表

              首先看現在你的數據庫中存在什么表:
              mysql> SHOW TABLES;
              Empty set (0.00 sec)
              說明剛才建立的數據庫中還沒有數據庫表。下面來創建一個數據庫表mytable:
              我們要建立一個你公司員工的生日表,表的內容包含員工姓名、性別、出生日期、出生城市。

          mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1),
          -> birth DATE, birthaddr VARCHAR(20));
          Query OK, 0 rows affected (0.00 sec)


              由于name、birthadd的列值是變化的,因此選擇VARCHAR,其長度不一定是20。可以選擇從1到255的任何長度,如果以后需要改變它的字長,可以使用ALTER TABLE語句。);性別只需一個字符就可以表示:"m"或"f",因此選用CHAR(1);birth列則使用DATE數據類型。

              創建了一個表后,我們可以看看剛才做的結果,用SHOW TABLES顯示數據庫中有哪些表:

          mysql> SHOW TABLES;
          +---------------------+
          | Tables in menagerie |
          +---------------------+
          | mytables |
          +---------------------+


              5、顯示表的結構:

          mysql> DESCRIBE mytable;
          +-------------+-------------+------+-----+---------+-------+
          | Field | Type | Null | Key | Default | Extra |
          +-------------+-------------+------+-----+---------+-------+
          | name | varchar(20) | YES | | NULL | |
          | sex | char(1) | YES | | NULL | |
          | birth | date | YES | | NULL | |
          | deathaddr | varchar(20) | YES | | NULL | |
          +-------------+-------------+------+-----+---------+-------+
          4 rows in set (0.00 sec)


              6、 往表中加入記錄

              我們先用SELECT命令來查看表中的數據:
              mysql> select * from mytable;
              Empty set (0.00 sec)
              這說明剛才創建的表還沒有記錄。

              加入一條新記錄:

          mysql> insert into mytable
          -> values (′abccs′,′f′,′1977-07-07′,′china′);
          Query OK, 1 row affected (0.05 sec)


              再用上面的SELECT命令看看發生了什么變化。我們可以按此方法一條一條地將所有員工的記錄加入到表中。

              7、用文本方式將數據裝入一個數據庫表

              如果一條一條地輸入,很麻煩。我們可以用文本文件的方式將所有記錄加入你的數據庫表中。創建一個文本文件“mysql.txt”,每行包含一個記錄,用定位符(tab)把值分開,并且以在CREATE TABLE語句中列出的列次序給出,例如:

          abccs f 1977-07-07 china  
          mary f 1978-12-12 usa
          tom m 1970-09-02 usa


              使用下面命令將文本文件“mytable.txt”裝載到mytable表中:mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;

              再使用如下命令看看是否已將數據輸入到數據庫表中:mysql> select * from mytable;

          posted @ 2009-06-02 16:16 希 閱讀(1208) | 評論 (1)編輯 收藏

          重量級組件:運行平臺必須存在一個對應的組件.
          輕量級組件:在一個虛擬的畫布上畫出來的組件(所以swing較慢),所有輕量級組件 "最終 "要放到重量級組件(jframe,jdialog)中.由于是畫出來所以能做到各種平臺上一致的表現.同樣,如果混合重量級組件和輕量級組件容易引起重疊上的沖突.  

          JDK   1.2   之后,Java   有了另一組   GUI   的   API,叫做   Swing。因為   Swing   是   lightweight   的   API,所以無所不能,不但有各式各樣先進的組件,而且連組件風格都可抽換。Swing   出現之后,大家很快地就不太使用   AWT   了。
          不要以為   Swing   是用來取代   AWT   的,其實   Swing   是架構在   AWT   之上做出來的(Swing   有四個   heavyweight   組件),沒有   AWT,也就不會有   Swing。Swing   的出現只是減少程序員直接使用   AWT   的機會,而不會讓   AWT   消失。  

          在swing中有5個heavyweight組件:   JFrame,   JDialog,   JApplet,   JInternalFrame,   and   JWindow   ,其它的組件全部是源自JComponent類和lightweight的組件,盡可能的不要使用awt組件。

          posted @ 2009-06-02 15:46 希 閱讀(269) | 評論 (0)編輯 收藏

           當HelloAction類調用HttpServletRequest的setAttribute()方法,向hello.jsp傳遞PersonBean對象時,需要提供一個名為"personbean"的屬性key:
          request.setAttribute("personbean",pb);

              hello.jsp通過這個名為"personbean"的屬性key來讀取PersonBean對象:

          <logic:present name="personbean" scope="request">
               <h2>
                 Hello <bean:write name="personbean" property="userName" />!<p>
               </h2>
          </logic:present>


              對于Struts應用,提倡將這些屬性key常量定義在一個Java文件Constants.java中,例程2-6顯示了它的源程序。

          例程2-6  Constants.java
          package hello;
          public final class Constants {
             /**
               * The application scope attribute under which our user database
               * is stored.
               */
              public static final String PERSON_KEY = "personbean";
          }


              這樣,HelloAction類可以按以下方式來調用HttpServletRequest的setAttribute()方法:request.setAttribute( Constants.PERSON_KEY, pb);

              把一些常量定義在Constants.java中可以提高Action類的獨立性,當屬性key常量值發生改變,只需要修改Constants.java文件,不需要修改Action類。

          此外,在本例中,把PersonBean對象保存在HttpServletRequest對象中。對于其他實際的Web應用,也可以根據需要把JavaBean對象保存在HttpSession對象中。


          本文選自飛思圖書《精通Struts:基于MVC的Java Web設計與開發》

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zaowei21/archive/2005/01/14/253446.aspx

          posted @ 2009-06-01 14:08 希 閱讀(480) | 評論 (0)編輯 收藏

          本文對于Struts的基本工作原理MVC模式不進行具體的討論,僅針對container啟動之后,struts框架中所發生的一些"事情"進行討論。

              通常我們在配置Struts框架的時候,所使用的Controller都是默認的org"apache"struts"action"ActionServlet,它繼承自javax.servlet.http.HttpServlet,因此具有一般servlet的所有特征,必須在web.xml中對其進行注冊。當我們的container第一次啟動的時候(這個說法不是很準確,或者是ActionServlet第一次被請求調用得時候),會自動加載ActionServlet,同時調用其中的init()方法。

          一個用戶的請求是通ActionServlet來處理和轉發的。那么,ActionServlet如何決定把用戶請求轉發給哪個Action對象呢?這就需要一些描述用戶請求路徑和Action衍射關系的配置信息了。在Struts中,這些配置映射信息都存儲在特定的XML文件Struts- config.xml中。在該配置文件中,每一個Action的映射信息都通過一個<Action>元素來配置。

          這些配置信息在系統啟動的時候被讀入內存,供Struts在運行期間使用。在內存中,每一個<action>元素都對應一個org.apache.struts.action.ActionMapping類的實例。

          對于采用Struts框架的web應用,在web應用啟動時就會加載并初始化ActionServlet,ActionServlet從struts- config.xml文件中讀取配置信息,把它們存放到各個配置對象中,例如Action的映射信息存放在ActionMapping

          當ActionServlet接收到一個客戶請求時,將執行如下流程:

          1.檢索和用戶請求相匹配的ActionMapping實例,如果不存在,就返回用戶請求路徑無效信息。

          2.如ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。

          3.根據配置信息決定是否需要表單驗證。如果需要驗證,就調用ActionForm的Validate()方法。

          4.如果ActionForm的Validate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象,就表示表單驗證成功。

          5.ActionServlet根據ActionMapping實例包含的映射信息決定將請求轉發給哪個Action。如果相應的Action實例不存在,就先創建這個實例,然后調用Action的execute()方法。

          6.Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指向的JSP組件。

          7.ActionForward對象指向的JSP組件生成動態網頁,返回給客戶。

          posted @ 2009-05-31 17:33 希 閱讀(188) | 評論 (0)編輯 收藏

          當用戶打開PC的電源,BIOS開機自檢,按BIOS中設置的啟動設備(通常是硬盤)啟動,接著啟動設備上安裝的引導程序lilo或grub開始引導Linux,Linux首先進行內核的引導,接下來執行init程序,init程序調用了rc.sysinit和rc等程序,rc.sysinit和rc當完成系統初始化和運行服務的任務后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統,用戶登錄成功后進入了Shell,這樣就完成了從開機到登錄的整個啟動過程。

              下面就將逐一介紹其中幾個關鍵的部分:


            第一部分:內核的引導(核內引導)

            Red Hat9.0可以使用lilo或grub等引導程序開始引導Linux系統,當引導程序成功完成引導任務后,Linux從它們手中接管了CPU的控制權,然后CPU就開始執行Linux的核心映象代碼,開始了Linux啟動過程。這里使用了幾個匯編程序來引導Linux,這一步泛及到Linux源代碼樹中的“arch/i386/boot”下的這幾個文件:bootsect.S、setup.S、video.S等。

            其中bootsect.S是生成引導扇區的匯編源碼,它完成加載動作后直接跳轉到setup.S的程序入口。setup.S的主要功能就是將系統參數(包括內存、磁盤等,由BIOS返回)拷貝到特別內存中,以便以后這些參數被保護模式下的代碼來讀取。此外,setup.S還將video.S中的代碼包含進來,檢測和設置顯示器和顯示模式。最后,setup.S將系統轉換到保護模式,并跳轉到 0x100000。

            那么0x100000這個內存地址中存放的是什么代碼?而這些代碼又是從何而來的呢?

            0x100000這個內存地址存放的是解壓后的內核,因為Red Hat提供的內核包含了眾多驅動和功能而顯得比較大,所以在內核編譯中使用了“makebzImage”方式,從而生成壓縮過的內核,在RedHat中內核常常被命名為vmlinuz,在Linux的最初引導過程中,是通過"arch/i386/boot/compressed/"中的head.S利用misc.c中定義的decompress_kernel()函數,將內核vmlinuz解壓到0x100000的。

            當CPU跳到0x100000時,將執行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳轉到start_kernel()中去了。start_kernel()是"init/main.c"中的定義的函數,start_kernel()中調用了一系列初始化函數,以完成kernel本身的設置。start_kernel()函數中,做了大量的工作來建立基本的Linux核心環境。如果順利執行完start_kernel(),則基本的Linux核心環境已經建立起來了。

            在start_kernel()的最后,通過調用init()函數,系統創建第一個核心線程,啟動了init過程。而核心線程init()主要是來進行一些外設初始化的工作的,包括調用do_basic_setup()完成外設及其驅動程序的加載和初始化。并完成文件系統初始化和root文件系統的安裝。

            當do_basic_setup()函數返回init(),init()又打開了/dev/console設備,重定向三個標準的輸入輸出文件stdin、stdout和stderr到控制臺,最后,搜索文件系統中的init程序(或者由init=命令行參數指定的程序),并使用 execve()系統調用加載執行init程序。到此init()函數結束,內核的引導部分也到此結束了,

              第二部分:運行init


            init的進程號是1,從這一點就能看出,init進程是系統所有進程的起點,Linux在完成核內引導以后,就開始運行init程序,。init程序需要讀取配置文件/etc/inittab。inittab是一個不可執行的文本文件,它有若干行指令所組成。在Redhat系統中,inittab的內容如下所示(以“###"開始的中注釋為筆者增加的):

            #
            # inittab       This file describes how the INIT process should set up
            #               the system in a certain run-level.
            #
            # Author:       Miquel van Smoorenburg,

            #               Modified for RHS Linux by Marc Ewing and Donnie Barnes
            #

            # Default runlevel. The runlevels used by RHS are:
            #   0 - halt (Do NOT set initdefault to this)
            #   1 - Single user mode
            #   2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
            #   3 - Full multiuser mode
            #   4 - unused
            #   5 - X11
            #   6 - reboot (Do NOT set initdefault to this)
            #
            ###表示當前缺省運行級別為5(initdefault);
            id:5:initdefault:

            ###啟動時自動執行/etc/rc.d/rc.sysinit腳本(sysinit)
            # System initialization.
            si::sysinit:/etc/rc.d/rc.sysinit

            l0:0:wait:/etc/rc.d/rc 0
            l1:1:wait:/etc/rc.d/rc 1
            l2:2:wait:/etc/rc.d/rc 2
            l3:3:wait:/etc/rc.d/rc 3
            l4:4:wait:/etc/rc.d/rc 4
            ###當運行級別為5時,以5為參數運行/etc/rc.d/rc腳本,init將等待其返回(wait)
            l5:5:wait:/etc/rc.d/rc 5
            l6:6:wait:/etc/rc.d/rc 6

            ###在啟動過程中允許按CTRL-ALT-DELETE重啟系統
            # Trap CTRL-ALT-DELETE
            ca::ctrlaltdel:/sbin/shutdown -t3 -r now

            # When our UPS tells us power has failed, assume we have a few minutes
            # of power left.  Schedule a shutdown for 2 minutes from now.
            # This does, of course, assume you have powerd installed and your
            # UPS connected and working correctly.
            pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

            # If power was restored before the shutdown kicked in, cancel it.
            pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

            ###在2、3、4、5級別上以ttyX為參數執行/sbin/mingetty程序,打開ttyX終端用于用戶登錄,
            ###如果進程退出則再次運行mingetty程序(respawn)
            # Run gettys in standard runlevels
            1:2345:respawn:/sbin/mingetty tty1
            2:2345:respawn:/sbin/mingetty tty2
            3:2345:respawn:/sbin/mingetty tty3
            4:2345:respawn:/sbin/mingetty tty4
            5:2345:respawn:/sbin/mingetty tty5
            6:2345:respawn:/sbin/mingetty tty6

            ###在5級別上運行xdm程序,提供xdm圖形方式登錄界面,并在退出時重新執行(respawn)
            # Run xdm in runlevel 5
            x:5:respawn:/etc/X11/prefdm -nodaemon

          以上面的inittab文件為例,來說明一下inittab的格式。其中以#開始的行是注釋行,除了注釋行之外,每一行都有以下格式:
            id:runlevel:action:process

            對上面各項的詳細解釋如下:

            1. id

            id是指入口標識符,它是一個字符串,對于getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。

            2. runlevel

            runlevel是init所處于的運行級別的標識,一般使用0-6以及S或s。0、1、6運行級別被系統保留:其中0作為shutdown動作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現,實際上,進入單用戶模式時,init直接在控制臺(/dev/console)上運行/sbin/sulogin。在一般的系統實現中,都使用了2、3、4、5幾個級別,在Redhat系統中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級別也是可以使用的,傳統的Unix系統沒有定義這幾個級別。runlevel可以是并列的多個值,以匹配多個運行級別,對大多數action來說,僅當runlevel與當前運行級別匹配成功才會執行。

            3. action

            action是描述其后的process的運行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:

            initdefault是一個特殊的action值,用于標識缺省的啟動級別;當init由核心激活以后,它將讀取inittab中的initdefault項,取得其中的runlevel,并作為當前的運行級別。如果沒有inittab文件,或者其中沒有initdefault項,init將在控制臺上請求輸入runlevel。

            sysinit、boot、bootwait等action將在系統啟動時無條件運行,而忽略其中的runlevel。

            其余的action(不含initdefault)都與某個runlevel相關。各個action的定義在inittab的man手冊中有詳細的描述。

            4. process

            process為具體的執行程序。程序后面可以帶參數。

            第三部分:系統初始化

            在init的配置文件中有這么一行:

            si::sysinit:/etc/rc.d/rc.sysinit

            它調用執行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash shell的腳本,它主要是完成一些系統初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本。它主要完成的工作有:激活交換分區,檢查磁盤,加載硬件模塊以及其它一些需要優先執行任務。

            rc.sysinit約有850多行,但是每個單一的功能還是比較簡單,而且帶有注釋,建議有興趣的用戶可以自行閱讀自己機器上的該文件,以了解系統初始化所詳細情況。由于此文件較長,所以不在本文中列出來,也不做具體的介紹。

            當rc.sysinit程序執行完畢后,將返回init繼續下一步。


          第四部分:啟動對應運行級別的守護進程


            在rc.sysinit執行后,將返回init繼續其它的動作,通常接下來會執行到/etc/rc.d/rc程序。以運行級別3為例,init將執行配置文件inittab中的以下這行:

            l5:5:wait:/etc/rc.d/rc 5

            這一行表示以5為參數運行/etc/rc.d/rc,/etc/rc.d/rc是一個Shell腳本,它接受5作為參數,去執行/etc/rc.d/rc5.d/目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d/目錄中的這些啟動腳本實際上都是一些鏈接文件,而不是真正的rc啟動腳本,真正的rc啟動腳本實際上都是放在/etc/rc.d/init.d/目錄下。而這些rc啟動腳本有著類似的用法,它們一般能接受start、stop、restart、status等參數。

            /etc/rc.d/rc5.d/中的rc啟動腳本通常是K或S開頭的鏈接文件,對于以以S開頭的啟動腳本,將以start參數來運行。而如果發現存在相應的腳本也存在K打頭的鏈接,而且已經處于運行態了(以/var/lock/subsys/下的文件作為標志),則將首先以stop為參數停止這些已經啟動了的守護進程,然后再重新運行。這樣做是為了保證是當init改變運行級別時,所有相關的守護進程都將重啟。

            至于在每個運行級中將運行哪些守護進程,用戶可以通過chkconfig或setup中的"System Services"來自行設定。常見的守護進程有:

            amd:自動安裝NFS守護進程
            apmd:高級電源管理守護進程
            arpwatch:記錄日志并構建一個在LAN接口上看到的以太網地址和IP地址對數據庫
            autofs:自動安裝管理進程automount,與NFS相關,依賴于NIS
            crond:Linux下的計劃任務的守護進程
            named:DNS服務器
            netfs:安裝NFS、Samba和NetWare網絡文件系統
            network:激活已配置網絡接口的腳本程序
            nfs:打開NFS服務
            portmap:RPC portmap管理器,它管理基于RPC服務的連接
            sendmail:郵件服務器sendmail
            smb:Samba文件共享/打印服務
            syslog:一個讓系統引導時起動syslog和klogd系統日志守候進程的腳本
            xfs:X Window字型服務器,為本地和遠程X服務器提供字型集
            Xinetd:支持多種網絡服務的核心守護進程,可以管理wuftp、sshd、telnet等服務

            這些守護進程也啟動完成了,rc程序也就執行完了,然后又將返回init繼續下一步。

              第五部分:建立終端


            rc執行完畢后,返回init。這時基本系統環境已經設置好了,各種守護進程也已經啟動了。init接下來會打開6個終端,以便用戶登錄系統。通過按Alt+Fn(n對應1-6)可以在這6個終端中切換。在inittab中的以下6行就是定義了6個終端:

            1:2345:respawn:/sbin/mingetty tty1
            2:2345:respawn:/sbin/mingetty tty2
            3:2345:respawn:/sbin/mingetty tty3
            4:2345:respawn:/sbin/mingetty tty4
            5:2345:respawn:/sbin/mingetty tty5
            6:2345:respawn:/sbin/mingetty tty6

            從上面可以看出在2、3、4、5的運行級別中都將以respawn方式運行mingetty程序,mingetty程序能打開終端、設置模式。同時它會顯示一個文本登錄界面,這個界面就是我們經常看到的登錄界面,在這個登錄界面中會提示用戶輸入用戶名,而用戶輸入的用戶將作為參數傳給login程序來驗證用戶的身份。

            第六部分:登錄系統,啟動完成

            對于運行級別為5的圖形方式用戶來說,他們的登錄是通過一個圖形化的登錄界面。登錄成功后可以直接進入KDE、Gnome等窗口管理器。而本文主要講的還是文本方式登錄的情況:

            當我們看到mingetty的登錄界面時,我們就可以輸入用戶名和密碼來登錄系統了。

            Linux的賬號驗證程序是login,login會接收mingetty傳來的用戶名作為用戶名參數。然后login會對用戶名進行分析:如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內容,然后退出。這通常用來系統維護時防止非root用戶登錄。只有/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個文件,則root可以在任何終端上登錄。/etc/usertty文件用于對用戶作出附加訪問限制,如果不存在這個文件,則沒有其他限制。

            在分析完用戶名后,login將搜索/etc/passwd以及/etc/shadow來驗證密碼以及設置賬戶的其它信息,比如:主目錄是什么、使用何種shell。如果沒有指定主目錄,將默認為根目錄;如果沒有指定shell,將默認為/bin/bash。

            login程序成功后,會向對應的終端在輸出最近一次登錄的信息(在/var/log/lastlog中有記錄),并檢查用戶是否有新郵件(在/usr/spool/mail/的對應用戶名目錄下)。然后開始設置各種環境變量:對于bash來說,系統首先尋找/etc/profile腳本文件,并執行它;然后如果用戶的主目錄中存在.bash_profile文件,就執行它,在這些文件中又可能調用了其它配置文件,所有的配置文件執行后后,各種環境變量也設好了,這時會出現大家熟悉的命令行提示符,到此整個啟動過程就結束了。

          posted @ 2009-05-25 11:06 希 閱讀(186) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 

          posts - 40, comments - 9, trackbacks - 0, articles - 9

          Copyright © 希

          主站蜘蛛池模板: 铜山县| 个旧市| 台北县| 依兰县| 嘉荫县| 太保市| 新龙县| 北票市| 佛山市| 璧山县| 洛隆县| 高雄市| 和静县| 格尔木市| 达孜县| 彭山县| 凭祥市| 莱阳市| 富裕县| 石城县| 哈巴河县| 石景山区| 雅安市| 运城市| 龙门县| 宜兰县| 长泰县| 进贤县| 富民县| 隆尧县| 淮阳县| 和顺县| 广德县| 长武县| 读书| 外汇| 铁力市| 九台市| 宿松县| 确山县| 宜丰县|