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

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

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

    數(shù)據(jù)加載中……

    3.14 面試遇到的問題

       1.JDBC有幾種驅(qū)動類型:  

         type   1:jdbc-odbc橋    
      type   2:本地api驅(qū)動    
      type   3:網(wǎng)絡(luò)協(xié)議驅(qū)動    
      type   4:本地協(xié)議驅(qū)動    

    Type   1:   jdbc-odbc橋    
         Jdbc-odbc橋是sun公司提供的,是jdk提供的的標準api.   這種類型的驅(qū)動實際是把所有jdbc的調(diào)用傳遞給odbc   ,再由odbc調(diào)用本地數(shù)據(jù)庫驅(qū)動代碼.(   本地數(shù)據(jù)庫驅(qū)動代碼是指由數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫操作二進制代碼庫,例如在oracle for windows中就是oci   dll  文件)   

          jdbc-odbc橋 ---- odbc---- 廠商DB代碼 ----- 數(shù)據(jù)庫Server     
                                              (圖一)    

            只要本地機裝有相關(guān)的odbc驅(qū)動那么采用jdbc-odbc橋幾乎可以訪問所有的數(shù)據(jù)庫,jdbc-odbc方法對于客戶端已經(jīng)具備odbc   driver的應用還是可行的.但是,由于jdbc-odbc先調(diào)用odbc再由odbc去調(diào)用本地數(shù)據(jù)庫接口訪問數(shù)據(jù)庫.所以,執(zhí)行效率比較低,對于那些大數(shù)據(jù)量存取的應用是不適合的.而且,這種方法要求客戶端必須安裝odbc   驅(qū)動,所以對于基于internet   ,intranet的應用也是不合適的.因為,你不可能要求所有客戶都能找到odbc   driver.     

     Type   2:   本地Api驅(qū)動    
          本地api驅(qū)動直接把jdbc調(diào)用轉(zhuǎn)變?yōu)閿?shù)據(jù)庫的標準調(diào)用再去訪問數(shù)據(jù)庫.這種方法需要本地數(shù)據(jù)庫驅(qū)動代碼.    
       
      本地api驅(qū)動----廠商DB代碼-----數(shù)據(jù)庫Server     

                                           (圖二)     
             這種驅(qū)動比起jdbc-odbc橋執(zhí)行效率大大提高了.但是,它仍然需要在客戶端加載數(shù)據(jù)庫廠商提供的代碼庫.這樣就不適合基于internet的應用.并且,他的執(zhí)行效率比起3,4型的jdbc驅(qū)動還是不夠高.    
       
      Type3:網(wǎng)絡(luò)協(xié)議驅(qū)動    
              這種驅(qū)動實際上是根據(jù)我們熟悉的三層結(jié)構(gòu)建立的.   jdbc先把對數(shù)局庫的訪問請求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器.   中間件服務(wù)器再把請求翻譯為符合數(shù)據(jù)庫規(guī)范的調(diào)用,再把這種調(diào)用傳給數(shù)據(jù)庫服務(wù)器.如果中間件服務(wù)器也是用java開發(fā)的,那么在在中間層也可以使用1,2型 jdbc驅(qū)動程序作為訪問數(shù)據(jù)庫的方法.    
       
      網(wǎng)絡(luò)協(xié)議驅(qū)動---------中間件服務(wù)器------------數(shù)據(jù)庫Server    
                                    (   圖三)    
       
             由于這種驅(qū)動是基于server的.所以,它不需要在客戶端加載數(shù)據(jù)庫廠商提供的代碼庫.而且他在執(zhí)行效率和可升級性方面是比較好的.因為大部分功能實現(xiàn)都在server端,所以這種驅(qū)動可以設(shè)計的很小,可以非常快速的加載到內(nèi)存中.   但是,這種驅(qū)動在中間件層仍然需要有配置其它數(shù)據(jù)庫驅(qū)動程序,并且由于多了一個中間層傳遞數(shù)據(jù),它的執(zhí)行效率還不是最好.     

        
      Type4   本地協(xié)議驅(qū)動    
              這種驅(qū)動直接把jdbc調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫系統(tǒng)規(guī)范的請求.由于4型驅(qū)動寫的應用可以直接和數(shù)據(jù)庫服務(wù)器通訊.這種類型的驅(qū)動完全由java實現(xiàn),因此實現(xiàn)了平臺獨立性.    
       
      本地協(xié)議驅(qū)動---------數(shù)據(jù)庫Server    
                         (   圖四)    
       
             由于這種驅(qū)動不需要先把jdbc的調(diào)用傳給odbc或本地數(shù)據(jù)庫接口或者是中間層服務(wù)器.所以它的執(zhí)行效率是非常高的.而且,它根本不需要在客戶端或服務(wù)器端裝載任何的軟件或驅(qū)動. 這種驅(qū)動程序可以動態(tài)的被下載.但是對于不同的數(shù)據(jù)庫需要下載不同的驅(qū)動程序.    
       
       
      以上對四種類型的jdbc驅(qū)動做了一個說明.那么它們適合那種類型的應用開發(fā)呢?Jdbc-odbc橋由于它的執(zhí)行效率不高,更適合做為開發(fā)應用時的一種過度方案,或著對于初學者了解jdbc編程也較適用.  對于那些需要大數(shù)據(jù)量操作的應用程序則應該考慮2,3,4型驅(qū)動.在intranet方面的應用可以考慮2型驅(qū)動,但是由于3,4型驅(qū)動在執(zhí)行效率上比2型驅(qū)動有著明顯的優(yōu)勢,而且目前開發(fā)的趨勢是使用純java.所以3,4型驅(qū)動也可以作為考慮對象. 至于基于internet方面的應用就只有考慮3,4型驅(qū)動了.   因為3型驅(qū)動可以把多種數(shù)據(jù)庫驅(qū)動都配置在中間層服務(wù)器.所以3型驅(qū)動最適合那種需要同時連接多個不同種類的數(shù)據(jù)庫, 并且對并發(fā)連接要求高的應用.   4型驅(qū)動則適合那些連接單一數(shù)據(jù)庫的工作組應用.

    posted @ 2008-03-14 23:41 flyleer| 編輯 收藏
    format

                今天項目中碰到一個科學計算法的問題,我保存到數(shù)據(jù)庫的是數(shù)字,但是從數(shù)據(jù)庫中取出來在頁面展現(xiàn)的時候確變成了科學計算法的形式了。最后查了下,發(fā)現(xiàn)<bean:write/>里有個屬性format="##.00"這樣可以就正確顯示保存的數(shù)字。因為我的涉及到小數(shù)點的問題,所以我保留了兩位有效數(shù)字。

    posted @ 2007-11-28 16:15 flyleer| 編輯 收藏
    【轉(zhuǎn)】js日期時間函數(shù)

    Date.prototype.isLeapYear 判斷閏年
    Date.prototype.Format 日期格式化
    Date.prototype.DateAdd 日期計算
    Date.prototype.DateDiff 比較日期差
    Date.prototype.toString 日期轉(zhuǎn)字符串
    Date.prototype.toArray 日期分割為數(shù)組
    Date.prototype.DatePart 取日期的部分信息
    Date.prototype.MaxDayOfDate 取日期所在月的最大天數(shù)
    Date.prototype.WeekNumOfYear 判斷日期所在年的第幾周
    StringToDate 字符串轉(zhuǎn)日期型
    IsValidDate 驗證日期有效性
    CheckDateTime 完整日期時間檢查
    daysBetween 日期天數(shù)差

    js 代碼
     
    1. //---------------------------------------------------  
    2. // 判斷閏年  
    3. //---------------------------------------------------  
    4. Date.prototype.isLeapYear = function()   
    5. {   
    6.     return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));   
    7. }   
    8.   
    9. //---------------------------------------------------  
    10. // 日期格式化  
    11. // 格式 YYYY/yyyy/YY/yy 表示年份  
    12. // MM/M 月份  
    13. // W/w 星期  
    14. // dd/DD/d/D 日期  
    15. // hh/HH/h/H 時間  
    16. // mm/m 分鐘  
    17. // ss/SS/s/S 秒  
    18. //---------------------------------------------------  
    19. Date.prototype.Format = function(formatStr)   
    20. {   
    21.     var str = formatStr;   
    22.     var Week = ['日','一','二','三','四','五','六'];  
    23.   
    24.     str=str.replace(/yyyy|YYYY/,this.getFullYear());   
    25.     str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));   
    26.   
    27.     str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth());   
    28.     str=str.replace(/M/g,this.getMonth());   
    29.   
    30.     str=str.replace(/w|W/g,Week[this.getDay()]);   
    31.   
    32.     str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());   
    33.     str=str.replace(/d|D/g,this.getDate());   
    34.   
    35.     str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());   
    36.     str=str.replace(/h|H/g,this.getHours());   
    37.     str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());   
    38.     str=str.replace(/m/g,this.getMinutes());   
    39.   
    40.     str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());   
    41.     str=str.replace(/s|S/g,this.getSeconds());   
    42.   
    43.     return str;   
    44. }   
    45.   
    46. //+---------------------------------------------------  
    47. //| 求兩個時間的天數(shù)差 日期格式為 YYYY-MM-dd   
    48. //+---------------------------------------------------  
    49. function daysBetween(DateOne,DateTwo)  
    50. {   
    51.     var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));  
    52.     var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);  
    53.     var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));  
    54.   
    55.     var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));  
    56.     var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);  
    57.     var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));  
    58.   
    59.     var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);   
    60.     return Math.abs(cha);  
    61. }  
    62.   
    63.   
    64. //+---------------------------------------------------  
    65. //| 日期計算  
    66. //+---------------------------------------------------  
    67. Date.prototype.DateAdd = function(strInterval, Number) {   
    68.     var dtTmp = this;  
    69.     switch (strInterval) {   
    70.         case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number));  
    71.         case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number));  
    72.         case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number));  
    73.         case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number));  
    74.         case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));  
    75.         case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    76.         case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    77.         case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    78.     }  
    79. }  
    80.   
    81. //+---------------------------------------------------  
    82. //| 比較日期差 dtEnd 格式為日期型或者 有效日期格式字符串  
    83. //+---------------------------------------------------  
    84. Date.prototype.DateDiff = function(strInterval, dtEnd) {   
    85.     var dtStart = this;  
    86.     if (typeof dtEnd == 'string' )//如果是字符串轉(zhuǎn)換為日期型  
    87.     {   
    88.         dtEnd = StringToDate(dtEnd);  
    89.     }  
    90.     switch (strInterval) {   
    91.         case 's' :return parseInt((dtEnd - dtStart) / 1000);  
    92.         case 'n' :return parseInt((dtEnd - dtStart) / 60000);  
    93.         case 'h' :return parseInt((dtEnd - dtStart) / 3600000);  
    94.         case 'd' :return parseInt((dtEnd - dtStart) / 86400000);  
    95.         case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));  
    96.         case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);  
    97.         case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();  
    98.     }  
    99. }  
    100.   
    101. //+---------------------------------------------------  
    102. //| 日期輸出字符串,重載了系統(tǒng)的toString方法  
    103. //+---------------------------------------------------  
    104. Date.prototype.toString = function(showWeek)  
    105. {   
    106.     var myDate= this;  
    107.     var str = myDate.toLocaleDateString();  
    108.     if (showWeek)  
    109.     {   
    110.         var Week = ['日','一','二','三','四','五','六'];  
    111.         str += ' 星期' + Week[myDate.getDay()];  
    112.     }  
    113.     return str;  
    114. }  
    115.   
    116. //+---------------------------------------------------  
    117. //| 日期合法性驗證  
    118. //| 格式為:YYYY-MM-DD或YYYY/MM/DD  
    119. //+---------------------------------------------------  
    120. function IsValidDate(DateStr)   
    121. {   
    122.     var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去兩邊空格;   
    123.     if(sDate==''return true;   
    124.     //如果格式滿足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替換為''   
    125.     //數(shù)據(jù)庫中,合法日期可以是:YYYY-MM/DD(2003-3/21),數(shù)據(jù)庫會自動轉(zhuǎn)換為YYYY-MM-DD格式   
    126.     var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');   
    127.     if (s==''//說明格式滿足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D   
    128.     {   
    129.         var t=new Date(sDate.replace(/\-/g,'/'));   
    130.         var ar = sDate.split(/[-/:]/);   
    131.         if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())   
    132.         {   
    133.             //alert('錯誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    134.             return false;   
    135.         }   
    136.     }   
    137.     else   
    138.     {   
    139.         //alert('錯誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    140.         return false;   
    141.     }   
    142.     return true;   
    143. }   
    144.   
    145. //+---------------------------------------------------  
    146. //| 日期時間檢查  
    147. //| 格式為:YYYY-MM-DD HH:MM:SS  
    148. //+---------------------------------------------------  
    149. function CheckDateTime(str)  
    150. {   
    151.     var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;   
    152.     var r = str.match(reg);   
    153.     if(r==null)return false;   
    154.     r[2]=r[2]-1;   
    155.     var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);   
    156.     if(d.getFullYear()!=r[1])return false;   
    157.     if(d.getMonth()!=r[2])return false;   
    158.     if(d.getDate()!=r[3])return false;   
    159.     if(d.getHours()!=r[4])return false;   
    160.     if(d.getMinutes()!=r[5])return false;   
    161.     if(d.getSeconds()!=r[6])return false;   
    162.     return true;   
    163. }   
    164.   
    165. //+---------------------------------------------------  
    166. //| 把日期分割成數(shù)組  
    167. //+---------------------------------------------------  
    168. Date.prototype.toArray = function()  
    169. {   
    170.     var myDate = this;  
    171.     var myArray = Array();  
    172.     myArray[0] = myDate.getFullYear();  
    173.     myArray[1] = myDate.getMonth();  
    174.     myArray[2] = myDate.getDate();  
    175.     myArray[3] = myDate.getHours();  
    176.     myArray[4] = myDate.getMinutes();  
    177.     myArray[5] = myDate.getSeconds();  
    178.     return myArray;  
    179. }  
    180.   
    181. //+---------------------------------------------------  
    182. //| 取得日期數(shù)據(jù)信息  
    183. //| 參數(shù) interval 表示數(shù)據(jù)類型  
    184. //| y 年 m月 d日 w星期 ww周 h時 n分 s秒  
    185. //+---------------------------------------------------  
    186. Date.prototype.DatePart = function(interval)  
    187. {   
    188.     var myDate = this;  
    189.     var partStr='';  
    190.     var Week = ['日','一','二','三','四','五','六'];  
    191.     switch (interval)  
    192.     {   
    193.         case 'y' :partStr = myDate.getFullYear();break;  
    194.         case 'm' :partStr = myDate.getMonth()+1;break;  
    195.         case 'd' :partStr = myDate.getDate();break;  
    196.         case 'w' :partStr = Week[myDate.getDay()];break;  
    197.         case 'ww' :partStr = myDate.WeekNumOfYear();break;  
    198.         case 'h' :partStr = myDate.getHours();break;  
    199.         case 'n' :partStr = myDate.getMinutes();break;  
    200.         case 's' :partStr = myDate.getSeconds();break;  
    201.     }  
    202.     return partStr;  
    203. }  
    204.   
    205. //+---------------------------------------------------  
    206. //| 取得當前日期所在月的最大天數(shù)  
    207. //+---------------------------------------------------  
    208. Date.prototype.MaxDayOfDate = function()  
    209. {   
    210.     var myDate = this;  
    211.     var ary = myDate.toArray();  
    212.     var date1 = (new Date(ary[0],ary[1]+1,1));  
    213.     var date2 = date1.dateAdd(1,'m',1);  
    214.     var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));  
    215.     return result;  
    216. }  
    217.   
    218. //+---------------------------------------------------  
    219. //| 取得當前日期所在周是一年中的第幾周  
    220. //+---------------------------------------------------  
    221. Date.prototype.WeekNumOfYear = function()  
    222. {   
    223.     var myDate = this;  
    224.     var ary = myDate.toArray();  
    225.     var year = ary[0];  
    226.     var month = ary[1]+1;  
    227.     var day = ary[2];  
    228.     document.write('< script language=VBScript\> \n');  
    229.     document.write('myDate = DateValue(''+month+'-'+day+'-'+year+'') \n');  
    230.     document.write('result = DatePart('ww', myDate) \n');  
    231.     document.write(' \n');  
    232.     return result;  
    233. }  
    234.   
    235. //+---------------------------------------------------  
    236. //| 字符串轉(zhuǎn)成日期類型   
    237. //| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd  
    238. //+---------------------------------------------------  
    239. function StringToDate(DateStr)  
    240. {   
    241.   
    242.     var converted = Date.parse(DateStr);  
    243.     var myDate = new Date(converted);  
    244.     if (isNaN(myDate))  
    245.     {   
    246.         //var delimCahar = DateStr.indexOf('/')!=-1?'/':'-';  
    247.         var arys= DateStr.split('-');  
    248.         myDate = new Date(arys[0],--arys[1],arys[2]);  
    249.     }  
    250.     return myDate;  
    251. }  

    posted @ 2007-10-05 17:43 flyleer| 編輯 收藏
    生成隨機數(shù)(轉(zhuǎn)貼)

    有時候在我們的網(wǎng)絡(luò)應用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當然,如果驗證碼很有規(guī)律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網(wǎng)站的驗證碼,因為比較有規(guī)律,所以被識別了,并且識別率達到99%左右,其實我們可以制作很復雜一點的驗證碼,添加一些干擾的線條或者字體變形,使程序識別的難度加大,這樣,我們的目的也就達到了.

    下面是生成的圖片:


    代碼如下,JSP代碼

    <%@page contentType="image/jpeg"%>
    <%@page pageEncoding="UTF-8"%>
    <%@ page import="java.awt.*,javax.imageio.*,java.io.*,java.util.*,java.awt.image.*" %>
    <%--
    The taglib directive below imports the JSTL library. If you uncomment it,
    you must also add the JSTL library to the project. The Add Library action
    on Libraries node in Projects view can be used to add the JSTL 
    1.1 library.
    --%>
    <%--
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    --%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <%!String s="";%>
    <%
    java.util.List
    <String> fonts=new ArrayList<String>();
    GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
    String[] names
    =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
    for(String s:names){
        
    char c=s.charAt(0);
        
    if(Character.isLowerCase(c)||Character.isUpperCase(c)){
            
        }
    else{
            fonts.add(s);
        }
    }
    BufferedImage bi
    =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
    Graphics2D g
    =bi.createGraphics();
    char[] cs={'0','1','2','3','4','5','6','7','8','9'};
    char[] use=new char[4];
    g.setColor(
    new Color(240,240,240));
    g.fillRect(
    0,0,200,50);
    for(int i=0;i<4;i++){
        Point p
    =new Point(5+(i*((int)(Math.random()*10)+40)),40);
        
    int size=0;
        
    int[] sizes=new int[20];
        
    for(int j=0;j<20;j++){
            sizes[j]
    =30+j;
        }
        size
    =sizes[(int)(Math.random()*sizes.length)];
        
    int face=0;
        
    if(Math.random()*10>5){
            face
    =Font.BOLD;
        }
    else{
            face
    =Font.ITALIC;
        }
        use[i]
    =cs[(int)(Math.random()*cs.length)];
        g.setPaint(
    new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                p.x,p.y
    -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))));
        g.setFont(
    new Font(fonts.get((int)(Math.random()*fonts.size())),face,size));
        g.drawString(
    ""+use[i],p.x,p.y);
    }
    s
    =new String(use);
    session.setAttribute(
    "code", s);
    g.setPaint(
    null);
    for(int i=0;i<4;i++){
        g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
        g.drawLine((
    int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
    }
    Random random 
    = new Random();
    for (int i=0;i<88;i++) {
        
    int x = random.nextInt(200);
        
    int y = random.nextInt(50);
        g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
        g.setStroke(
    new BasicStroke((float)(Math.random()*3)));
        g.drawLine(x,y,x,y);
    }
    OutputStream ot
    =response.getOutputStream();
    ImageIO.write(bi,
    "JPEG",ot);
    g.dispose();
    ot.close();
    %>

    以下是Servlet代碼
    /*
     * Code.java
     *
     * Created on 2007年9月21日, 下午12:08
     
    */

    package com.hadeslee;

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GradientPaint;
    import java.awt.Graphics2D;
    import java.awt.GraphicsEnvironment;
    import java.awt.Paint;
    import java.awt.Point;
    import java.awt.Stroke;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    import java.util.Random;
    import javax.imageio.ImageIO;

    import javax.servlet.*;
    import javax.servlet.http.*;

    /**
     *
     * 
    @author lbf
     * 
    @version
     
    */
    public class Code extends HttpServlet {
        
        
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    private List<String> fonts=new ArrayList<String>();
        
    public Code(){
            initFonts();
        }
        
    private void initFonts(){
            GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
            String[] names
    =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
            
    for(String s:names){
                
    char c=s.charAt(0);
                
    if(Character.isLowerCase(c)||Character.isUpperCase(c)){
                    
                }
    else{
                    fonts.add(s);
                }
            }
        }
        
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            response.setContentType(
    "image/jpeg;charset=UTF-8");
            OutputStream out
    =response.getOutputStream();
            BufferedImage bi
    =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
            Graphics2D g
    =bi.createGraphics();
            
    char[] cs={'0','1','2','3','4','5','6','7','8','9'};
            
    char[] use=new char[4];
            g.setColor(
    new Color(240,240,240));
            g.fillRect(
    0,0,200,50);
            
    for(int i=0;i<4;i++){
                Point p
    =getPoint(i);
                
    int size=getSize();
                use[i]
    =cs[(int)(Math.random()*cs.length)];
               
    // g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
                g.setPaint(getPaint(p,size));
                g.setFont(
    new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
                g.drawString(
    ""+use[i],p.x,p.y);
            }
            g.setStroke(
    new BasicStroke(1.0f));
            g.setPaint(
    null);
            
    for(int i=0;i<4;i++){
                g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
                g.drawLine((
    int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
            }
            Random random 
    = new Random();
            
    for (int i=0;i<88;i++) {
                
    int x = random.nextInt(200);
                
    int y = random.nextInt(50);
                g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
                g.setStroke(getStroke());
                g.drawLine(x,y,x,y);
            }
            ImageIO.write(bi,
    "JPEG",out);
            out.close();
            g.dispose();
        }
        
    private Stroke getStroke(){
          BasicStroke bs
    =new BasicStroke((float)(Math.random()*3));
          
    return bs;
        }
        
    private Point getPoint(int index){
            
    return new Point(5+(index*((int)(Math.random()*10)+40)),40);
        }
        
    private Paint getPaint(Point p,int size){
            GradientPaint gp
    =new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                    p.x,p.y
    -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
            
    return gp;
        }
        
    private int getFace(){
            
    if(Math.random()*10>5){
                
    return Font.BOLD;
            }
    else{
                
    return Font.ITALIC;
            }
        }
        
    private int getSize(){
            
    int[] sizes=new int[20];
            
    for(int i=0;i<20;i++){
                sizes[i]
    =30+i;
            }
            
    return sizes[(int)(Math.random()*sizes.length)];
        }
        
        
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
        /** Handles the HTTP <code>GET</code> method.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            processRequest(request, response);
        }
        
        
    /** Handles the HTTP <code>POST</code> method.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            processRequest(request, response);
        }
        
        
    /** Returns a short description of the servlet.
         
    */
        
    public String getServletInfo() {
            
    return "Short description";
        }
        
    // </editor-fold>
    }

    posted @ 2007-10-05 17:41 flyleer| 編輯 收藏
    oracle sql(轉(zhuǎn)貼)

         摘要: 一 常用的SQL語句 select name,count(*) from table where .. group by ... 中能查詢的字段只能為group by的字段. select * from table where rownum < 5 order by id 中查詢出來的結(jié)果不是按數(shù)據(jù)中的ID排序的,而只是將select * from t...  閱讀全文

    posted @ 2007-10-05 17:32 flyleer| 編輯 收藏
    跟隨鼠標移動的層,用于顯示某些由于標題太長的內(nèi)容

    function remove(){
       document.body.removeChild(document.getElementById("showDive"));
      }
      
      function insert(hid,showid){
      
       var elment=document.getElementById(showid);
       var elmentid=document.getElementById(hid).value;
       if(document.getElementById("showDive")!=null){
        remove();
       }
       var div=window.document.createElement("div");
             div.innerHTML = "<font color='red'>"+elmentid+"</font>";
             div.setAttribute("id","showDive");
       div.className ="css2";
       div.style.height="100px";
             div.style.height = "30px";
             div.style.top=document.body.scrollLeft+event.clientY;
       div.style.left=document.body.scrollLeft+event.clientX;
             window.document.body.appendChild(div); 
      }

    posted @ 2007-09-12 22:23 flyleer 閱讀(433) | 評論 (0)編輯 收藏
    oracle中rownum的用法

           最近在做一個項目,因為考慮的主要是實現(xiàn)查詢,所以沒有用到Hibernate。直接用的jdbc,里面涉及到分頁,所以用到rownum了。
         比如,寫個最簡單的用法:select *from (select *from adjustrequsition a order by a.applydate desc) where rownum<6;這樣才是正確的想法,往往像我這樣的新手,喜歡這樣寫:select *from adjustrequsition a where rownum<6 order by a.applydate desc; 這樣是最容易范的錯誤。。因為rownum是先從數(shù)據(jù)庫中任意取的數(shù)據(jù),然后在按條件排序。。HOHO。。
         下面是我寫的我工作4個月來最長的sql代碼,畢竟我不是DBA哦。。呵呵
        

    select *
     from (select row_number() over(order by t.BEGIN_DATE) ranging,
                   decode(action_seq,
                         
    2,
                          t.person_name,
                         
    3,
                          (select name from account where id = s1.main_account_seq),
                          (select name from account where id = s1.main_account_seq)) as debit_name,
                   decode(action_seq,
                         
    7,
                          t.person_name,
                         
    4,
                          (select name from account where id = s1.main_account_seq),
                          (select name from account where id = s2.main_account_seq)) as credit_name,
                   (SELECT action_name FROM action_type WHERE t.action_seq = ID) AS action_name,
                   decode(action_seq,
                         
    2,
                          decode(bank_seq,
                                 null,
                                
    '郵局',
                                 (select bank_name
                                    from bank_info
                                   where id = t.bank_seq)),
                          (select bank_name from bank_info where id = t.bank_seq)) bankname,
                   decode(action_seq,
                         
    2,
                          t.card_no,
                          (select decode(a.email, null, a.mobile, a.email)
                             from account a, sub_account s
                            where a.id = s.main_account_seq
                              and s.id = t.debit_seq)) as debit_no,
                   decode(action_seq,
                         
    4,
                          t.card_no,
                         
    7,
                          t.card_no,
                          (select decode(a.email, null, a.mobile, a.email)
                             from account a, sub_account s
                            where a.id = s.main_account_seq
                              and s.id = t.credit_seq)) as credit_no,
                   t.amount,
                   to_char(t.BEGIN_DATE,
    'YYYY-MM-DD hh24:mi') as begin_date,
                   t.remark,
                   t.id,
                   t.voucher_code,
                   t.DEBIT_FEE,
                   t.CREDIT_FEE
              from transaction t, sub_account s1, sub_account s2
             where t.voucher_code is not null
            
               and exists
             (select s.id
                      from account a, sub_account s
                     where s.main_account_seq = a.id
                       and a.account_type =
    'B'
                       and (t.credit_seq = s.id or t.debit_seq = s.id))
               and t.DEBIT_SEQ = s1.ID
               and t.CREDIT_SEQ = s2.ID
               and t.action_seq =
    3)
     where ranging between
    1 and 100

    posted @ 2007-08-17 16:08 flyleer 閱讀(355) | 評論 (0)編輯 收藏
    僅列出標題
    共2頁: 上一頁 1 2 
    主站蜘蛛池模板: 亚洲色欲久久久综合网东京热| 亚洲国产理论片在线播放| 国产高清免费在线| 免费黄色大片网站| 女人被男人桶得好爽免费视频| 在线观看免费人成视频色9| 三年片在线观看免费观看高清电影 | 亚洲精品国产成人99久久| 亚洲AV永久纯肉无码精品动漫 | 无码国产精品一区二区免费I6| 久久精品无码一区二区三区免费| 和日本免费不卡在线v| 成年人在线免费观看| 国产在线ts人妖免费视频| 啊v在线免费观看| 亚洲深深色噜噜狠狠爱网站| 人人狠狠综合久久亚洲婷婷| 久久久亚洲裙底偷窥综合| 亚洲婷婷在线视频| 亚洲精品无码永久在线观看男男| 亚洲爆乳少妇无码激情| 一级毛片一级毛片免费毛片| 免费看一区二区三区四区| 18禁无遮挡无码国产免费网站| 99久久综合国产精品免费| 国产男女性潮高清免费网站| 亚洲国产高清精品线久久| 亚洲国产精品无码成人片久久| 亚洲成电影在线观看青青 | 久久亚洲国产午夜精品理论片| 亚洲视频在线免费观看| 亚洲香蕉久久一区二区| 国产精品亚洲一区二区三区久久 | 激情亚洲一区国产精品| 亚洲AV无码一区二区三区性色| 国产av无码专区亚洲av毛片搜| AAAAA级少妇高潮大片免费看| 日日麻批免费40分钟无码 | 日本免费久久久久久久网站| 99久久免费国产香蕉麻豆| 又粗又硬免费毛片|