數據加載中……

          3.14 面試遇到的問題

             1.JDBC有幾種驅動類型:  

               type   1:jdbc-odbc橋    
            type   2:本地api驅動    
            type   3:網絡協議驅動    
            type   4:本地協議驅動    

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

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

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

           Type   2:   本地Api驅動    
                本地api驅動直接把jdbc調用轉變為數據庫的標準調用再去訪問數據庫.這種方法需要本地數據庫驅動代碼.    
             
            本地api驅動----廠商DB代碼-----數據庫Server     

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

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

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

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

          posted @ 2007-11-28 16:15 flyleer| 編輯 收藏
          【轉】js日期時間函數

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

          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. //| 求兩個時間的天數差 日期格式為 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' )//如果是字符串轉換為日期型  
          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. //| 日期輸出字符串,重載了系統的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.     //數據庫中,合法日期可以是:YYYY-MM/DD(2003-3/21),數據庫會自動轉換為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. //| 把日期分割成數組  
          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. //| 取得日期數據信息  
          183. //| 參數 interval 表示數據類型  
          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. //| 取得當前日期所在月的最大天數  
          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. //| 字符串轉成日期類型   
          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| 編輯 收藏
          生成隨機數(轉貼)

          有時候在我們的網絡應用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當然,如果驗證碼很有規律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網站的驗證碼,因為比較有規律,所以被識別了,并且識別率達到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(轉貼)

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

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

          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的用法

                 最近在做一個項目,因為考慮的主要是實現查詢,所以沒有用到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是先從數據庫中任意取的數據,然后在按條件排序。。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 
          主站蜘蛛池模板: 黑龙江省| 平远县| 玛沁县| 年辖:市辖区| 灌云县| 惠东县| 阿拉尔市| 漳浦县| 十堰市| 肇庆市| 金山区| 嵊泗县| 桓仁| 宜川县| 莱州市| 扎兰屯市| 陕西省| 驻马店市| 陈巴尔虎旗| 巫山县| 建昌县| 娄底市| 离岛区| 玉山县| 二连浩特市| 南木林县| 吉安县| 台湾省| 德化县| 华宁县| 志丹县| 皋兰县| 财经| 保定市| 宜兴市| 闵行区| 湖州市| 多伦县| 江城| 左贡县| 江口县|