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

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

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

    posts - 39,  comments - 44,  trackbacks - 0
      2008年5月6日
    “補充說明”通常是在求職簡歷的結束部分,可以填寫,也可以空著。不過,如果能夠善于利用它,求職成功率將會大大提高。畢竟,作為求職簡歷的最后部分,它是表現自我的最后機會。

      在“補充說明”中填寫的最佳信息因人而異,這取決于求職者的職業目標和背景。請記住,求職簡歷是自我營銷的手段,其中的信息應當有助于向用人單位推銷自己,以實現自己的職業目標。可以這樣考慮問題:如果這是向潛在的用人單位推銷自己的最會機會,你會說些什么?

      以下是一些填寫“補充說明”的思路,供大家參考:

      能力或業績總結

      在補充說明對自己的能力和職業生涯進行總結。在能力或業績總結中要突出自己主要的“賣點”和成功案例——這一切都應當與你想要應聘的職位有關系。

      獲獎情況

      用列舉自己的獲獎情況作為求職簡歷的結束,會給用人單位留下深刻印象。

      證明書或推薦信

      你是否收到過對于你的工作情況表示滿意的推薦信或業績評估證明?如果有,可以摘選其中的精采部分作為“補充說明”。

      發表作品

      如果在報刊、雜志上發表過作品,可以考慮在“補充說明”里羅列出來。

      專利

      如果擁有專利(包括正在申請的),請在“補充說明”中列出。

      演講能力

      許多職位要有演講能力才能勝任。列舉自己參加過的演講、主題發言會給用人單位留下好印象。

      計算機運用技能

      在“補充說明”中列舉自己在計算機操作系統、網絡和硬件等方面的技能,多多益善。

      培訓情況

      在“補充說明”中列出自己參加過的專業培訓和繼續教育。

      再次強調工作地點

      在“補充說明”中再次強調工作地點不失為結束求職簡歷的好辦法。

      說明自己愿意出差

      如果愿意出差,可以在補充說明中加以說明,用人單位或許會因為這一點而看上你。

      應該省略的內容

      補充說明不要涉及婚姻狀況、年齡、有多少個孩子等情況,如果興趣愛好與工作無關,最好也不要提及。

     來源:中華英才網 
    posted @ 2008-11-21 20:01 礦礦 閱讀(277) | 評論 (1)編輯 收藏

    下表是元字符及其在正則表達式上下文中的行為的一個完整列表:

    字符 描述
    將下一個字符標記為一個特殊字符、或一個原義字符、或一個后向引用、或一個八進制轉義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個換行符。序列 '\' 匹配 "" 而 "\(" 則匹配 "("。
    ^
    匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。
    $
    匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
    *
    匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等價于{0,}。[/size]
    +
    匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。
    ?
    匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。
    {n}
    是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
    {n,}
    是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。
    {n,m}
    和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。劉, "o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數之間不能有空格。
    ?
    當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。
    .
    匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。
    (pattern)
    匹配pattern 并獲取這一匹配。所獲取的匹配可以從產生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 {CONTENT}… 屬性。要匹配圓括號字符,請使用 '\(' 或 '\)'。
    (?:pattern)
    匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用 "或" 字符 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。
    (?=pattern)
    正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。
    (?!pattern)
    負向預查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始
    x|y
    匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
    [xyz]
    字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
    [^xyz]
    負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
    [a-z]
    字符范圍。匹配指定范圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內的任意小寫字母字符。
    [^a-z]
    負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內的任意字符。
    \b
    匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
    \B
    匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
    \cx
    匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。 x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。
    \d
    匹配一個數字字符。等價于 [0-9]。
    \D
    匹配一個非數字字符。等價于 [^0-9]。
    \f
    匹配一個換頁符。等價于 \x0c 和 \cL。
    \n
    匹配一個換行符。等價于 \x0a 和 \cJ。
    \r
    匹配一個回車符。等價于 \x0d 和 \cM。
    \s
    匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。
    \S
    匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。
    \t
    匹配一個制表符。等價于 \x09 和 \cI。
    \v
    匹配一個垂直制表符。等價于 \x0b 和 \cK。
    \w
    匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'。
    \W
    匹配任何非單詞字符。等價于 '[^A-Za-z0-9_]'。
    \xn
    匹配 n,其中 n 為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如, '\x41' 匹配 "A"。'\x041' 則等價于 '\x04' & "1"。正則表達式中可以使用 ASCII 編碼。.
    \num
    匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)' 匹配兩個連續的相同字符。
    \n
    標識一個八進制轉義值或一個后向引用。如果 \n 之前至少 n 個獲取的子表達式,則 n 為后向引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。
    \nm
    標識一個八進制轉義值或一個后向引用。如果 \nm 之前至少有is preceded by at least nm 個獲取得子表達式,則 nm 為后向引用。如果 \nm 之前至少有 n 個獲取,則 n 為一個后跟文字 m 的后向引用。如果前面的條件都不滿足,若 n 和 m 均為八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。
    \nml
    如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則匹配八進制轉義值 nml。
    \un
    匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字符。例如,\u00A9 匹配版權符號 (?)。

    posted @ 2008-11-21 19:35 礦礦 閱讀(2247) | 評論 (0)編輯 收藏

    匹配中文字符的正則表達式: [u4e00-u9fa5]
    評注:匹配中文還真是個頭疼的事,有了這個表達式就好辦了

    匹配雙字節字符(包括漢字在內):[^x00-xff]
    評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

    匹配空白行的正則表達式:ns*r
    評注:可以用來刪除空白行

    匹配HTML標記的正則表達式:<(S*?)[^>]*>.*?|<.*? />
    評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力

    匹配首尾空白字符的正則表達式:^s*|s*$
    評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式

    匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    評注:表單驗證時很實用

    匹配網址URL的正則表達式:[a-zA-z]+://[^s]*
    評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

    匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    評注:表單驗證時很實用

    匹配國內電話號碼:d{3}-d{8}|d{4}-d{7}
    評注:匹配形式如 0511-4405222 或 021-87888822

    匹配騰訊QQ號:[1-9][0-9]{4,}
    評注:騰訊QQ號從10000開始

    匹配中國郵政編碼:[1-9]d{5}(?!d)
    評注:中國郵政編碼為6位數字

    匹配身份證:d{15}|d{18}
    評注:中國的身份證為15位或18位

    匹配ip地址:d+.d+.d+.d+
    評注:提取ip地址時有用


    匹配特定數字:
    ^[1-9]d*$    //匹配正整數
    ^-[1-9]d*$   //匹配負整數
    ^-?[1-9]d*$   //匹配整數
    ^[1-9]d*|0$  //匹配非負整數(正整數 + 0)
    ^-[1-9]d*|0$   //匹配非正整數(負整數 + 0)
    ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮點數
    ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配負浮點數
    ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮點數
    ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非負浮點數(正浮點數 + 0)
    ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮點數(負浮點數 + 0)
    評注:處理大量數據時有用,具體應用時注意修正

    匹配特定字符串:
    ^[A-Za-z]+$  //匹配由26個英文字母組成的字符串
    ^[A-Z]+$  //匹配由26個英文字母的大寫組成的字符串
    ^[a-z]+$  //匹配由26個英文字母的小寫組成的字符串
    ^[A-Za-z0-9]+$  //匹配由數字和26個英文字母組成的字符串
    ^w+$  //匹配由數字、26個英文字母或者下劃線組成的字符串


    在使用RegularExpressionValidator驗證控件時的驗證功能及其驗證表達式介紹如下:


    只能輸入數字:“^[0-9]*$”
    只能輸入n位的數字:“^d{n}$”
    只能輸入至少n位數字:“^d{n,}$”
    只能輸入m-n位的數字:“^d{m,n}$”
    只能輸入零和非零開頭的數字:“^(0|[1-9][0-9]*)$”
    只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2})?$”
    只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3})?$”
    只能輸入非零的正整數:“^+?[1-9][0-9]*$”
    只能輸入非零的負整數:“^-[1-9][0-9]*$”
    只能輸入長度為3的字符:“^.{3}$”
    只能輸入由26個英文字母組成的字符串:“^[A-Za-z]+$”
    只能輸入由26個大寫英文字母組成的字符串:“^[A-Z]+$”
    只能輸入由26個小寫英文字母組成的字符串:“^[a-z]+$”
    只能輸入由數字和26個英文字母組成的字符串:“^[A-Za-z0-9]+$”
    只能輸入由數字、26個英文字母或者下劃線組成的字符串:“^w+$”
    驗證用戶密碼:“^[a-zA-Z]w{5,17}$”正確格式為:以字母開頭,長度在6-18之間,


    只能包含字符、數字和下劃線。
    驗證是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+”
    只能輸入漢字:“^[u4e00-u9fa5],{0,}$”
    驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
    驗證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
    驗證電話號碼:“^((d{3,4})|d{3,4}-)?d{7,8}$”


    正確格式為:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,


    “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
    驗證身份證號(15位或18位數字):“^d{15}|d{}18$”
    驗證一年的12個月:“^(0?[1-9]|1[0-2])$”正確格式為:“01”-“09”和“1”“12”
    驗證一個月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”


    正確格式為:“01”“09”和“1”“31”。


    匹配中文字符的正則表達式: [u4e00-u9fa5]
    匹配雙字節字符(包括漢字在內):[^x00-xff]
    匹配空行的正則表達式:n[s| ]*r
    匹配HTML標記的正則表達式:/<(.*)>.*</1>|<(.*) />/
    匹配首尾空格的正則表達式:(^s*)|(s*$)
    匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

    (1)應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
    String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}

    (2)應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現
    String.prototype.trim = function()
    {
    return this.replace(/(^s*)|(s*$)/g, "");
    }
    (3)應用:利用正則表達式分解和轉換IP地址
    function IP2V(ip) //IP地址轉換成對應數值
    {
    re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達式
    if(re.test(ip))
    {
    return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
    }
    else
    {
    throw new Error("Not a valid IP address!")
    }
    }
    (4)應用:從URL地址中提取文件名的javascript程序
    s="http://www.9499.net/page1.htm";
    s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
    (5)應用:利用正則表達式限制網頁表單里的文本框輸入內容
    用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
    用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
    用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
    用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''

    posted @ 2008-11-21 10:58 礦礦 閱讀(2004) | 評論 (2)編輯 收藏
    [轉]自天極網

    1使用不帶參數的存儲過程

      使用 JDBC 驅動程序調用不帶參數的存儲過程時,必須使用 call SQL 轉義序列。不帶參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name}

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:

      

    以下是引用片段:
    CREATE PROCEDURE GetContactFormalNames
      AS
      BEGIN
       SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
       FROM Person.Contact
      END
    此存儲過程返回單個結果集,其中包含一列數據(由 Person.Contact 表中前十個聯系人的稱呼、名稱和姓氏組成)。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 executeQuery 方法調用 GetContactFormalNames 存儲過程。

     

    以下是引用片段:
      public static void executeSprocNoParams(Connection con) ...{
       try ...{
       Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");
      
       while (rs.next()) ...{
     System.out.println(rs.getString("FormalName"));
      }
      rs.close();
      stmt.close();
      }
      catch (Exception e) ...{
      e.printStackTrace();
      }
      }

      2使用帶有輸入參數的存儲過程

      使用 JDBC 驅動程序調用帶參數的存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 IN 參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name[([parameter][,[parameter]]...)]}

      構造 call 轉義序列時,請使用 ?(問號)字符來指定 IN 參數。此字符充當要傳遞給該存儲過程的參數值的占位符。可以使用 SQLServerPreparedStatement 類的 setter 方法之一為參數指定值。可使用的 setter 方法由 IN 參數的數據類型決定。

      向 setter 方法傳遞值時,不僅需要指定要在參數中使用的實際值,還必須指定參數在存儲過程中的序數位置。例如,如果存儲過程包含單個 IN 參數,則其序數值為 1。如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。

      作為如何調用包含 IN 參數的存儲過程的實例,使用 SQL Server 2005 AdventureWorks 示例數據庫中的 uspGetEmployeeManagers 存儲過程。此存儲過程接受名為 EmployeeID 的單個輸入參數(它是一個整數值),然后基于指定的 EmployeeID 返回雇員及其經理的遞歸列表。下面是調用此存儲過程的 Java 代碼:

      

     

    以下是引用片段:
      public static void executeSprocInParams(Connection con) ...{
       try ...{
       PreparedStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
       pstmt.setInt(1, 50);
       ResultSet rs = pstmt.executeQuery();
       while (rs.next()) ...{
       System.out.println("EMPLOYEE:");
       System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
       System.out.println("MANAGER:");
       System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
       System.out.println();
       }
       rs.close();
       pstmt.close();
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }

      3使用帶有輸出參數的存儲過程

      使用 JDBC 驅動程序調用此類存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 OUT 參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name[([parameter][,[parameter]]...)]}

      構造 call 轉義序列時,請使用 ?(問號)字符來指定 OUT 參數。此字符充當要從該存儲過程返回的參數值的占位符。要為 OUT 參數指定值,必須在運行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各參數的數據類型。

      使用 registerOutParameter 方法為 OUT 參數指定的值必須是 java.sql.Types 所包含的 JDBC 數據類型之一,而它又被映射成本地 SQL Server 數據類型之一。有關 JDBC 和 SQL Server 數據類型的詳細信息,請參閱了解 JDBC 驅動程序數據類型。

      當您對于 OUT 參數向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用于此參數的數據類型,而且必須在存儲過程中指定此參數的序號位置或此參數的名稱。例如,如果存儲過程包含單個 OUT 參數,則其序數值為 1;如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程: 根據指定的整數 IN 參數 (employeeID),該存儲過程也返回單個整數 OUT 參數 (managerID)。根據 HumanResources.Employee 表中包含的 EmployeeID,OUT 參數中返回的值為 ManagerID。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 execute 方法調用 GetImmediateManager 存儲過程:

     

    以下是引用片段:
      public static void executeStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
       cstmt.setInt(1, 5);
       cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
       cstmt.execute();
       System.out.println("MANAGER ID: " + cstmt.getInt(2));
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      } 

    本示例使用序號位置來標識參數。或者,也可以使用參數的名稱(而非其序號位置)來標識此參數。下面的代碼示例修改了上一個示例,以說明如何在 Java 應用程序中使用命名參數。請注意,這些參數名稱對應于存儲過程的定義中的參數名稱: CREATE PROCEDURE GetImmediateManager

     
    以下是引用片段:
     @employeeID INT,
       @managerID INT OUTPUT
      AS
      BEGIN
       SELECT @managerID = ManagerID
       FROM HumanResources.Employee
       WHERE EmployeeID = @employeeID
      END
      存儲過程可能返回更新計數和多個結果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規范,此規范規定在檢索 OUT 參數之前應檢索多個結果集和更新計數。也就是說,應用程序應先檢索所有 ResultSet 對象和更新計數,然后使用 CallableStatement.getter 方法檢索 OUT 參數。否則,當檢索 OUT 參數時,尚未檢索的 ResultSet 對象和更新計數將丟失。

      4 使用帶有返回狀態的存儲過程

      使用 JDBC 驅動程序調用這種存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。返回狀態參數的 call 轉義序列的語法如下所示:

     

    以下是引用片段:
     {[?=]call procedure-name[([parameter][,[parameter]]...)]}
      構造 call 轉義序列時,請使用 ?(問號)字符來指定返回狀態參數。此字符充當要從該存儲過程返回的參數值的占位符。要為返回狀態參數指定值,必須在執行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定參數的數據類型。

      此外,向 registerOutParameter 方法傳遞返回狀態參數值時,不僅需要指定要使用的參數的數據類型,還必須指定參數在存儲過程中的序數位置。對于返回狀態參數,其序數位置始終為 1,這是因為它始終是調用存儲過程時的第一個參數。盡管 SQLServerCallableStatement 類支持使用參數的名稱來指示特定參數,但您只能對返回狀態參數使用參數的序號位置編號。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:

      

    以下是引用片段:
    CREATE PROCEDURE CheckContactCity
       (@cityName CHAR(50))
      AS
      BEGIN
       IF ((SELECT COUNT(*)
       FROM Person.Address
       WHERE City = @cityName) > 1)
       RETURN 1
      ELSE
       RETURN 0
      END
      該存儲過程返回狀態值 1 或 0,這取決于是否能在表 Person.Address 中找到 cityName 參數指定的城市。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 execute 方法調用 CheckContactCity 存儲過程:

     

    以下是引用片段:
     public static void executeStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
       cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
       cstmt.setString(2, "Atlanta");
       cstmt.execute();
       System.out.println("RETURN STATUS: " + cstmt.getInt(1));
       }
       cstmt.close();
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }
      5 使用帶有更新計數的存儲過程

      使用 SQLServerCallableStatement 類構建對存儲過程的調用之后,可以使用 execute 或 executeUpdate 方法中的任意一個來調用此存儲過程。executeUpdate 方法將返回一個 int 值,該值包含受此存儲過程影響的行數,但 execute 方法不返回此值。如果使用 execute 方法,并且希望獲得受影響的行數計數,則可以在運行存儲過程后調用 getUpdateCount 方法。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下表和存儲過程:

      

    以下是引用片段:
    CREATE TABLE TestTable
       (Col1 int IDENTITY,
       Col2 varchar(50),
       Col3 int);
      
      CREATE PROCEDURE UpdateTestTable
       @Col2 varchar(50),
       @Col3 int
      AS
      BEGIN
       UPDATE TestTable
       SET Col2 = @Col2, Col3 = @Col3
      END;
    在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,并使用 execute 方法調用 UpdateTestTable 存儲過程,然后使用 getUpdateCount 方法返回受存儲過程影響的行計數。
    以下是引用片段:
    public static void executeUpdateStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
       cstmt.setString(1, "A");
       cstmt.setInt(2, 100);
       cstmt.execute();
       int count = cstmt.getUpdateCount();
       cstmt.close();
      
       System.out.println("ROWS AFFECTED: " + count);
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }
    posted @ 2008-11-07 22:21 礦礦 閱讀(258) | 評論 (0)編輯 收藏
    [轉]自天極網

    1使用不帶參數的存儲過程

      使用 JDBC 驅動程序調用不帶參數的存儲過程時,必須使用 call SQL 轉義序列。不帶參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name}

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:

      

    以下是引用片段:
    CREATE PROCEDURE GetContactFormalNames
      AS
      BEGIN
       SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
       FROM Person.Contact
      END
    此存儲過程返回單個結果集,其中包含一列數據(由 Person.Contact 表中前十個聯系人的稱呼、名稱和姓氏組成)。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 executeQuery 方法調用 GetContactFormalNames 存儲過程。

     

    以下是引用片段:
      public static void executeSprocNoParams(Connection con) ...{
       try ...{
       Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");
      
       while (rs.next()) ...{
     System.out.println(rs.getString("FormalName"));
      }
      rs.close();
      stmt.close();
      }
      catch (Exception e) ...{
      e.printStackTrace();
      }
      }

      2使用帶有輸入參數的存儲過程

      使用 JDBC 驅動程序調用帶參數的存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 IN 參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name[([parameter][,[parameter]]...)]}

      構造 call 轉義序列時,請使用 ?(問號)字符來指定 IN 參數。此字符充當要傳遞給該存儲過程的參數值的占位符。可以使用 SQLServerPreparedStatement 類的 setter 方法之一為參數指定值。可使用的 setter 方法由 IN 參數的數據類型決定。

      向 setter 方法傳遞值時,不僅需要指定要在參數中使用的實際值,還必須指定參數在存儲過程中的序數位置。例如,如果存儲過程包含單個 IN 參數,則其序數值為 1。如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。

      作為如何調用包含 IN 參數的存儲過程的實例,使用 SQL Server 2005 AdventureWorks 示例數據庫中的 uspGetEmployeeManagers 存儲過程。此存儲過程接受名為 EmployeeID 的單個輸入參數(它是一個整數值),然后基于指定的 EmployeeID 返回雇員及其經理的遞歸列表。下面是調用此存儲過程的 Java 代碼:

      

     

    以下是引用片段:
      public static void executeSprocInParams(Connection con) ...{
       try ...{
       PreparedStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
       pstmt.setInt(1, 50);
       ResultSet rs = pstmt.executeQuery();
       while (rs.next()) ...{
       System.out.println("EMPLOYEE:");
       System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
       System.out.println("MANAGER:");
       System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
       System.out.println();
       }
       rs.close();
       pstmt.close();
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }

      3使用帶有輸出參數的存儲過程

      使用 JDBC 驅動程序調用此類存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 OUT 參數的 call 轉義序列的語法如下所示:

      

    以下是引用片段:
    {call procedure-name[([parameter][,[parameter]]...)]}

      構造 call 轉義序列時,請使用 ?(問號)字符來指定 OUT 參數。此字符充當要從該存儲過程返回的參數值的占位符。要為 OUT 參數指定值,必須在運行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各參數的數據類型。

      使用 registerOutParameter 方法為 OUT 參數指定的值必須是 java.sql.Types 所包含的 JDBC 數據類型之一,而它又被映射成本地 SQL Server 數據類型之一。有關 JDBC 和 SQL Server 數據類型的詳細信息,請參閱了解 JDBC 驅動程序數據類型。

      當您對于 OUT 參數向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用于此參數的數據類型,而且必須在存儲過程中指定此參數的序號位置或此參數的名稱。例如,如果存儲過程包含單個 OUT 參數,則其序數值為 1;如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程: 根據指定的整數 IN 參數 (employeeID),該存儲過程也返回單個整數 OUT 參數 (managerID)。根據 HumanResources.Employee 表中包含的 EmployeeID,OUT 參數中返回的值為 ManagerID。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 execute 方法調用 GetImmediateManager 存儲過程:

     

    以下是引用片段:
      public static void executeStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
       cstmt.setInt(1, 5);
       cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
       cstmt.execute();
       System.out.println("MANAGER ID: " + cstmt.getInt(2));
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      } 

    本示例使用序號位置來標識參數。或者,也可以使用參數的名稱(而非其序號位置)來標識此參數。下面的代碼示例修改了上一個示例,以說明如何在 Java 應用程序中使用命名參數。請注意,這些參數名稱對應于存儲過程的定義中的參數名稱: CREATE PROCEDURE GetImmediateManager

     
    以下是引用片段:
     @employeeID INT,
       @managerID INT OUTPUT
      AS
      BEGIN
       SELECT @managerID = ManagerID
       FROM HumanResources.Employee
       WHERE EmployeeID = @employeeID
      END
      存儲過程可能返回更新計數和多個結果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規范,此規范規定在檢索 OUT 參數之前應檢索多個結果集和更新計數。也就是說,應用程序應先檢索所有 ResultSet 對象和更新計數,然后使用 CallableStatement.getter 方法檢索 OUT 參數。否則,當檢索 OUT 參數時,尚未檢索的 ResultSet 對象和更新計數將丟失。

      4 使用帶有返回狀態的存儲過程

      使用 JDBC 驅動程序調用這種存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。返回狀態參數的 call 轉義序列的語法如下所示:

     

    以下是引用片段:
     {[?=]call procedure-name[([parameter][,[parameter]]...)]}
      構造 call 轉義序列時,請使用 ?(問號)字符來指定返回狀態參數。此字符充當要從該存儲過程返回的參數值的占位符。要為返回狀態參數指定值,必須在執行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定參數的數據類型。

      此外,向 registerOutParameter 方法傳遞返回狀態參數值時,不僅需要指定要使用的參數的數據類型,還必須指定參數在存儲過程中的序數位置。對于返回狀態參數,其序數位置始終為 1,這是因為它始終是調用存儲過程時的第一個參數。盡管 SQLServerCallableStatement 類支持使用參數的名稱來指示特定參數,但您只能對返回狀態參數使用參數的序號位置編號。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:

      

    以下是引用片段:
    CREATE PROCEDURE CheckContactCity
       (@cityName CHAR(50))
      AS
      BEGIN
       IF ((SELECT COUNT(*)
       FROM Person.Address
       WHERE City = @cityName) > 1)
       RETURN 1
      ELSE
       RETURN 0
      END
      該存儲過程返回狀態值 1 或 0,這取決于是否能在表 Person.Address 中找到 cityName 參數指定的城市。

      在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然后使用 execute 方法調用 CheckContactCity 存儲過程:

     

    以下是引用片段:
     public static void executeStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
       cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
       cstmt.setString(2, "Atlanta");
       cstmt.execute();
       System.out.println("RETURN STATUS: " + cstmt.getInt(1));
       }
       cstmt.close();
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }
      5 使用帶有更新計數的存儲過程

      使用 SQLServerCallableStatement 類構建對存儲過程的調用之后,可以使用 execute 或 executeUpdate 方法中的任意一個來調用此存儲過程。executeUpdate 方法將返回一個 int 值,該值包含受此存儲過程影響的行數,但 execute 方法不返回此值。如果使用 execute 方法,并且希望獲得受影響的行數計數,則可以在運行存儲過程后調用 getUpdateCount 方法。

      作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下表和存儲過程:

      

    以下是引用片段:
    CREATE TABLE TestTable
       (Col1 int IDENTITY,
       Col2 varchar(50),
       Col3 int);
      
      CREATE PROCEDURE UpdateTestTable
       @Col2 varchar(50),
       @Col3 int
      AS
      BEGIN
       UPDATE TestTable
       SET Col2 = @Col2, Col3 = @Col3
      END;
    在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,并使用 execute 方法調用 UpdateTestTable 存儲過程,然后使用 getUpdateCount 方法返回受存儲過程影響的行計數。
    以下是引用片段:
    public static void executeUpdateStoredProcedure(Connection con) ...{
       try ...{
       CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
       cstmt.setString(1, "A");
       cstmt.setInt(2, 100);
       cstmt.execute();
       int count = cstmt.getUpdateCount();
       cstmt.close();
      
       System.out.println("ROWS AFFECTED: " + count);
       }
       catch (Exception e) ...{
       e.printStackTrace();
       }
      }
    posted @ 2008-11-07 22:16 礦礦 閱讀(200) | 評論 (0)編輯 收藏

    --創建數據庫
    use master
    go
    if exists(select * from sysdatabases where name = 'BankDB')
    drop database BankDB
    go
    exec xp_cmdshell 'md E:\朱礦龍',NO_OUTPUT
    create database BankDB
    go
    use BankDB
    --創建帳戶信息表AccountInfo
    if exists(select * from sysobjects where name = 'AccountInfo')
    drop table AccountInfo
    go
    create table AccountInfo
    (
    CustID int identity(1,1) primary key,
    CustName varchar(20) not null,
    IDCard varchar(18) check(len(IDCard) = 15 or len(IDCard) = 18),
    TelePhone varchar(13) check(len(TelePhone)=11 or len(TelePhone) like'[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' or len(TelePhone) like'[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') ,
    Address varchar(50) default '地址不詳'
    )
    go
    --創建信用卡信息表CardInfo
    if exists(select * from sysobjects where name = 'CardInfo')
    drop table CardInfo
    go
    create table CardInfo
    (
    CardID varchar(19) check(len(CardID)=19) primary key,
    CardPassWord varchar(6) default'888888',
    CustID int references AccountInfo(CustID),
    SaveType varchar(10) not null check(SaveType in('活期','定期')),
    OpenDate datetime not null default(getdate()),
    OpenMoney money not null check(OpenMoney >= 1),
    LeftMoney money not null check(LeftMoney >= 1),
    IsLoss varchar(2) not null check(IsLoss in('是','否')) default '否'
    )
    go
    --創建交易信息表TransInfo
    if exists(select * from sysobjects where name = 'TransInfo')
    drop table TransInfo
    go
    create table TransInfo
    (
    CardID varchar(19) not null,
    TransType varchar(4) not null check(TransType in('存入','支取')),
    TransMoney money not null check(TransMoney > 0),
    TransDate datetime default(getdate())
    )
    go


    -------------------------------插入測試數據-------------------------------------
    ---為AccountInfo表插入測試數據
    insert into AccountInfo values('孫悟空','422322123902140019','027-8888988','花果山')
    insert into AccountInfo values('唐僧','422322001902140019','027-8536896','大唐')
    insert into AccountInfo values('沙和尚','410334020157144719','13295654665','通天河')
    ---為CardInfo表插入測試數據
    insert into CardInfo values('1027 3726 1536 1135',default,1,'定期',default,500.00,500.00,default)
    insert into CardInfo values('1029 3526 1235 1235',default,2,'活期',default,1500.00,1500.00,default)
    insert into CardInfo values('1324 7532 1536 1935',default,3,'活期',default,4500.00,4500.00,default)


    ---表的查看
    select * from AccountInfo

    select * from CardInfo

    select * from TransInfo

    -----------------T-SQL----------------------------
    --孫悟空修改密碼
    update CardInfo set CardPassWord = 611234 where CustID = 1

    --孫悟空取錢
    --事務開始
    begin transaction tran_Qu
    --定義一個用于記錄錯誤的變量
    declare @tran_error int
    set @tran_error = 0;
    --將孫悟空交易進行記錄
    insert into TransInfo values('1027 3726 1536 1135','支取',200.00,getdate())
    set @tran_error = @tran_error + @@error
    --從孫悟空的帳戶中減去200.00
    update CardInfo set LeftMoney = LeftMoney - 200
    where CardID = '1027 3726 1536 1135'
    set @tran_error = @tran_error + @@error
    if @tran_error <> 0
       begin
          --執行錯誤,回滾事務
          rollback transaction
          print '支取失敗,交易已取消'
       end
    else
      begin
        --沒有發現錯誤,提交事務
        commit transaction
        print'交易成功,已保存新數據'
      end
    go
    select * from CardInfo where CustID = 1

    --沙和尚存錢
    begin transaction tran_bring
    declare @tran_error int
    set @tran_error = 0;
    insert into TransInfo values('1324 7532 1536 1935','存入',1200.00,getdate())
    set @tran_error = @tran_error + @@error
    update CardInfo set LeftMoney = LeftMoney + 1200
    where CardID = '1324 7532 1536 1935'
    set @tran_error = @tran_error + @@error
    if @tran_error <> 0
       begin
          rollback transaction
          print '存入失敗,交易已取消'
       end
    else
      begin
        commit transaction
        print'交易成功,已保存新數據'
      end
    go
    select * from CardInfo where CustID = 3

    --唐僧卡丟失
    update CardInfo set IsLoss='是' where CustID = 2

    --查詢最近10開戶的銀行卡信息
    select * from CardInfo where datediff(dd,OpenDate,getdate()) <= 10

    --查詢最大交易的卡信息
    declare @maxMoney money
    select @maxMoney = max(TransMoney) from TransInfo
    select * from CardInfo where CardID in(select CardID from TransInfo where TransMoney = @maxMoney)

    --查詢交易信息表中總的交易
    declare @allMoney money
    declare @QuMoney money
    declare @CunMoney money
    select @allMoney = sum(TransMoney) from TransInfo
    select @QuMoney = sum(TransMoney) from TransInfo where TransType = '支取'
    select @CunMoney = sum(TransMoney) from TransInfo where TransType = '存入'
    print '總交易金額:' + convert(varchar(10),@allMoney)
    print '支取交易金額:' + convert(varchar(10),@QuMoney)
    print '存入交易金額:' + convert(varchar(10),@CunMoney)

    --給交易信息表加上非聚集索引,并利用非聚集索引查詢數據
    if exists(select * from sysobjects where name = 'IX_CardID')
    drop index BankDB.IX_CardID
    go
    create nonclustered index IX_CardID
    on TransInfo(CardID)
    with fillfactor = 30
    go
    select * from TransInfo with(index = IX_CardID) where CardID = '1324 7532 1536 1935'

    --查詢掛失的賬戶信息
    select * from AccountInfo where CustID in(select CustID from CardInfo where IsLoss = '是')


    --賬戶信息視圖
    if exists(select * from sysobjects where name = 'view_AccountCardInfo')
    drop view view_AccountCardInfo
    go
    create view view_AccountCardInfo
    as
    select AccountInfo.CustID '帳戶編號',CustName '帳戶姓名',IDCard'身份證號碼',TelePhone'客戶電話',Address'客戶地址',
            CardID'信用卡編號',SaveType'儲蓄類型',OpenDate'開戶日期',OpenMoney'開戶金額',IsLoss'是否掛失'
    from AccountInfo join CardInfo
    on AccountInfo.CustID = CardInfo.CustID
    go
    select * from view_AccountCardInfo

    --交易信息視圖
    if exists(select * from sysobjects where name = 'view_TransInfo')
    drop view view_TransInfo
    go
    create view view_TransInfo
    as
    select CardID '卡號',TransType '交易類型',TransMoney '交易金額',TransDate '交易時間'
    from TransInfo
    go
    go
    select * from view_TransInfo

    ---------------第三階段----------------
    --------T-SQL-------------
    if exists(select name from sysobjects where name = 'Tri_TransInfo_Insert')
    drop trigger Tri_TransInfo_Insert
    go
    create trigger Tri_TransInfo_Insert on TransInfo for insert
    as
     declare @TempTransType varchar(10)     --定義臨時的變量存放交易類型
     declare @TempTransMoney money          --定義臨時的變量存放交易金額
     declare @TempCardID varchar(19)        --定義臨時的變量存放卡號
     declare @TempLeftMoney money           --定義臨時的變量存放客戶的余額
     
    --從inserted臨時表中取出數據賦值
    select @TempTransType = TransType,@TempTransMoney = TransMoney,@TempCardID = CardID
    from inserted
    select @TempLeftMoney = LeftMoney from CardInfo where CardID = @TempCardID

    if(@TempTransType = '支取')      
      begin
        if(@TempLeftMoney - @TempTransMoney >=1)  
           begin
              update CardInfo set LeftMoney = @TempLeftMoney - @TempTransMoney where CardID = @TempCardID
              print '交易成功!'
           end
         else
           begin
              rollback transaction
              print '余額不足,交易失敗!'
           end
      end
    else
      begin
        update CardInfo set LeftMoney = @TempLeftMoney + @TempTransMoney where CardID = @TempCardID
        print '交易成功!'
      end
    select @TempLeftMoney = LeftMoney from CardInfo where CardID = @TempCardID  
    print '卡號:' + convert(varchar(19),@TempCardID) + '  余額:' + convert(varchar(10),@TempLeftMoney)
    go
    set nocount on   --不顯示語句影響記錄行數
    --測試觸發器,沙和尚支取
    insert into TransInfo(CardID,TransType,TransMoney) values('9645 9087 9371 4492','支取',500)
    go

    select * from TransInfo
    select * from accountinfo
    select * from CardInfo

    --利用存儲過程實現備份交易信息的業務
    if exists(select *from sysobjects where name = 'Proc_Backup_TransInfo')
        drop procedure Proc_Backup_TransInfo
    go
    create procedure Proc_Backup_TransInfo
    @BackupDate datetime
    as
    declare @MyError int
    set @MyError = 0
    print '開始備份......'
    if exists(select * from sysobjects where name ='Back_TransInfo')
    begin
     begin tran 
     insert into Back_TransInfo select * from TransInfo where datediff(dd,TransDate,getdate()) >=0
    set @MyError = @MyError + @@error
    if @MyError != 0
       begin
           rollback transaction
          print '備份失敗'
       end
    else
      begin
          commit transaction
           print'備份成功'
       end
      end
    else
      begin
        begin tran 
        select * into Back_TransInfo from TransInfo where datediff(dd,TransDate,getdate()) >=0
        set @MyError = @MyError + @@error
    if @MyError != 0
       begin
          rollback transaction
          print '備份失敗!'
       end
    else
       begin
          commit transaction
          print '備份成功!'
       end
    end
    go
    insert into TransInfo values('1324 7532 1536 1935','支取',500.00,getdate()) 
    insert into TransInfo values('1324 7532 1536 1935','支取',500.00,getdate())
    insert into TransInfo values('1324 7532 1536 1935','支取',500.00,getdate())
    declare @BackDate datetime
    set @BackDate = getDate()
    exec Proc_Backup_TransInfo '2008-10-31'
    go
    select * from Back_TransInfo

    --實現銀行卡的存儲過程
    if exists(select * from sysobjects where name = 'Proc_GetCardID')
        drop procedure Proc_GetCardID
    go
    create procedure Proc_GetCardID
    @CardID varchar(19) output
    as
    declare @TempRand numeric(18,16)
    declare @TempStr varchar(18)
    set @TempRand = rand(datepart(ms,getdate())*10000)
    set @TempStr = convert(varchar(18),@TempRand)
    set @CardID = substring(@TempStr,3,4)+' '+substring(@TempStr,7,4)+' '+substring(@TempStr,11,4)+' '+substring(@TempStr,15,4)
    go
    declare @MyCardID varchar(19)
    exec Proc_GetCardID @MyCardID output
    print '產生的隨即卡號是:' + @MyCardID
    go

    --實現開戶的存儲過程
    if exists(select * from sysobjects where name = 'Proc_OpenAcount')
        drop procedure Proc_OpenAcount
    go
    create procedure Proc_OpenAcount
    @CustName varchar(20),
    @IDCard varchar(18),
    @Telephone varchar(13),
    @OpenMoney money = 1,
    @SaveType varchar(10) = '活期',
    @Address varchar(50)= '地址不詳'
    as
     declare @MyCardID varchar(19)
     declare @MyCustID int
     exec Proc_GetCardID @MyCardID output
    while(1=1)
     begin
     if exists(select * from CardInfo where CardID = @MyCardID)
     exec Proc_GetCardID @MyCardID output
    else
     break
     end
    insert into AccountInfo values(@CustName,@IDCard,@TelePhone,@Address)  
    select @MyCustID = CustID from AccountInfo where IDCard = @IDCard      
    insert into CardInfo values(@MyCardID,default,@MyCustID,@SaveType,default,@OpenMoney,@OpenMoney,default)
    print '尊敬的客戶:' +@CustName +'開戶成功,卡號為:'+@MyCardId

    print '產生的隨機卡號為:' + @MyCardID
    exec Proc_OpenAcount '白骨精','245687556977812345','12478964568'
    exec Proc_OpenAcount '嫦娥公主','745687476912812335','14796653141',@Address = '月亮'

    ----銷戶
    if exists(select * from sysobjects where name = 'Proc_DropAcount')
        drop procedure Proc_DropAcount
    go
    create procedure Proc_DropAcount
     --@CardID varchar(19)
    @IDCard varchar(18) --身份證號
    as
    declare @TempCustID int
    declare @TempLeftMoney money
    --select @TempCustID = CustID from CardInfo where CardID = @CardID 
    --select @TempLeftMoney = LeftMoney from CardInfo where CardID = @CardID
    print '該帳戶余額:' +convert(varchar(10),@TempLeftMoney)+'正在取出。。。'
    delete from CardInfo where custid in(select custid from accountinfo where IDCard=@IDCard)
    delete from  AccountInfo where IDCard=@IDCard
    go
    declare @CardID varchar(19)
    select @CardID = CardID from CardInfo where CustID in(select CustID from AccountInfo where CustName = '唐僧')
    exec Proc_DropAcount '422322001902140019'--根據身份證號刪除
    go
    ---表的查看
    select * from AccountInfo
    select * from CardInfo

    posted @ 2008-10-31 19:31 礦礦 閱讀(503) | 評論 (0)編輯 收藏

    類和對象:
     類:主觀抽象,是對象的模板,可以實例化對象
      習慣上類的定義格式:
       package xxx;  
       import xxx;  
       public class Xxxx{
        屬性 ······;
        
        構造器 ······;
        
        方法 ······;
       }

      定義屬性:實例變量
       格式:[ 修飾符 ]  類型 變量名  [ = ? ]
       實例變量定義在類中但在任何方法之外。
       實例變量有默認值:各種各樣的0。(同數組)
       實例變量的作用域至少在本類內部,受訪問控制符的限制。
       在重合作用域,實例變量和局部變量允許有命名沖突,“局部優先”。
       
      定義方法:
       格式: [ 修飾符 ]  返回類型 方法名( 參數列表 ) [ throws  異常 ] { ······ }
       java中所有參數都是值傳遞。
          當沒有值返回時,返回類型必須被定義為void。
       返回類型必須與方法名相鄰,其他修飾符可以調換位置。
       
      構造器:
       在創建對象的過程中調用的方法。
       構造器沒有返回類型。
       構造器的名字與類名相同。
       格式為:[ 修飾符 ]  類名( 參數列表 ){  },修飾符可以是private、 protected、 default、private
       在一個對象的生成周期中構造器只用一次,由系統自動調用,不允許手工調用。
       程序員沒有提供一個構造器,系統會自動提供一個無參的構造器。
       獲得對象的方式:
        通過new(在堆空間中申請分配空間),new 類名(),可以通過這種形式或的一個對象,這時的對象是無法使用,必須把他的地址存放進一個對象變量才能夠使用。
        例如 :
         Car c=new Car();
       注意:
        最好在寫類時提供一個無參的構造器。
          
      this關鍵字:
       this是個隱式參數,代表當前對象;
        publie class Student{
         private String name;
         public void setName(String name){
          this.name=name;  //this.name為當前對象的成員變量
         }
        }
        
       如果某個構造方法的第一個語句具有形式this( ··· ),那么這個構造方法將調用同一類中的其他構造方法。
       
              注意:
               在構造器中this(...)必須放在該構造器的第一行。
        this不能出現在靜態方法里面  
     
     類、對象、實例三者的關系:
      類:是對象的模板,可以實例化對象
      對象:類的個體
      實例:實現的對象
      student s; 
      s=new student();
       其中 Student為類,s為對象,new Student()為實例,s賦值后也是實例了。

    方法重載:
     方法名相同,參數表不同,不考慮返回值類型(但最好還是使返回類型一致)。
     編譯器根據參數,選擇一個方法,如果沒有完全匹配的,對于參數表采用“向上就近匹配原則”,但不允許模棱兩可。
     方法重載屏蔽了一個對象的同一類方法由于參數不同所造成的差異。
       
    封裝:
     類的屬性加private修飾符,來限制只能夠在類的內部進行訪問,有效的保護數據。
     對于類中的私有屬性,要對其給出一對方法getXxx(),setXxx()訪問私有屬性,保證對私有屬性的操作的安全性。
     方法公開的是方法的聲明,即只須知道參數和返回值就可以調用該方法,隱藏方法的實現的細節。
     一個對象和外界的聯系應當通過一個統一的接口,應當公開的公開,應當隱藏的隱藏。
      
    繼承:
     父類到子類是從一般到特殊的關系。
      泛化:將不同子類中的共性抽象成父類的過程。
      特化:在原有父類的基礎上加入一些個性的過程。
      原則:父類放共性,子類放個性。
     繼承的關鍵字:extends
     Java只支持單繼承:一個類最多只有一個直接的父類。

          方法覆蓋:
      方法名:相同
      參數表:相同
      訪問限制符:相同或者更寬
      返回值類型:相同或者子類返回的類型是父類返回的類型的子類(在JDK5.0以后)
      拋出的異常:不能比父類更寬。
        
          super關鍵字:
      super()表示調用父類的構造器
      super()也和this()一樣必須放在方法的第一句
      super()和this()不能同時出現        
      super可以屏蔽子類屬性和父類屬性重名時帶來的屬性遮蓋,super. 表示調用父類的方法或屬性
      在子類的構造器中如果沒有指定調用父類的哪一個構造器,那么就會調用父類的無參構造器,即super()
      
     注意:
      父類的構造器不能被子類繼承
      方法和屬性可以被繼承,權限不限制能否繼承過來,限制的是能否直接訪問
      先構造父類,后構造子類,先this后super
      
    多態:
     多態分為兩種:編譯時多態和運行時多態。
      編譯時類型:主觀概念,把它看作什么。
      運行時類型:客觀概念,實際它是什么。
        例:Animal a=new Dog();
             指著狗問,這個動物是什么?
             
          運行時多態的三原則:
      對象類型不變。
      只能對對象調用編譯時類型中定義的方法。
      在程序的運行時,根據對象的運行時類型,找覆蓋后的方法來調用。(運行時動態類型綁定)
      
          強制類型轉換: 一定沒有新對象生成。(父類的引用賦值給子類的引用需要進行強制類型轉換)
          關鍵字:instanceof
               用法:引用  instanceof  類名    判斷這個引用所指向的對象是否屬于這個類。
        用在強制轉換之前,避免類型轉換異常。
       if(a instanceof Dog){
        Dog d=(Dog)a;
       }
       
     多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

    posted @ 2008-10-26 21:04 礦礦 閱讀(254) | 評論 (0)編輯 收藏

    局部變量:不是聲明在類體括號里面的變量
     (1)必須要先賦值,后使用,否則通不過編譯,局部變量沒有默認初始化值
     (2)作用范圍:定義開始到定義它的代碼塊結束
     (3)同一范圍內,不允許2個局部變量命名沖突

     參數傳遞時,簡單類型進行值轉遞 (參數進行傳遞時都會先去棧中生成一個副本的,使用結束后釋放)
     
    自動類型提升:
     byte a = 1;
     byte b = 2;
     a = a+b;          //編譯出錯自動類型提升成int
     a += b;       //自加沒有自動類型提升問題
     類型自動提升規則:
      a和b作某種運算
      a和b中有double,結果就是double
      a和b中有float,結果就是float
      a和b中有long,結果就是long
      除此之外,結果都是int
     把高字節轉成低字節,需要作強制類型轉換. byte c=(byte)a+b;
     
    移位運算符:效率最高
     >>   有符號右移,補符號位
      移負數位,則將該數值加32后再進行移位
      數值的2進制是按照補碼保存的
     >>>  右移后高位都補0
     
    邏輯運算符:
     &/|也可以作為邏輯運算符
     && 先判斷前面一個條件,如果為假,則不用計算后一個條件
     || 先判斷前面一個條件,如果為真,則不用計算后一個條件
     
    " + "運算符:
     兩個操作的對象是數值時,是加法
     如果有一個是字符串時,則是字符串的連接
     
    流程控制語句:
     同Core C++
     switch中的變量類型只能是byte、 short、int、char四種類型
     
    數組:
     聲明數組:  
      數組能以下列形式聲明:
       類型[] array;
       類型 array[]; 
      注:
       JAVA中推薦用:類型[] array;
       一個數組是一個對象
       聲明一個數組沒有創建一個對象
       聲明時不用指定長度
       
     創建數組:
      創建基本數據類型數組:int[] i = new int[2];
      創建引用數據類型數組:Student[] s = new Student[100];
      數組創建后其中的元素有初始值
       類型                     黙認值
       byte                      0
       short                     0
       int                       0
       long                      0l
       float                     0.0f
       double                   0.0d
       char                      \u0000
       boolean                 false
       reference types     null
      注:
       創建時一定要指定長度
       int[] i2=new int[];            //error
       
     初始化數組:
      聲明、創建、初始化分開:
       int[] i;   //定義數組
       i = new int[2];  //分配空間
       i[0] = 0;    //初始化
       i[1] = 1;
       
      聲明、創建、初始化在同一時間 :
       int[] i = {0,1};   //顯示初始化  {}中有幾個值,則數組長度為幾
       Student[] s = {new Student(),new Student()};
       
      注: int[] i=new int[]{1,2,3};      //后面[]中不可以寫數值
       int[] i1=new int[3]{1,2,3};    //error
       
     二維數組:(其實是一個一維數組,它的每一個元素又是一個一維數組)
      int[][] i1 = new int[2][3];
      int[][] i4 = {{1,1,1},{2,2,2},{3,3,3}};
      int[][] i3 = new int[][3];  //不允許高維沒分配空間而先給低維分配空間
      int[][] i2 = new int[2][];
      i2[0] = new int[2];
      i2[1] = new int[3];    
      
     數組長度:
      數組的屬性length
      數組長度一旦確定,不可改變    
      int[] i = new int[5]; 則i.length= 5
      
     數組拷貝:
      系統類System提供的
      static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
       src: 源數組  
       srcPos: 從源數組哪個位置開始拷貝(位置指的是元素的下標)
       dest: 目標數組
       destPos: 拷貝的元素放到目標數組的起始位置
       length: 拷貝多少個
       
     數組排序:
      自己實現一個排序方法來進行排序
      或者調用java.util.Arrays.sort(Object o)

    posted @ 2008-10-20 22:43 礦礦 閱讀(182) | 評論 (0)編輯 收藏

    JAVA_HOME:配置JDK的目錄
     CLASSPATH:指定到哪里去找運行時需要用到的類代碼(字節碼)
     PATH:指定可執行程序的位置
     
     LINUX系統(在" .bash_profile "下的環境變量設置)
      JAVA_HOME=/opt/jdk1.5.0_06
      CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
      PATH=$PATH:$JAVA_HOME/bin:.
      export JAVA_HOME CLASSPATH PATH     (將指定的環境變量聲明為全局的)
       
     windows系統:
      右擊我的電腦-->屬性-->高級-->環境變量
      
    Java的運行過程:
     編譯:生成可執行文件,如C++中利用g++生成a.out,效率高,但不跨平臺
     解釋:解釋器把源文件逐行解釋,跨平臺但效率不高
     
     在java中:先編譯后解釋,把.java文件編譯成.class字節碼文件
      Java源代碼文件(.java文件)--->
      Java編譯器(javac)--->
      Java字節碼文件(.class文件,平臺無關的)--->
      Java解釋器(java),執行Java字節碼

    Java的垃圾回收:
     由一個后臺線程gc進行垃圾回收
     虛擬機判定內存不夠的時候會中斷代碼的運行,這時候gc才進行垃圾回收
     缺點:不能夠精確的去回收內存
     java.lang.System.gc(); 建議回收內存,但系統不一定回應,他會先去看內存是否夠用,夠用則不予理睬,不夠用才會去進行垃圾回收
     內存中什么算是垃圾:
      不在被引用的對象(局部變量,沒有指針指向的)
      
    java的安全性:
     沙箱機制:只能做沙箱允許的操作
     通過下面環節,實現安全
      加載有用的類文件,不需要的不加載
      校驗字節碼,查看允許的操作
       查看代碼和虛擬機的特性是否相符
       查看代碼是否有破壞性
       查看是否有違規操作,如越界
       查看類型是否匹配,類型轉換是否能正確執行
       
    源程序:
     package mypack;  //相當于一個目錄
     
     public class HelloWorld{
      public static void main(String[] args){
       System.out.println(“Hello World”);
      }
     }
     注:
      1、文件名必須和public修飾的類名一致,以.java作為文件后綴,如果定義的類不是public的,則文件名與類名可以不同。
      2、一個.java文件中可以有多個class,但是只有一個public修飾的類。
      3、java源代碼文件編譯后,一個類對應生成一個.class文件
      4、一個java應用程序應該包含一個main()方法,而且其簽名是固定的,它是應用程序的入口方法,可以定義在任意一個類中,不一定是public修飾的類
      編譯:javac -d . HelloWorld.java
       含有包的類,在編譯的時候最好用上面的格式,-d指的是讓該類生成的時候按照包結構去生成," . "指的是在當前路徑下生成
       如果不用上面的格式,也可以用javac HelloWorld.java,但是需要注意的是包結構就要由自己去建立,然后將生成的.class文件放到該目錄下
      執行:java mypack.HelloWorld
       將字節碼文件交給Java虛擬機去解釋執行
       需要注意的事,必須使用包名.類名去解釋執行
       
    包(package):把源文件放在目錄下
     由于工程的需要,將不同的源文件放在不同的目錄下,從而引入了包。
     包可以看作就是一個存放java源文件的目錄。
     在源碼中聲明一個包名:package p;(只能放在第一行,且最多只能是一行)
     如果指定多層包,那么在包名之間我們可以用.作為分隔符:package p1.p2.p3.p4;
     用“javac HelloWorld.java –d 絕對路徑”,編譯后生成的字節碼文件就會放在指定的包結構下
     執行該程序需要用" java 包名.類名 "
     引進包中的某個類:import 包名.類名;
     引進包中的所有類:import 包名.*;
       
    注釋:
     // 單行注釋, 到本行結束的所有字符會被編譯器忽略
     /* */ 多行注釋,  在/*  */之間的所有字符會被編譯器忽略
     /**  */   文檔注釋, java特有的,在/**  */之間的所有字符會被編譯器忽略
     可以用javadoc把java源程序中這種注釋抽取出來形成html頁面(只有寫在包,類,屬性,方法,構造器,引入之前的注釋才可以進行抽取)
        
    標識符:
     命名規則:
      (1) 由字母、數字、下劃線、$組成,不能以數字開頭
      (2) 大小寫敏感
      (3) 不得使用java中的關鍵字和保留字
     
     關鍵字:都是小寫的,jdk1.2多了strictfp(經準浮點型),關鍵字 jdk1.4多了assert(斷言)關鍵字,  jdk1.5多了enum(枚舉) 關鍵字
      隨著學習進度,會慢慢接觸到的
      true、false、null嚴格說不應該算關鍵字,應稱其為保留字更合適
     
     習慣:
      (1) 標識符要符合語義信息
      (2) 包名所有字母小寫
      (3) 類名每個單詞首字母大寫,其它小寫 //TarenaStudent
      (4) 變量和方法:第一個單詞小寫,從第二個單詞開始首字母大寫 //tarenaStudent
      (5) 常量:所有字母大寫,每個單詞之間用" _ "連接
      
    基本數據類型:8種
     1) 整型
      byte       1B  8位       -128到127
      short      2B  16位      -2^15到(2^15)-1
      int          4B  32位      -2^31到(2^31)-1
      long        8B  64位      -2^63到(2^63)-1
     2) 浮點類型
      float        4B   32位      
      double     8B   64位
     3) 字符類型
        char       2B 16位  
     4) 布爾型  1B
      boolean    false/true
      
     注:
      1、Java中的自動類型提升問題。
       1)、正向過程:從低字節到高字節可以自動轉換。
        byte->short->int->long->float->double
       2)、逆向過程:從高字節到低字節用強制類型轉換。
        例:int a = (int)4.562;
        注:逆向轉換將丟失精度。
       2、boolean:只有true和false。
       3、char:Java中用" \u四位十六進制的數字 (即使在注釋中出現\u,后面如果跟的不是4個數字,也會報錯)"表示將字符轉換成對應的unicode編碼,字符類型要用單引號括起來。
       4、黙認浮點類型為double,float數據類型有一個后綴為" f "或" F "。
       5、long類型有一個后綴,為" l " 或者" L "
     
    引用數據類型:
     類、接口、數組
     引用類型 變量名 = new 引用類型名(參數);  //new后面一般跟的都是類的構造器
     成員:寫在類體括號里面的
     
    內存空間的分配:
     內存分為:
      棧:存放簡單數據類型變量(值和變量名都存在棧中),存放引用數據類型的變量名以及它所指向的實例的首地址
      堆:存放引用數據類型的實例

    posted @ 2008-10-14 19:44 礦礦 閱讀(432) | 評論 (0)編輯 收藏

     

    在中國,做軟件是當今最時髦的事情,但做軟件早已不僅僅是商業,而已經上升為一門藝術;早已經不是真正搞軟件的人獨占的地盤,而是融入房地產商、硬件廠商、服務商、各類投機者等三教九流無所不包的社會大棋局。  顯然,這是一次幾十年不遇的政策機遇,其最大價值不在于真正的軟件產業本身,不在于軟件業務本身。因為真正的中國軟件市場現在撐死也就200個億,而且大部分(2/3以上)由國外軟件公司所占有。但是,這次以軟件為名義的熱潮,其調動和轉移的財富和資源,是千億甚至萬億計的,是軟件業本身的1~2個數量級以上,甚至也是幾年前互聯網熱潮的2~3個數量級以上。這是所有試圖把握軟件機遇的人,必須首先判明的方向性問題。
      我們借用圍棋的術語,可以把商機劃分為“金角銀邊草肚皮”,鮮明地分析如下:
      1、金角:最軟的高科技和最土的房地產,鮮花插牛糞也好,天造一雙地配一對也好,反正今后今年他們都將如膠似漆!以軟件的名義,全國各省市,各區縣都將有成千上萬畝的土地紛紛成為軟件園,這無疑是房地產的大好機遇。因此,各地的軟件園和軟件學院,以及其他以軟件名義騰出的地皮,是這場軟件熱潮的價值核心。
      2、銀邊:政策效應的最根本特點就是全國上下會爭先恐后,一齊跟進。上上下下都會響應號召,出臺各種扶持政策。包括稅收減免、資金投入以及其他優先政策,都可以形成不菲的政策資源。這些資源利用得當也可以及時轉化為真金白銀。因此,如果幾年之內,全國的硬件公司、IT服務公司甚至其他行業的公司,全部或者大多都轉變成軟件公司,你也不要大驚小怪。只要真正有利益。軟件業全國上下大繁榮,也是可以期待的。當然,這是中國“特色”的軟件業,是遠遠超越了國際上一般標準的軟件概念。
      3、草肚皮:大獲其利的很少是真正的軟件公司。因為那些一門心思搞軟件的人,大多笨手笨腳。熱潮之下,供需嚴重失衡,軟件人才幾年后很可能淪為青菜蘿卜一樣。不過,那些真正一頭扎進軟件,真的做成軟件公司,也可能不錯的。雖然,隨著軟件公司迅速繁衍,真的假的都來爭奪有限的市場,競爭進一步激化,十分辛苦。但是,現在哪一行不辛苦?如果定位準確,真的能夠一不留神做成、做大,然后融資上市,也是一步登天。
      由此,所有趕潮軟件的人,從高到低,可以分為三類:最上等是“為地皮而軟件”,中間是“為政策而軟件”,最下等是“為軟件而軟件”,構成了食物鏈的金字塔。與國內其他行業的政策造市的基本規律沒有本質差異。
      面對軟件熱潮中的一些不和諧現象,我們沒有必要只從消極和負面的角度來評判。畢竟,在這股熱潮中,假作真時假也真,軟件業之外的龐大資源肯定會有一小部分要轉化到軟件產業。由于資源總量龐大,有百分之一或者百分之幾的轉化,對于軟件業來說,就是“久旱逢甘雨”,就是極大的支持。比如以國內軟件園圈地最為成功的托普為例,它在全國的幾十個軟件園都是不錯的房地產項目,運作得當,利潤十分豐厚。拿出一小部分利潤來投入軟件,補貼軟件,幾年以后一不留神也會“培育”出真正的軟件業務。畢竟,大家打的都是“軟件”的旗號,完全沒有軟件,這個美妙的游戲也是難以為繼的。這一切總比那些純粹的房地產商要好一些!
      因此,吃著房地產的剩飯,軟件也可能一點點長大成人。走出過門,走向世界;挑戰微軟,打敗印度,也不是完全沒有可能。市場就是一個追逐利益最大化的棋局,消極的批評作用和意義不大。不如,我們正視現實,承認積極、正面的效應,坦然應對這場勢不可當的大熱潮。
      總之,政策已經為我們布好了巨大的棋盤,至于如何布局和下子,那就是一個各顯其能的時候。我們當然真誠希望,那些真正有心推動中國軟件業發展的人士,能夠認清形勢,放開思路。在這場大規模的財富與資源轉移中,不要太固守成見,應放開手腳,爭取獲得盡可能多的利益,使中國軟件得到更好的推動。
    posted @ 2008-10-09 19:01 礦礦 閱讀(202) | 評論 (0)編輯 收藏

    ADSL撥號中出現的錯誤代碼
     

     
    Error 602 The port is already open

    問題:撥號網絡網絡由于設備安裝錯誤或正在使用,不能進行連接

    原因:RasPPPoE沒有完全和正確的安裝

    解決:卸載干凈任何PPPoE軟件,重新安裝

     

    Error 605 Cannot set port information

    問題:撥號網絡網絡由于設備安裝錯誤不能設定使用端口

    原因:RasPPPoE沒有完全和正確的安裝

    解決:卸載干凈任何PPPoE軟件,重新安裝

     

    Error 606 The port is not connected

    問題:撥號網絡網絡不能連接所需的設備端口

    原因:RasPPPoE沒有完全和正確的安裝,連接線故障,ADSL MODEM故障

    解決:卸載干凈任何PPPoE軟件,重新安裝,檢查網線和 ADSL MODEM

     

    Error 608 The device does not exist

    問題:撥號網絡網絡連接的設備不存在

    原因:RasPPPoE沒有完全和正確的安裝

    解決:卸載干凈任何PPPoE軟件,重新安裝

     

    Error 609 The device type does not exist

    問題:撥號網絡網絡連接的設備其種類不能確定

    原因:RasPPPoE沒有完全和正確的安裝

    解決:卸載干凈任何PPPoE軟件,重新安裝

     

    Error 611 The route is not available/612 The route is not allocated

    問題:撥號網絡網絡連接路由不正確

    原因:RasPPPoE沒有完全和正確的安裝,ISP服務器故障

    解決:卸載干凈任何PPPoE軟件,重新安裝,致電ISP詢問

     

    Error 617 The port or device is already disconnecting

    問題:撥號網絡網絡連接的設備已經斷開

    原因:RasPPPoE沒有完全和正確的安裝,ISP服務器故障,連接線,ADSL MODEM故障

    解決:卸載干凈任何PPPoE軟件,重新安裝,致電ISP詢問 ,檢查網線和 ADSL MODEM

     

    Error 619

    問題:與ISP服務器不能建立連接

    原因:ADSL ISP服務器故障,ADSL電話線故障

    解決:檢查ADSL信號燈是否能正確同步。致電ISP詢問

     

    Error 621 Cannot open the phone book file

    Error 622 Cannot load the phone book file

    Error 623 Cannot find the phone book entry

    Error 624 Cannot write the phone book file

    Error 625 Invalid information found in the phone book

    問題:Windows NT或者Windows 2000 Server網絡RAS網絡組件故障

    原因:軟件安裝問題

    解決:卸載所有PPPoE軟件,重新安裝RAS網絡組件和RasPPPoE

     

    Error 630

    問題:ADSL MODEM沒有沒有響應

    原因:ADSL電話線故障,ADSL MODEM故障(電源沒打開等)

    解決:檢查ADSL設備

     

    Error 633

    問題:撥號網絡網絡由于設備安裝錯誤或正在使用,不能進行連接

    原因:RasPPPoE沒有完全和正確的安裝

    解決:卸載干凈任何PPPoE軟件,重新安裝

     

    Error 638

    問題:過了很長時間,無法連接到ISP的ADSL接入服務器

    原因:ISP服務器故障;在RasPPPoE所創建的不好連接中你錯誤的輸入了一個電話號碼

    解決:運行其創建撥號的Raspppoe.exe檢查是否能列出ISP服務,以確定ISP正常;把所使用的撥號連接中的 電話號碼清除或者只保留一個0。

     

    Error 645

    問題:網卡沒有正確響應

    原因:網卡故障,或者網卡驅動程序故障

    解決:檢查網卡,重新安裝網卡驅動程序

     

    Error 650

    問題:遠程計算機沒有響應,斷開連接

    原因:ADSL ISP服務器故障,網卡故障,非正常關機造成網絡協議出錯

    解決:檢查ADSL信號燈是否能正確同步,致電ISP詢問;檢查網卡,刪除所有網絡組件重新安裝 網絡。

     

    Error 651

    問題:ADSL MODEM報告發生錯誤

    原因:Windows處于安全模式下,或其他錯誤

    解決:出現該錯誤時,進行重撥,就可以報告出新的具體錯誤代碼

     

    Error 691

    問題:輸入的用戶名和密碼不對,無法建立連接

    原因:用戶名和密碼錯誤,ISP服務器故障

    解決:使用正確的用戶名和密碼,并且使用正確的ISP賬號格式(name@service),致電ISP詢問。

     

    Error 718

    問題:驗證用戶名時遠程計算機超時沒有響應,斷開連接

    原因:ADSL ISP服務器故障

    解決:致電ISP詢問

     

    Error 720

    問題:撥號網絡無法協調網絡中服務器的協議設置

    原因:ADSL ISP服務器故障,非正常關機造成網絡協議出錯

    解決:致電ISP詢問,刪除所有網絡組件重新安裝網絡。

     

    Error 734

    問題:PPP連接控制協議中止

    原因:ADSL ISP服務器故障,非正常關機造成網絡協議出錯

    解決:致電ISP詢問,刪除所有網絡組件重新安裝網絡。

     

    Error 738

    問題:服務器不能分配IP地址

    原因:ADSL ISP服務器故障,ADSL用戶太多超過ISP所能提供的IP地址

    解決:致電ISP詢問

     

    Error 797

    問題:ADSL MODEM連接設備沒有找到

    原因:ADSL MODEM電源沒有打開,網卡和ADSL MODEM的連接線出現問題,軟件安裝以后相應的協議沒有正確邦定,在創立撥號連接時,建立了錯誤的空連接

    解決:檢查電源,連接線;檢查網絡屬性,RasPPPoE相關的協議是否正確的安裝并正確邦定(相關協議),檢查網卡是否出現?號或!號,把它設置為Enable;檢查撥號連接的屬性,是否連接的設備使用了一個“ISDN channel-Adapter Name(xx)” 的設備,該設備為一個空設備,如果使用了取消它,并選擇 正確的PPPoE設備代替它,或者重新創立撥號連接。

    posted @ 2008-10-06 13:47 礦礦 閱讀(131) | 評論 (0)編輯 收藏
    “高效”有時候并不需要什么技巧,很多人在抱怨沒有足夠時間的時候,其中的潛臺詞是他們應該更專心。時間對每個人都是公平的,你需要的是不要浪費時間,并且專心。

    防止浪費時間的竅門
    If the real work that needs doing is offline, disable the internet for an hour at a time.
    如果這件事情不需要上網就可以完成,把網斷掉。

    Turn email checks into an hourly habit, not an “as the box gets mail” habit.
    延長查看電子郵件的周期。

    Don’t answer your cell phone when working on something important. Call back later.
    如果手頭的工作很重要,工作期間不要接電話,回頭再打過去就是了。

    If you can’t work at work, negotiate finding a new place to get things done.
    如果你的工作環境讓你不能工作,換個沒人打擾的地方

    Television means: “I don’t need this time and it doesn’t matter to me.” (Almost always. Really.)
    看電視意味著“這段時間我浪費了也無所謂”。

    Bugdet your entertainment time vs. production time. Never cheat the other.
    平衡你的娛樂和工作時間。

    Examine every opportunity along the lines of time vs. projects already underway.
    時時檢查你的時間安排和現在已經進行中的項目。

    Try working part of your day in “off-hour” times, to get more done with fewer people around.
    以小時為單位劃分你的工作時間,用更少的人做更多的事情。

    專心的竅門

    Write your goals clearly. Post them in eyeball view of where you work most.
    清楚的寫下你的目標。放在你的眼皮底下。

    Spend time with focused people. Meet and befriend those who are where you want to be.
    多和專心工作的人在一起。

    Consume as much material about your prime focus as you can budget.
    盡量把資源用在主要目標上,把時間花在刀刃上。

    Analyze your past experiences. Be clear. List your successes. Examine your failures.
    回顧總結以往的成功和失敗經驗。

    Stay true to a particular vision of what you want to do.
    清楚明白你想要得到的是什么。

    Don’t give up too early.
    不要太容易放棄。

    Envision your success. Write about it. Then read that daily or weekly.
    想象一下成功后的樣子,寫下來,每天讀讀。

    Learn how to “chunk.” Hit each milestone and move to the next. Be methodical.
    學會把大事劃分為幾個階段,完成一個階段,再進入下一個。

    Develop habits around success and drive.
    養成好習慣。

    Recharge your batteries with good sleep and food.
    吃好睡足。

    Develop your relationship with your family. It nourishes the other goals.
    維持家庭關系。這是你完成其它工作的保障。
    posted @ 2008-09-12 18:24 礦礦 閱讀(149) | 評論 (1)編輯 收藏
    1、不說“不可能”三個字;

    2、凡事第一反應:找方法,而不是找借口;

    3、遇到挫折對自己大聲說:太棒了;

    4、不說消極的話,不落入消極情緒,一旦出現立即正面處理;

    5、凡事先訂立目標,并且盡量制作“夢想版”;

    6、凡事預先作計劃,盡量前目標視覺化;

    7、六點優先工作制,每一分,每一秒做生產力的事情;

    8、隨時用零碎的時間(如等人、排隊等)做零碎的小活;

    9、守時;

    10、寫下來,不要太依靠腦袋記憶;

    11、隨時記錄靈感;

    12、把重要的觀念、方法寫下來,并貼起來,以隨時提示自己;

    13、走路比平時快30%。走路時,腳尖稍用力推進;肢體語言健康有力,不懶散;

    14、每天出門照鏡子,給自己一個自信的笑容;

    15、每天自我反省一次;

    16、每天堅持一次運動;

    17、聽心跳1分鐘。指在做重要事前,疲勞時,心情煩燥時,緊張時;

    18、開會坐在前排;

    19、微笑;

    20、用心傾聽,不打斷對方說話;

    21、說話時,聲音有力。感覺自己聲音似乎能產生有感染力的磁場;

    22、同理心。說話之前,先考慮一下對方的感覺;

    23、每天有意識、真誠地贊美別人三次以上;

    24、及時寫感謝卡,哪怕是用便條寫;

    25、不用訓斥、指責的口吻跟別人說話;

    26、控制住不要讓自己做出為自己辯護的第一反應;

    27、每天多做一件“分外事”

    28、不管任何方面,每天必須至少做一次“進步一點點”;

    29、每天提前15分鐘上班,推遲30分鐘下班;

    30、每天在下班前5分鐘的時間做一天的整理性工作;

    31、定期存錢;

    32、節儉;
    posted @ 2008-09-12 18:23 礦礦 閱讀(121) | 評論 (0)編輯 收藏

    新華網北京5月20日電(記者 隋笑飛楊維漢)這次地震前,中國地震局沒有作出短臨預報,同時也沒有收到任何單位、個人或團體提交的有關這次地震的短臨預報意見。至于網上發布曾經有人提出過關于這次地震的預報意見的信息,是不符合實際的。中國地震局對于個人或團體的地震短臨預報意見,有專門的管理辦法和處理程序。中國地震局監測預報司是具體負責這項工作的部門。

    20日上午,中國地震局監測預報司副司長車時接受中國地震信息網專訪時作上述表示。

    車時同時介紹了中國地震局對個人或團體的地震短臨預報意見的管理辦法。他說,中國地震局監測預報司從20世紀80年代后期開始對個人、學術團體的短臨地震預報意見實施管理,具體管理工作由中國地震臺網中心統一管理。具體辦法是,指定專門的地震預報專家管理個人、學術團體等提出的短臨預報意見。由專家收集、整理,并及時在地震部門的周、月會商中,介紹預測意見的主要依據、結論等,供震情跟蹤判定時參考。每年年底,對一年中的所有短臨預報意見進行評估,對其中預報準確或預報效果較好的給予獎勵。

    車時還指出,中國防震減災法和地震預報管理條例中,有關于地震短臨預報的明確規定。防震減災法第十六條規定:國家對地震預報實行統一發布制度。地震短期預報和臨震預報,由省、自治區、直轄市人民政府按照國務院規定的程序發布。任何單位或者從事地震工作的專業人員關于短期地震預測或者臨震預測的意見,應當報國務院地震行政主管部門或者縣級以上地方人民政府負責管理地震工作的部門或者機構按照前款處理,不得擅自向社會擴散。

    車時表示,地震預報管理條例規定,國家鼓勵和扶持地震預報的科學技術研究。中國地震局監測預報司本著對人民、對國家高度負責的態度,嚴格遵照該規定,支持地震預報科學研究,高度重視個人和團體提出的短臨預測意見,但是對這些預測意見的處理是有嚴格程序的,要組織專家按照有關規定對預測意見的科學性和可能性進行審定。同時,由于地震預報既具有科學性,又具有社會性,政府發布地震預測意見是非常慎重的。

    關于個人或團體有了地震預報意見后應如何提交給地震部門的問題,車時表示,任何單位和個人根據地震觀測資料和研究成果,提出了短臨地震預測意見,可向所在地或者所預測地區的縣級以上地方人民政府負責管理地震工作的機構提出書面報告,也可以直接向國務院地震工作主管部門書面報告。但是,不得向社會散布。并且,任何單位和個人不得向國(境)外提出地震預測意見。個人或團體對地震活動趨勢的長期和中期預測研究成果除外,可以進行學術交流討論。

    車時還談了個人或團體提交的地震短臨預報意見的具體情況。他說,現在有很多個人或團體開展地震預報探索,每年都收到幾十至上百份的正式短臨預報意見。但是,當前地震預報是公認的世界科學難題,總體水平是很低的。準確的短臨預報意見是非常少的,2000年以來,中國地震臺網中心(前分析預報中心)共收到700多份地震短臨預報意見,其中基本上準確的預報意見有7份。2008年以來,共收到26份短臨預報意見,尚沒有正確預報的短臨預報意見。盡管這些意見的準確性非常低,但作為地震主管部門,根據有關法律,歡迎和鼓勵個人和團體繼續開展地震預報探索。

    posted @ 2008-05-21 13:18 礦礦 閱讀(113) | 評論 (0)編輯 收藏

    package Pro123;

    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;

    public class Demo extends JFrame{
        /**
      *
      */
     private static final long serialVersionUID = 1L;
     JOptionPane pane1 = new JOptionPane();
     JFrame frame = new JFrame();
         Container contentPane = frame.getContentPane();
           JLabel Message = new JLabel("請輸入郵箱和密碼");
           //用戶名、密碼以及其輸入框
           JLabel Name = new JLabel("用戶名");
           JLabel Password = new JLabel("密   碼");
           JTextField tName = new JTextField(12);
           JPasswordField pPwd = new JPasswordField(12);
           //按扭
           JButton btnDl = new JButton("登陸");
           JButton btnCz = new JButton("重置");
         
          
           JPanel pToppane = new JPanel();
           JPanel pCenterpane = new JPanel();
           JPanel pCenterpaneName = new JPanel();
           JPanel pCenterpanePwd = new JPanel();
           JPanel pButton = new JPanel();
          
           Demo(){
          
           this.setTitle("郵件登陸");//窗口標題
           
           //以下為加入面版
           pCenterpaneName.add(Name);
           pCenterpaneName.add(tName);
          
           pCenterpanePwd.add(Password);
           pCenterpanePwd.add(pPwd);
          
           pCenterpane.add(pCenterpaneName,"North");
           pCenterpane.add(pCenterpanePwd,"South");
          
           pToppane.add(Message);
         
           pButton.add(btnDl);
           pButton.add(btnCz);
           btnDl.addActionListener(new neibu1());
           btnCz.addActionListener(new neibu2());
          
           add(pToppane,"North");
           add(pCenterpane,"Center");
           add(pButton,"South");
          
          
           this.setSize(250,180);//設置大小
           this.setVisible(true);//設置可見
          
           setResizable(false);//禁止拉動窗口大小
           //居中窗口
           Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation((screen.width - getSize().width)/2,(screen.height - getSize().height)/2 );
      
          // this.setDefaultCloseOperation(3);//關閉窗口
        this.addWindowListener(new WindowClose());
           }
           //對郵箱的輸入格式進行判斷
           public boolean validateEmailName(String name){
            String emailName = name.substring(0,name.indexOf('@'));
            boolean booFormat = true;
            int temp = -1;
            for(int i=0;i<emailName.length();i++){
             temp = name.charAt(i);
             A:if(temp<65){
              if(temp>48 && temp<57)
               break A;
              booFormat = false;
              break;
             }
             B:if(temp>90 && temp<97){
              if(temp == 95)
               break B;
              booFormat = false;
              break;
             }
            }
            return booFormat;
           }
           //郵箱檢測
           public boolean validateStationName(String name){
            String stationName = name.substring(name.indexOf('@')+1);
            boolean boo = true;
            if(stationName.indexOf('.') == -1){
             boo = false;
            }else if(stationName.indexOf('.') == 0){
             boo = false;
            }
            return boo;
           }
          
           //事件
      
         
          class  neibu1 implements ActionListener {
          public void actionPerformed(ActionEvent e){
           String name = tName.getText().trim();
           String password = new String(pPwd.getPassword()).trim();
           int first = 0;
           @SuppressWarnings("unused")
       boolean booFromat = false;
           boolean boo = false;
          
           boolean booFormat = false;
       if(name.length()>0){
            first = name.charAt(0);
            if(name.indexOf("@")!= -1){
             booFormat = validateEmailName(name);
             boo = validateStationName(name);
            }
           }
           if(name.equals("")){
            Message.setForeground(Color.red);
            Message.setText("請輸入郵箱");
           // tName.setText("");//清空輸入內容
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }else if(name.indexOf("@")== -1){
            Message.setForeground(Color.red);
            Message.setText("您輸入郵箱格式錯誤,不包含“@”");
            //tName.setText("");
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }else if(first<65 || (first>90 && first <97)||first>122){
            Message.setForeground(Color.red);
            Message.setText("郵箱首字母應為英文字母");
           // tName.setText("");
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }else if(!booFormat){
            Message.setForeground(Color.red);
            Message.setText("郵箱名不和法:只能包含字母、數字、下劃線");
            //tName.setText("");
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }else if(!boo){
            Message.setForeground(Color.red);
            Message.setText("郵箱后綴不和法");
            //tName.setText("");
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }else if(password.equals("")){
            Message.setForeground(Color.red);
            Message.setText("密碼不能為空");
            pPwd.setText("");//清空輸入內容
            pPwd.grabFocus();
           }else if(password.length()<6){
            Message.setForeground(Color.red);
            Message.setText("密碼必須為6位,請檢查后重新輸入");
            pPwd.setText("");//清空輸入內容
            pPwd.grabFocus();
           }else if(name.equals("java@svse.com")&&password.equals("jackrose")){
            Message.setForeground(Color.blue);
            Message.setText("歡迎"+name+"登陸");
           }else{
            Message.setForeground(Color.red);
            Message.setText("郵箱或密碼錯誤!請重新輸入!");
            pPwd.setText("");//清空輸入內容
            tName.grabFocus();
           }
          }
           }
    //    重置鍵清空輸入內容
          class neibu2 implements ActionListener {
        
          public void actionPerformed(ActionEvent e){
           pPwd.setText("");
           tName.setText("");
          }
          }
          class WindowClose extends WindowAdapter{
          public void windowClosing(WindowEvent e){
          
          System.exit(0);
          }
          }
          //MAIN方法
           public static void main(String[]args){
            new Demo();
           }

     
    }

    posted @ 2008-05-20 18:11 礦礦 閱讀(1126) | 評論 (3)編輯 收藏
    字符串
    1、獲取字符串的長度
    length()
    2 、判斷字符串的前綴或后綴與已知字符串是否相同
    前綴 startsWith(String s)
    后綴 endsWith(String s)
    3、比較兩個字符串
    equals(String s)
    4、把字符串轉化為相應的數值
    int型 Integer.parseInt(字符串)
    long型 Long.parseLong(字符串)
    float型 Folat.valueOf(字符串).floatValue()
    double型 Double.valueOf(字符串).doubleValue()
    4、將數值轉化為字符串
    valueOf(數值)
    5、字符串檢索
    indexOf(Srting s) 從頭開始檢索
    indexOf(String s ,int startpoint) 從startpoint處開始檢索
    如果沒有檢索到,將返回-1
    6、得到字符串的子字符串
    substring(int startpoint) 從startpoint處開始獲取
    substring(int start,int end) 從start到end中間的字符
    7、替換字符串中的字符,去掉字符串前后空格
    replace(char old,char new) 用new替換old
    trim()
    8、分析字符串
    StringTokenizer(String s) 構造一個分析器,使用默認分隔字符(空格,換行,回車,Tab,進紙符)
    StringTokenizer(String s,String delim) delim是自己定義的分隔符

    nextToken() 逐個獲取字符串中的語言符號
    boolean hasMoreTokens() 只要字符串還有語言符號將返回true,否則返回false
    countTokens() 得到一共有多少個語言符號


    文本框和文本區

    1、文本框
    TextField() 構造文本框,一個字符長
    TextField(int x) 構造文本框,x個字符長
    TextField(String s) 構造文本框,顯示s
    setText(String s) 設置文本為s
    getText() 獲取文本
    setEchoChar(char c) 設置顯示字符為c
    setEditable(boolean) 設置文本框是否可以被修改
    addActionListener() 添加監視器
    removeActionListener() 移去監視器
    2、文本區
    TextArea() 構造文本區
    TextArea(String s) 構造文本區,顯示s
    TextArea(String s,int x,int y) 構造文本區,x行,y列,顯示s
    TextArea(int x,int y) 構造文本區,x行,y列
    TextArea(String s,int x,ing y,int scrollbar)
    scrollbar的值是:
    TextArea.SCROLLBARS_BOTH
    TextArea.SCROLLBARS_VERTICAL_ONLY
    TextArea.SCROLLBARS_HORIZONTAL_ONLY
    TextArea.SCROLLBARS_NONE
    setText(String s) 設置文本為s
    getText() 獲取文本
    addTextListener() 添加監視器
    removeTextListener() 移去監視器
    insert(String s,int x) 在x處插入文本s
    replaceRange(String s,int x,int y) 用s替換從x到y處的文本
    append(String s) 在文本的最后追加文本s
    Int getCaretPosition(int n) 獲取文本區中光標的位置

    按鈕

    1、按鈕
    Button() 構造按鈕
    Button(String s) 構造按鈕,標簽是s
    setLabel(String s) 設置按鈕標簽是s
    getLabel() 獲取按鈕標簽
    addActionListener() 添加監視器
    removeActionListener() 移去監視器

    標簽

    1、標簽
    Label() 構造標簽
    Label(String s) 構造標簽,顯示s
    Label(String s,int x)
    x是對齊方式,取值:
    Label.LEFT
    Label.RIGHT
    Label.CENTER
    setText(String s) 設置文本s
    getText() 獲取文本
    setBackground(Color c) 設置標簽背景顏色
    setForeground(Color c) 設置字體顏色


    選擇框

    1、選擇框
    Checkbox() 構造選擇框
    Checkbox(String s) 構造選擇框,給定標題s
    Checkbox(String s,boolean b) b設定初始狀態
    Checkbox(String s,boolean b,CheckboxGroup g) g設定了所屬的組(有了組就成為單選框)
    addItemListener() 添加監視器
    removeItemListener() 移去監視器
    getState() 返回選擇框的是否選中狀態
    setState(boolean b) 設置選擇框的狀態
    getLabel() 獲取選擇框的標題
    setLabel(String s) 設置選擇框的標題為s

    選擇控件和滾動列表

    1、選擇控件
    Choice() 構造選擇控件
    add(String s) 向選擇控件增加一個選項
    addItemListener() 添加監視器
    removeItemListener() 移去監視器
    getSelectedIndex() 返回當前選項的索引
    getSelectedItem() 返回當前選項的字符串代表
    insert(String s,int n) 在n處插入選項s
    remove(int n)
    removeAll()
    2、滾動列表
    List() 構造滾動列表
    List(int n) 參數n是可見行數
    List(int n,boolean b) 參數b是設置是否可以多項選擇
    add(String s) 向列表的結尾增加一個選項
    add(String s,int n) 在n處增加一個選項
    AddActionListener() 滾動列表添加監視器
    addItemListener() 滾動列表上的選項添加監視器
    remove(int n) 刪除n初的選項
    remnoveAll() 刪除全部選項
    getSelectedIndex() 返回當前選項的索引
    getSelectedItem() 返回當前選項的字符串代表


    3、組件類的一些常用方法
    void setBackground(Color c) 設置組件背景顏色
    void setForeground(Color c) 設置組件前景顏色
    void setFonts(Font f) 設置組件字體
    void setBounds(int x,int y,int w,int h) 設置坐標,x,y表示在容器中坐標,w,h表示寬和高
    void setLocation(int x,int y) 移動到x,y 處
    void setSize(int w,int h) 設置寬和高
    void setVisible(boolean b) 設置組建是否可見
    int getBounds().wigth 獲取寬
    int getBounds().height 獲取高
    int getBounds().x 獲取x 坐標
    int getBounds().y 獲取y 坐標
    Toolkit getToolkit() 獲取工具包對
    void setEnabled(boolean b) 設置是否可以使用(默認可以)

    窗口和菜單
    1、窗口
    Frame() 構造窗口
    Frame(String s) 窗口標題是s
    setBounds(int x,int y,int w,int h) 窗口位置x,y,寬w,高y
    setSize(int w,int h) 設置窗口位置(單位是像素)
    setBackground(Color c) 設置背景顏色
    setVisible(boolean b) 設置窗口是否可見
    pack() 窗口出現時緊湊
    setTitle(String s) 設置標題為s
    getTitle() 獲取標題
    setResizable(boolean b) 設置窗口大小是否可以調整
    2、菜單條
    Menubar() 構造菜單條
    setMenubar() 窗口添加菜單條
    3、菜單
    Menu() 構造菜單
    Menu(String s) 構造菜單,標題s
    add
    add(MenuItem item) 菜單增加菜單選項item
    add(String s) 向菜單增加選項s
    getItem(int n) 獲取n處的選項
    getItemCount() 獲取選項數目
    insert(MenuItem item,int n) 在n處插入菜單選項item
    insert(String s,int n) 在n處插入菜單選項
    remove(int n) 刪除菜單的n處的菜單選項
    removeAll() 刪除全部
    4、菜單項
    MenuItem() 構造菜單項
    MenuItem(String s) 構造標題是s的菜單項
    setEnabled(boolean b) 設置是否可以被選擇
    getLabel() 得到菜單選項名
    addActionListener() 添加監視器
    5、有關菜單的技巧
    addSeparator() 增加菜單分割線
    CheckboxMenuItem() 復選框菜單項
    setShortcut(MenuShortcut k) 設置快捷鍵(k取值KeyEvent.VK_A----KeyEvent.VK_Z)



    建立對話框
    1、Dialog類
    Dialog(Frame f,String s) 構造對話框,初始不可見,s是標題,f是對話框所依賴的窗口
    Dialog(Frame f,String s,boolean b) b設置初始是否可見
    getTitle() 獲取對話框標題
    setTitle(String s) 設置對話框標題
    setModal(boolean b) 設置對話框模式
    setSize(int w,int h) 設置對話框大小
    setVisible(boolean b) 顯示或隱藏對話框
    2、FileDialog類
    Filedialog(Frame f,String s,int mode) mode的值是fileDialog.LOAD或者fileDialog.SAVE
    public String getDirectory() 獲取當前文件對話框中顯示的文件所屬目錄
    public String getFile() 獲取當前文件對話框中文件的字符串表示,不存在返回null

    Java中的鼠標和鍵盤事件
    1、使用MouseListener借口處理鼠標事件
    鼠標事件有5種:按下鼠標鍵,釋放鼠標鍵,點擊鼠標鍵,鼠標進入和鼠標退出
    鼠標事件類型是MouseEvent,主要方法有:
    getX(),getY() 獲取鼠標位置
    getModifiers() 獲取鼠標左鍵或者右鍵
    getClickCount() 獲取鼠標被點擊的次數
    getSource() 獲取鼠標發生的事件源
    事件源獲得監視器的方法是addMouseListener(),移去監視器的方法是removeMouseListener()


    處理事件源發生的時間的事件的接口是MouseListener 接口中有如下的方法
    mousePressed(MouseEvent) 負責處理鼠標按下事件
    mouseReleased(MouseEvent) 負責處理鼠標釋放事件
    mouseEntered(MouseEvent) 負責處理鼠標進入容器事件
    mouseExited(MouseEvent) 負責處理鼠標離開事件
    mouseClicked(MouseEvent) 負責處理點擊事件
    2、使用MouseMotionListener接口處理鼠標事件
    事件源發生的鼠標事件有2種:拖動鼠標和鼠標移動
    鼠標事件的類型是MouseEvent
    事件源獲得監視器的方法是addMouseMotionListener()
    處理事件源發生的事件的接口是MouseMotionListener 接口中有如下的方法
    mouseDragged() 負責處理鼠標拖動事件
    mouseMoved() 負責處理鼠標移動事件
    3、控制鼠標的指針形狀
    setCursor(Cursor.getPreddfinedCursor(Cursor.鼠標形狀定義)) 鼠標形狀定義見(書 P 210)
    4、鍵盤事件
    鍵盤事件源使用addKeyListener 方法獲得監視器
    鍵盤事件的接口是KeyListener 接口中有3個方法
    public void keyPressed(KeyEvent e) 按下鍵盤按鍵
    public void keyReleased(KeyEvent e) 釋放鍵盤按鍵
    public void keyTypde(KeyEvent e) 按下又釋放鍵盤按鍵

    Java多線程機制
    1、Java的線程類與Runnable接口
    Thread類
    public Thread() 創建線程對象
    public Thread(Runnable target) target 稱為被創建線程的目標對象,負責實現Runnable接口
    線程優先級
    Thread類有三個有關線程優先級的靜態常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
    新建線程將繼承創建它的副相承的優先級,用戶可以調用Thread類的setPriority(int a)來修改
    a的取值:
    Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY
    主要方法
    啟動線程 start()
    定義線程操作 run()
    使線程休眠 sleep()
    sleep(int millsecond) 以毫秒為單位的休眠時間
    sleep(int millsecond,int nanosecond) 以納秒為單位的休眠時間
    currentThread() 判斷誰在占用CPU的線程
    第二十章 輸入輸出流
    1、FileInputStream類
    FileInputStream(String name) 使用給定的文件名name創建一個FileInputStream對象
    FileInputStream(File file) 使用File對象創建FileInpuStream對象
    File類有兩個常用方法:
    File(String s) s確定文件名字
    File(String directory,String s) directory是文件目錄


    例如:
    File f=new File("Myfile.dat");
    FileInputStream istream=new FileInputStream(f);
    處理I/O異常
    當出現I/O錯誤的時候,Java生成一個IOException(I/O異常)對象來表示這個錯誤的信號。
    程序必須使用一個catch檢測這個異常
    例如:
    try{
    FileInputStream ins= new FileInputStream("Myfile.dat");
    }
    catch(IOException e){
    System.out.println("File read Error:"+e);
    }
    從輸入流中讀取字節
    int read() 返回0~255之間一個整數,如果到輸入流末尾,則返回-1
    int read(byte b[]) 讀取字節數組
    int read(byte b[],int off,int len) off指定把數據存放在b中什么地方,len指定讀取的最大字節數
    關閉流
    close()
    2、FileOutputStream類
    FileOutputStream(String name) 使用指定的文件名name創建FileOutputStream對象
    FileOutputStream(File file) 使用file對象創建FileOutputStream對象
    FileOutputStream(FileDescriptor fdobj) 使用FileDescriptor對象創建FileOutputStream對象
    3、FileReader類和FileWriter類
    FileReader(String filename)


    FileWriter(String filename)
    處理時需要FileNotFoundException異常
    4、RandomAccessFile類
    RandomAccessFile不同于FileInputStream和FileOutputStream,不是他們的子類
    當我們想對一個文件進行讀寫操作的時候,創建一個指向該文件的RandomAccessFile流就可以了
    RandomAccessFile類有兩個構造方法:
    RandomAccessFile(String name, String mode) name是文件名,mode取r(只讀)或rw(讀寫)
    RandomAccessFile(File file,String mode) file給出創建流的源
    seek(long a) 移動RandomAccessFile流指向文件的指針,a確定指針距文件開頭的位置
    getFilePointer() 獲取當前文件的指針位置
    close() 關閉文件
    getFD() 獲取文件的FileDescriptor
    length() 獲取文件長度
    read() 讀取一個字節數據
    readBoolean() 讀取一個布爾值
    readByte() 讀取一個字節
    readChar()
    readFloat()
    readFully(byte b[])
    readInt()
    readLine()
    readLong()
    readUnsignedShort()
    readUTF() 讀取一個UTF字符串
    setLength(long newLength) 設置文件長度
    skipByte(int n) 在文件中跳過給定數量的字節
    write(byte b[]) 寫b.length個字節到文件
    writeBoolean(bolean b)
    writeByte(int v)
    writeChar(char c)
    writeChars(String s)
    writeDouble(double d)
    writeFloat(float v)
    writeInt(int i)
    writeLong(long l)
    writeShort(int i)
    writeUTF(String s)
    5、管道流
    PipedInputStream類
    PipedInputStream() 創建一個管道輸入流
    PipedInputStream(PipedOutputStream a) 連接到輸出流a的輸入流
    read() 從輸入流中讀取一個字節
    read(byte b[],int off,int len) off是在b中的開始位置,len是字節長度
    PipedOutputStream類
    PipedOutputStream() 創建一個輸出流
    PipedOutputStream(PipedInputStream a) 連接到輸入流a的輸出流
    write(int b)
    write(byte b[],int off,int len)
    counnect() 連接輸入輸出流
    close() 關閉流
    在使用的時候要捕獲IOException異常。
    6、數據流
    DataInputStream類(數據輸入流)
    DataInputStream(InputStream in) 將數據輸入流指向一個由in指定的輸入流
    DataOutputStream類(數據輸出流)
    DataOutputStream(OutputStream out) 將數據輸出流指向一個由out指定的輸出流
    主要方法:
    close()
    read() 讀取一個字節數據
    readBoolean() 讀取一個布爾值
    readByte() 讀取一個字節
    readChar()
    readFloat()
    readFully(byte b[])
    readInt()
    readLine()
    readLong()
    readUnsignedShort()
    readUTF() 讀取一個UTF字符串
    skipByte(int n) 在文件中跳過給定數量的字節
    write(byte b[]) 寫b.length個字節到文件
    writeBoolean(bolean b)
    writeByte(int v)
    writeChar(char c)
    writeChars(String s)
    writeDouble(double d)
    writeFloat(float v)
    writeInt(int i)
    writeLong(long l)
    writeShort(int i)
    writeUTF(String s)
    7、對象流
    ObjectInputStream類和ObjectOutputStream類分別是DataInputStream類和DataOutputStream類的子類
    8、回壓輸入流
    PushbackInputStream類
    PushbackInputStream(InputStream in)
    PushbackReader類
    PushbackReader(Reader in)
    unread(char c) 回壓一個字符
    unread(char c[]) 回壓數組c中全部字符
    unread(char c[],offset,int n) 回壓c中從offset開始的n個字符

    java網絡的基本知識
    1、使用URL(統一資源定位)
    例如:
    try
    {
    url=new URL("http://www.sina.com.cn";
    }
    catch(MalformedURLException e)
    {
    System.out.println("Bad URL:"+url);
    }
    在Applet 中鏈接向另外的Web頁面,使用代碼:
    getAppletContext().showDocument(url);
    2、套接字
    客戶建立到服務器的套接字(Socket)
    Socket(String host,int port) host是服務器的IP地址,port是端口號
    建立了套接字后可以使用getInputStream()獲得輸入流
    還可以使用getOutputStream()獲得一個輸出流
    服務器建立接受客戶套接字的服務器套接字(ServerSocket)
    ServerSocket(int port) port是端口號
    建立了套接字連接后可以使用accept()接收客戶的套接字
    可以使用getOutputStream()獲得一個輸出流
    還可以使用getInputStream()獲得一個輸入流
    3、InetAddress類
    getByName(String )
    3、InetAddress類
    getByName(String s) 獲取Internet上主機的地址
    getHostName() 獲取InetAddress對象所包含的域名
    getHostAddress() 獲取InetAddress對象所包含的IP地址


    getLocalHost() 獲取本地地址
    4、UDP數據報
    發送數據包,即使用DatagramPacket類將數據打包,有兩種構造方法
    DatagramPacket(byte data[],int length,InetAddress address,int port)
    ?含有data數組的數據
    ?該數據包將發送到地質是address,端口是port的主機上
    DatagramPacket(byte data[],int offset,int length,InetAddress address,int port)
    ?含有data數組的從offset開始,length長度的數據
    ?該數據包將發送到地質是address,端口是port的主機上
    接收數據包,即使用DatagramSocket(int port)創建一個對象,port必須和待接收的數據包的端口相同
    例如:
    如果發送方的數據包端口是5566
    DatagramSocket mail=new DatagramSocket(5566);
    然后對象mail可以使用方法receive(Datagrampacket pack)接收數據包
    在使用參數pack 接收數據包前,必須創建pack
    byte data[]=new byte[100];
    int length=90;
    DatagramPacket pack=new DatagramPataet(data,length);
    mail.receive(pack);
    該數據包pack將接收長度是length的數據放入data,注意數據長度不要超過8192KB
    pack還可以調用方法getPort()獲取所接受數據包是從什么端口發出的


    調用方法InetAddress getAddress()可以獲知數據包來自哪個主機

    Java與圖像
    1、java支持的圖像類型:GIF,JPEG,BMP
    2、Image類
    首先申請一個Image對象
    Image img =getImage(URL url,String name) url是圖像地址,name是圖片名稱
    通常使用:
    Image img =getImage(getCodBase(),String name) getCodBase()獲取當前小應用程序的URL,也就是在同一目錄下
    圖像被加載后,就可以在paint()中繪制了
    drawImage(Image img,int x,int y,ImageObserver observer)
    img是上面獲取的圖像, x,y是指定圖像左上角的位置,observer是加載圖像時的圖像觀察器
    Applet類已經實現了ImageObserver接口,所以可以直接使用this作為最后一個參數
    drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
    width和height是要繪制的圖像的寬和高
    可以使用img.getHeight(this)和img.getWidth(this)來獲取被加載的圖像的寬和高
    3、設置Java窗口圖標
    Frame對象可以使用setIconImage(Image img)方法設置左上角圖標,默認圖標是咖啡杯

    Java數據庫連接(JDBC)
    1、JDBC-ODBC橋接器
    建立JDBC-ODBC橋接器
    try
    {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch(ClassNotFoundException e){}
    連接到數據庫
    try
    {
    Connection con=DriverManager.getConnection("jdbcdbc:數據源名稱","數據源的login name",
    "數據源的password");
    }
    catch(SQLException e){}
    向數據庫發送SQL語句
    try
    {
    Statement sql=con.createStatement();
    }
    catch(SQLException e){}
    處理查詢結果
    ResultSet rs=sql.executeQuery("SQL語句");
    第二十四章 Java與多媒體
    1、在小程序中播放聲音
    java可以播放au,aiff,wav,midi,rfm格式的音頻
    可以調用Applet的一個靜態方法:
    newAudioClip(URL url,String name) url是地址,name是音頻名稱
    也可以用Applet類的實例方法:
    getAudioClip(URL url,String name)
    根據url地址和聲音文件name,獲得一個用于播放的音頻對象,這對象可以使用下面的方法來處理聲音:
    play() 播放聲音文件name
    loop() 循環播放name
    stop() 停止播放name
    2、Java媒體框架(JMF)
    創建播放器

    try
    {
    URL url=new URL(getDocumenBase(),視頻文件名稱);
    player player=Manager.createPlayer(url);
    }
    catch(IOException e){}
    向播放器注冊控制監視器
    player.addControllerListener(監視器);
    創建監視器必須使用接口ControllerListener ,該接口中的方法是
    public void controllerUpdate(ControllerEvent e)
    讓播放器對媒體進行預提取
    player.prefetch()
    啟動播放器
    player.start();
    停止播放器
    player.stop();
    停止播放器后必須釋放內存中的資源
    player.deallocate();

    Java Swing基礎
    1、Jcomponent類
    Jcomponent類 是所有輕量組件的父類,主要的子類有:
    JButton 創建按鈕對象,而且可以創建在圖標的按鈕
    JComboBox 創建組合框對象,和Choice相似
    JCheckBox 創建復選框對象
    JFileChooser 創建文件選擇器
    JInternalFrame 創建內部窗體
    JLabel 創建標簽
    JMenu 創建菜單對象
    JMenuBar 創建菜單條對象
    JMenuItem 創建菜單項對象
    JPanel 創建面板對象
    JPasswordField 創建口令文本對象
    JPopupMenu 創建彈出式菜單

    JProgressBar 創建進程條
    JRadioButton 創建單選按鈕
    JScrollBar 創建滾動條
    JScrollPane 創建滾動窗格
    JSlider 創建滾動條
    JSplitPane 創建拆分窗格
    JTable 創建表格
    JTextArea 創建文本區
    JTexPane 創建文本窗格
    JToolBar 創建工具條
    JToolTip 創建工具提示對象
    JTree 創建樹對象
    2、JFrame類
    JFrame類及其子類創建的對象是窗體
    (1)JFrame類及其子類創建的窗體是swing窗體
    (2)不可以把組件直接加到swing窗體中,應該把組件加到內容面板中
    (3)不能為swing窗體設置布局,而應當為內容面板設置布局
    (4)swing窗體通過調用getContentPane()方法得到它的內容面板
    3、JApplet類
    (1)不可以把組件直接添加到小程序容器中,也應該添加到內容面板中
    (2)不能為小程序設置布局
    (3)小程序容器通過調用getContenPane()方法得到內容面板
    4、JDialog類
    (1)不可以把組件直接添加到對話框容器中,也應該添加到內容面板中
    (2)不能為對話框設置布局
    (3)對話框容器通過調用getContenPane()方法得到內容面板
    5、JPanel面板
    JPanel()
    JPanel(布局對象)
    6、滾動窗口JScrollPane
    JScrollPane()
    JScrollPane(component c)
    7、拆分窗口JSplitPane
    JSplitPane(int a,Component b,Component c)
    a的取值是HORIZONTAL_SPLIT或者VERTICAL_SPLIT決定水平拆分還是垂直拆分
    JSplitPane(int a,boolean b ,Component b,Component c) b的取值決定拆分線移動的時候組件是否連續變化
    8、內部窗體JInternalFrame
    JInternalFrame(String title,boolean resizable,booleam closable,boolean max,boolean min)
    參數的意義分別是窗口名稱,是否能調整大小,是否有關閉按鈕,最大化按鈕,最小化按鈕
    (1)不能把組件直接加到窗體中,而是加到內容面板中
    (2)必須先把內部窗體加到一個容器中(JDesktopPane),該容器是專門為內部窗體服務的
    9、按鈕(JButton)
    JButton() 創建按鈕
    JButton(String s) s是按鈕的名字
    JButton(Icon icon) icon是按鈕上的圖標
    JButton(String s,Icon icon)
    getText() 獲取按鈕名字
    getIcon() 獲取按鈕圖標
    setIcon(Icon icon) 設置按鈕圖標
    setHorizontalTextposition(int a) a確定按鈕上圖標的位置,取值:
    AbstractButton_CENTR,AbstractButton_LEFT,AbstractButton_RIGHT
    setVerticalTextposition(int a) a確定按鈕上名字相對圖標的位置,取值:
    AbstractButton.TOP,AbstractButton.BOTTOM,AbstractButton.CENTR
    setMnemonic(char c) 設置按鈕的鍵盤操作方式是字符c(Alt+c)
    setEnabled(boolean b) b決定按鈕是否可以被單擊
    posted @ 2008-05-16 18:43 礦礦 閱讀(4439) | 評論 (1)編輯 收藏
    17.你需要學習企業級JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。

      18.你需要學習如何管理與配置一個J2EE應用程序服務器,如WebLogic,JBoss等,并且利用它的附加服務,例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應用程序并且能夠監控、調整它的性能。

      19.你需要熟悉面向方面的程序設計以及面向屬性的程序設計(這兩個都被很容易混淆的縮寫為AOP),以及他們的主流JAVA規格和執行。例如AspectJ和AspectWerkz。

      20.你需要熟悉對不同有用的API和framework等來為你服務。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。

    21.如果你將要對接或者正和舊的系統或者本地平臺,你需要學習JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。

      22.你需要熟悉JINI技術以及與它相關的分布式系統,比如掌握CROBA。

      23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。

      24.你應該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什么了:)

      25.JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。

      26.你需要熟悉一種單元測試體系(JNunit),并且學習不同的生成、部署工具(Ant,Maven)。

      27.你需要熟悉一些在JAVA開發中經常用到的軟件工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。

      28.你需要能夠深入了解加熟練操作和配置不同的操作系統,比如GNU/linux,sunsolaris,macOS等,做為跨平臺軟件的開發者。

      29.你還需要緊跟java發展的步伐,比如現在可以深入的學習javaME,以及各種java新規范,技術的運用,如新起的web富客戶端技術。

      30.你必需要對opensource有所了解,因為至少java的很多技術直接是靠開源來驅動發展的,如java3D技術。

    posted @ 2008-05-08 15:08 礦礦 閱讀(911) | 評論 (0)編輯 收藏
    17.你需要學習企業級JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。

      18.你需要學習如何管理與配置一個J2EE應用程序服務器,如WebLogic,JBoss等,并且利用它的附加服務,例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應用程序并且能夠監控、調整它的性能。

      19.你需要熟悉面向方面的程序設計以及面向屬性的程序設計(這兩個都被很容易混淆的縮寫為AOP),以及他們的主流JAVA規格和執行。例如AspectJ和AspectWerkz。

      20.你需要熟悉對不同有用的API和framework等來為你服務。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。

    21.如果你將要對接或者正和舊的系統或者本地平臺,你需要學習JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。

      22.你需要熟悉JINI技術以及與它相關的分布式系統,比如掌握CROBA。

      23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。

      24.你應該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什么了:)

      25.JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。

      26.你需要熟悉一種單元測試體系(JNunit),并且學習不同的生成、部署工具(Ant,Maven)。

      27.你需要熟悉一些在JAVA開發中經常用到的軟件工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。

      28.你需要能夠深入了解加熟練操作和配置不同的操作系統,比如GNU/linux,sunsolaris,macOS等,做為跨平臺軟件的開發者。

      29.你還需要緊跟java發展的步伐,比如現在可以深入的學習javaME,以及各種java新規范,技術的運用,如新起的web富客戶端技術。

      30.你必需要對opensource有所了解,因為至少java的很多技術直接是靠開源來驅動發展的,如java3D技術。

    posted @ 2008-05-08 15:08 礦礦 閱讀(1151) | 評論 (3)編輯 收藏
    封裝數據庫操作,目的就是為了隱藏java.sql包內的類,在編碼中去掉核心的數據庫操作代碼。以杜絕直接數據庫操作容易帶來的資源未釋放問題。同時也減少了數據庫操作的編碼量。

      但是很多網友在封裝時,卻喜歡返回結果集(ResultSet對象),那么這個封裝就沒有意義了。

      1. 又是直接操作核心數據庫類,跟封裝前幾乎沒什么變化。

      2. 結果集總是依賴于它使用的連接(Connection)對象。因此當連接對象在方法內被關閉后,你返回的ResultSet就沒有用了。

      如果真的要獲得查詢數據庫的結果集,就把結果集對象內的所有數據,轉儲到以Map為元素的List對象內。

      當然,這種方式,不能適應大數據量的查詢,不過如果真的碰到大數據量的查詢,那用什么封裝都不好,還是得直接數據庫操作. :)))

      下面是簡單的數據庫操作Javabean的代碼

      DbWrapper.java

      import java.sql.*;

      import java.util.*;

      public class DbWrapper

      {

      // 定義連接池對象為靜態變量,將一直存在,直到工作目錄關閉。

      private static DataSource ds = null;

      // 1.用連接池的方式獲得連接

      // 如果不是做多數據庫程序,推薦使用此方法

      // 相關內容:在tomcat管理界面配置連接池

      public static Connection openConnection() throws Exception

      {

      // 只需要初始化1次

      if ( ds == null )

      {

      Context initContext = new InitialContext();

      Context envContext = (Context) initContext.lookup("java:/comp/env");

      DataSource ds = (DataSource) envContext.lookup("jdbc/MyDataSource");

      }

      return ds.getConnection();

      }

      // 2.用jdbc驅動獲得連接

      // 相關內容:JSP數據庫連接大全

      public static Connection openConnection(

      String driver,

      String url,

      String username,

      String password)

      throws Exception

      {

      Class.forName(driver).newInstance();

      return DriverManager.getConnection(url, username, password);

      }

      public static void closeConnection(Connection conn) throws Exception

      {

      if ( conn != null )

      {

      conn.close();

      }

      }

      public static int executeUpdate(String sql) throws Exception

      {

      int count = 0;

      Connection conn = null;

      Statement stmt = null;

      try

      {

      conn = openConnection();

      stmt = conn.createStatement();

      count = stmt.executeUpdate(sql);

      }

      catch ( Exception e )

      {

      throw e;

      }

      finally

      {

      closeConnection(conn);

      }

      return count;

      }

      public static List executeQuery(String sql) throws Exception

      {

      List list = new ArrayList();

      Connection conn = null;

      Statement stmt = null;

      ResultSet rs = null;

      try

      {

      conn = openConnection();

      stmt = conn.createStatement();

      rs = stmt.executeQuery(sql);

      ResultSetMetaData rsmd = rs.getMetaData();

      while ( rs.next() )

      {

      Map map = new HashMap();

      for ( int i = 1; i < = rsmd.getColumnCount(); i++ )

      {

      map.put(rsmd.getColumnName(i), rs.getObject(i));

      }

      list.add(map);

      } }

      catch ( Exception e )

      {

      e.printStackTrace();

      }

      finally

      {

      if ( rs != null ) rs.close();

      closeConnection(conn);

      }

      return list; }

      }

      使用示例:

      // 1.對于insert, update, delete語句int count = DbWrapper.executeUpdate(sql);

      // 2.對于selete語句

      java.util.List list = DbWrapper.executeQuery(sql);

      // 方法一:按名字取值,注意大小寫是嚴格區分的

      for ( int i = 0; i < list.size(); i++ )

      {

      java.util.Map map = (java.util.Map)list.get(i);

      out.println(mag.get("column_name").toString());

      }

      // 方法二:遍歷取值

      for ( int i = 0; i < list.size(); i++ )

      {

      java.util.Map map = (java.util.Map)list.get(i);

      for (java.util.Iterator it = map.keySet().iterator(); it.hasNext();)

      {

      String column_name = it.next().toString()); // 取值時注意null判斷

      out.println(column_name + " = " + map.get(column_name) == null ? "" : map.get(column_name).toString());

      }

      }

    posted @ 2008-05-07 18:52 礦礦 閱讀(134) | 評論 (0)編輯 收藏
    封裝數據庫操作,目的就是為了隱藏java.sql包內的類,在編碼中去掉核心的數據庫操作代碼。以杜絕直接數據庫操作容易帶來的資源未釋放問題。同時也減少了數據庫操作的編碼量。

      但是很多網友在封裝時,卻喜歡返回結果集(ResultSet對象),那么這個封裝就沒有意義了。

      1. 又是直接操作核心數據庫類,跟封裝前幾乎沒什么變化。

      2. 結果集總是依賴于它使用的連接(Connection)對象。因此當連接對象在方法內被關閉后,你返回的ResultSet就沒有用了。

      如果真的要獲得查詢數據庫的結果集,就把結果集對象內的所有數據,轉儲到以Map為元素的List對象內。

      當然,這種方式,不能適應大數據量的查詢,不過如果真的碰到大數據量的查詢,那用什么封裝都不好,還是得直接數據庫操作. :)))

      下面是簡單的數據庫操作Javabean的代碼

      DbWrapper.java

      import java.sql.*;

      import java.util.*;

      public class DbWrapper

      {

      // 定義連接池對象為靜態變量,將一直存在,直到工作目錄關閉。

      private static DataSource ds = null;

      // 1.用連接池的方式獲得連接

      // 如果不是做多數據庫程序,推薦使用此方法

      // 相關內容:在tomcat管理界面配置連接池

      public static Connection openConnection() throws Exception

      {

      // 只需要初始化1次

      if ( ds == null )

      {

      Context initContext = new InitialContext();

      Context envContext = (Context) initContext.lookup("java:/comp/env");

      DataSource ds = (DataSource) envContext.lookup("jdbc/MyDataSource");

      }

      return ds.getConnection();

      }

      // 2.用jdbc驅動獲得連接

      // 相關內容:JSP數據庫連接大全

      public static Connection openConnection(

      String driver,

      String url,

      String username,

      String password)

      throws Exception

      {

      Class.forName(driver).newInstance();

      return DriverManager.getConnection(url, username, password);

      }

      public static void closeConnection(Connection conn) throws Exception

      {

      if ( conn != null )

      {

      conn.close();

      }

      }

      public static int executeUpdate(String sql) throws Exception

      {

      int count = 0;

      Connection conn = null;

      Statement stmt = null;

      try

      {

      conn = openConnection();

      stmt = conn.createStatement();

      count = stmt.executeUpdate(sql);

      }

      catch ( Exception e )

      {

      throw e;

      }

      finally

      {

      closeConnection(conn);

      }

      return count;

      }

      public static List executeQuery(String sql) throws Exception

      {

      List list = new ArrayList();

      Connection conn = null;

      Statement stmt = null;

      ResultSet rs = null;

      try

      {

      conn = openConnection();

      stmt = conn.createStatement();

      rs = stmt.executeQuery(sql);

      ResultSetMetaData rsmd = rs.getMetaData();

      while ( rs.next() )

      {

      Map map = new HashMap();

      for ( int i = 1; i < = rsmd.getColumnCount(); i++ )

      {

      map.put(rsmd.getColumnName(i), rs.getObject(i));

      }

      list.add(map);

      } }

      catch ( Exception e )

      {

      e.printStackTrace();

      }

      finally

      {

      if ( rs != null ) rs.close();

      closeConnection(conn);

      }

      return list; }

      }

      使用示例:

      // 1.對于insert, update, delete語句int count = DbWrapper.executeUpdate(sql);

      // 2.對于selete語句

      java.util.List list = DbWrapper.executeQuery(sql);

      // 方法一:按名字取值,注意大小寫是嚴格區分的

      for ( int i = 0; i < list.size(); i++ )

      {

      java.util.Map map = (java.util.Map)list.get(i);

      out.println(mag.get("column_name").toString());

      }

      // 方法二:遍歷取值

      for ( int i = 0; i < list.size(); i++ )

      {

      java.util.Map map = (java.util.Map)list.get(i);

      for (java.util.Iterator it = map.keySet().iterator(); it.hasNext();)

      {

      String column_name = it.next().toString()); // 取值時注意null判斷

      out.println(column_name + " = " + map.get(column_name) == null ? "" : map.get(column_name).toString());

      }

      }

    posted @ 2008-05-07 18:52 礦礦 閱讀(143) | 評論 (0)編輯 收藏
    XML是eXtensible Markup Language的縮寫。擴展標記語言XML是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據,而這些標記可以用方便的方式建立,雖然XML占用的空間比二進制數據要占用更多的空間,但XML極其簡單易于掌握和使用。

    XML與Access,Oracle和SQL Server等數據庫不同,數據庫提供了更強有力的數據存儲和分析能力,例如:數據索引、排序、查找、相關一致性等,XML僅僅是展示數據。事實上XML與其他數據表現形式最大的不同是:他極其簡單。這是一個看上去有點瑣細的優點,但正是這點使XML與眾不同。

    XML的簡單使其易于在任何應用程序中讀寫數據,這使XML很快成為數據交換的唯一公共語言,雖然不同的應用軟件也支持其它的數據交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺下產生的信息結合,然后可以很容易加載XML數據到程序中并分析他,并以XML格式輸出結果。

    XML的前身是SGML(The Standard Generalized Markup Language),是自IBM從60年代就開始發展的GML(Generalized Markup Language)

    HTML一樣, XML (可擴展標識語言)是通用標識語言標準(SGML)的一個子集,它是描述網絡上的數據內容和結構的標準。盡管如此,XML不象HTML,HTML僅僅提供了在頁面上顯示信息的通用方法(沒有上下文相關和動態功能) ,XML則對數據賦予上下文相關功能,它繼承了SGML的大部分功能,卻使用了不太復雜的技術。.

    為了使得SGML顯得用戶友好,XML重新定義了SGML的一些內部值和參數,去掉了大量的很少用到的功能,這些繁雜的功能使得SGML在設計網站時顯得復雜化。XML保留了SGML的結構化功能,這樣就使得網站設計者可以定義自己的文檔類型,XML同時也推出一種新型文檔類型,使得開發者也可以不必定義文檔類型。

    因為XML是W3C制定的,XML的標準化工作由W3C的XML工作組負責,該小組成員由來自各個地方和行業的專家組成,他們通過email交流對XML標準的意見,并提出自己的看法 (www.w3.org/TR/WD-xml)。因為XML 是個公共格式, (它不專屬于任何一家公司),你不必擔心XML技術會成為少數公司的盈利工具,XML不是一個依附于特定瀏覽器的語言

    XML(可擴展標記語言)是從稱為SGML(標準通用標記語言)的更加古老的語言派生出來的。SGML的主要目的是定義使用標簽來表示數據的標記語言的語法。

    標簽由包圍在一個小于號(<)和一個大于號(>)之間的文本組成,例如<tag>。起始標簽(start tag)表示一個特定區域的開始,例如<start>;結束標簽(end tag)定義了一個區域的結束,除了在小于號之后緊跟著一個斜線(/)外,和起始標簽基本一樣,例如</end>。SGML還定義了標簽的特性(attribute),它們是定義在小于號和大于號之間的值,例如<img src="picture.jpg">中的src特性。如果你覺得它看起來很熟悉的話,應該知道,基于SGML的語言的最著名實現就是原始的HTML。

    SGML常用來定義針對HTML的文檔類型定義(DTD),同時它也常用于編寫XML的DTD。SGML的問題就在于,它允許出現一些奇怪的語法,這讓創建HTML的解析器成為一個大難題:

    1  某些起始標簽不允許出現結束標簽,例如HTML中<img>標簽。包含了結束標簽就會出現錯誤。

    2  某些起始標簽可以選擇性出現結束標簽或者隱含了結束標簽,例如HTML中<p>標簽,當出現另一個<p>標簽或者某些其他標簽時,便假設在這之前有一個結束標簽。

    3  某些起始標簽要求必須出現結束標簽,例如HTML中<script>標簽。

    4  標簽可以以任何順序嵌套。即使結束標簽不按照起始標簽的逆序出現也是允許的,例如,<b>This is a <i> sample </b> string</i>是正確的。

    5  某些特性要求必須包含值,例如<img src="picture.jpg">中的src特性。

    6  某些特性不要求一定有值,例如<td nowrap>中的nowrap特性。

    7  定義特性的兩邊有沒有加上雙引號都是可以的,所以<img src="picture.jpg">和<img src=picture.jpg>都是允許的。

          這些問題使建立一個SGML語言的解析器變成了一項艱巨的任務。判斷何時應用以上規則的困難導致了SGML語言的定義一直停滯不前。以這些問題作為出發點,XML逐漸步入我們的視野。

          XML去掉了之前令許多開發人員頭疼的SGML的隨意語法。在XML中,采用了如下的語法:

    8  任何的起始標簽都必須有一個結束標簽。

    9  可以采用另一種簡化語法,可以在一個標簽中同時表示起始和結束標簽。這種語法是在大于符號之前緊跟一個斜線(/),例如<tag />。XML解析器會將其翻譯成<tag></tag>。

    10  標簽必須按合適的順序進行嵌套,所以結束標簽必須按鏡像順序匹配起始標簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結束標簽看作是數學中的左右括號:在沒有關閉所有的內部括號之前,是不能關閉外面的括號的。

    11  所有的特性都必須有值。

    12  所有的特性都必須在值的周圍加上雙引號。

    這些規則使得開發一個XML解析器要簡便得多,而且也除去了解析SGML中花在判斷何時何地應用那些奇怪語法規則上的工作。僅僅在XML出現后的前六年就衍生出多種不同的語言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時也將HTML改進為XHTML。

    如果需要關于SGML和XML具體技術上的對比,請查看W3C的注解,位于:http://www.w3. org/TR/NOTE-sgml-xml.html

    如今,XML已經是世界上發展最快的技術之一。它的主要目的是使用文本以結構化的方式來表示數據。在某些方面,XML文件也類似于數據庫,提供數據的結構化視圖。這里是一個XML文件的例子:


    每個XML文檔都由XML序言開始,在前面的代碼中的第一行便是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器和瀏覽器,這個文件應該按照前面討論過的XML規則進行解析。第二行代碼,<books>,則是文檔元素(document element),它是文件中最外面的標簽(我們認為元素(element)是起始標簽和結束標簽之間的內容)。所有其他的標簽必須包含在這個標簽之內來組成一個有效的XML文件。XML文件的第二行并不一定要包含文檔元素;如果有注釋或者其他內容,文檔元素可以遲些出現。

    范例文件中的第三行代碼是注釋,你會發現它與HTML中使用的注釋風格是一樣的。這是XML從SGML中繼承的語法元素之一。

    頁面再往下的一些地方,可以發現<desc>標簽里有一些特殊的語法。<![CDATA[ ]]>代碼用于表示無需進行解析的文本,允許諸如大于號和小于號之類的特殊字符包含在文本中,而無需擔心破壞XML的語法。文本必須出現在<![CDATA[和]]>之間才能合適地避免被解析。這樣的文本稱為Character Data Section,簡稱CData Section。

    下面的一行就是在第二本書的定義之前的:

    <?page render multiple authors ?>

    雖然它看上去很像XML序言,但實際上是一種稱為處理指令(processing instruction)的不同類型的語法。處理指令(以下簡稱PI)的目的是為了給處理頁面的程序(例如XML解析器)提供額外的信息。PI通常情況下是沒有固定格式的,唯一的要求是緊隨第一個問號必須至少有一個字母。在此之后,PI可以包含除了小于號和大于號之外的任何字符串序列。

    最常見的PI是用來指定XML文件的樣式表:



    這個PI一般會直接放在XML序言之后,通常由Web瀏覽器使用,來將XML數據以特殊的樣式顯示出來。
    posted @ 2008-05-06 14:09 礦礦 閱讀(283) | 評論 (0)編輯 收藏
    XML是eXtensible Markup Language的縮寫。擴展標記語言XML是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據,而這些標記可以用方便的方式建立,雖然XML占用的空間比二進制數據要占用更多的空間,但XML極其簡單易于掌握和使用。

    XML與Access,Oracle和SQL Server等數據庫不同,數據庫提供了更強有力的數據存儲和分析能力,例如:數據索引、排序、查找、相關一致性等,XML僅僅是展示數據。事實上XML與其他數據表現形式最大的不同是:他極其簡單。這是一個看上去有點瑣細的優點,但正是這點使XML與眾不同。

    XML的簡單使其易于在任何應用程序中讀寫數據,這使XML很快成為數據交換的唯一公共語言,雖然不同的應用軟件也支持其它的數據交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺下產生的信息結合,然后可以很容易加載XML數據到程序中并分析他,并以XML格式輸出結果。

    XML的前身是SGML(The Standard Generalized Markup Language),是自IBM從60年代就開始發展的GML(Generalized Markup Language)

    HTML一樣, XML (可擴展標識語言)是通用標識語言標準(SGML)的一個子集,它是描述網絡上的數據內容和結構的標準。盡管如此,XML不象HTML,HTML僅僅提供了在頁面上顯示信息的通用方法(沒有上下文相關和動態功能) ,XML則對數據賦予上下文相關功能,它繼承了SGML的大部分功能,卻使用了不太復雜的技術。.

    為了使得SGML顯得用戶友好,XML重新定義了SGML的一些內部值和參數,去掉了大量的很少用到的功能,這些繁雜的功能使得SGML在設計網站時顯得復雜化。XML保留了SGML的結構化功能,這樣就使得網站設計者可以定義自己的文檔類型,XML同時也推出一種新型文檔類型,使得開發者也可以不必定義文檔類型。

    因為XML是W3C制定的,XML的標準化工作由W3C的XML工作組負責,該小組成員由來自各個地方和行業的專家組成,他們通過email交流對XML標準的意見,并提出自己的看法 (www.w3.org/TR/WD-xml)。因為XML 是個公共格式, (它不專屬于任何一家公司),你不必擔心XML技術會成為少數公司的盈利工具,XML不是一個依附于特定瀏覽器的語言

    XML(可擴展標記語言)是從稱為SGML(標準通用標記語言)的更加古老的語言派生出來的。SGML的主要目的是定義使用標簽來表示數據的標記語言的語法。

    標簽由包圍在一個小于號(<)和一個大于號(>)之間的文本組成,例如<tag>。起始標簽(start tag)表示一個特定區域的開始,例如<start>;結束標簽(end tag)定義了一個區域的結束,除了在小于號之后緊跟著一個斜線(/)外,和起始標簽基本一樣,例如</end>。SGML還定義了標簽的特性(attribute),它們是定義在小于號和大于號之間的值,例如<img src="picture.jpg">中的src特性。如果你覺得它看起來很熟悉的話,應該知道,基于SGML的語言的最著名實現就是原始的HTML。

    SGML常用來定義針對HTML的文檔類型定義(DTD),同時它也常用于編寫XML的DTD。SGML的問題就在于,它允許出現一些奇怪的語法,這讓創建HTML的解析器成為一個大難題:

    1  某些起始標簽不允許出現結束標簽,例如HTML中<img>標簽。包含了結束標簽就會出現錯誤。

    2  某些起始標簽可以選擇性出現結束標簽或者隱含了結束標簽,例如HTML中<p>標簽,當出現另一個<p>標簽或者某些其他標簽時,便假設在這之前有一個結束標簽。

    3  某些起始標簽要求必須出現結束標簽,例如HTML中<script>標簽。

    4  標簽可以以任何順序嵌套。即使結束標簽不按照起始標簽的逆序出現也是允許的,例如,<b>This is a <i> sample </b> string</i>是正確的。

    5  某些特性要求必須包含值,例如<img src="picture.jpg">中的src特性。

    6  某些特性不要求一定有值,例如<td nowrap>中的nowrap特性。

    7  定義特性的兩邊有沒有加上雙引號都是可以的,所以<img src="picture.jpg">和<img src=picture.jpg>都是允許的。

          這些問題使建立一個SGML語言的解析器變成了一項艱巨的任務。判斷何時應用以上規則的困難導致了SGML語言的定義一直停滯不前。以這些問題作為出發點,XML逐漸步入我們的視野。

          XML去掉了之前令許多開發人員頭疼的SGML的隨意語法。在XML中,采用了如下的語法:

    8  任何的起始標簽都必須有一個結束標簽。

    9  可以采用另一種簡化語法,可以在一個標簽中同時表示起始和結束標簽。這種語法是在大于符號之前緊跟一個斜線(/),例如<tag />。XML解析器會將其翻譯成<tag></tag>。

    10  標簽必須按合適的順序進行嵌套,所以結束標簽必須按鏡像順序匹配起始標簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結束標簽看作是數學中的左右括號:在沒有關閉所有的內部括號之前,是不能關閉外面的括號的。

    11  所有的特性都必須有值。

    12  所有的特性都必須在值的周圍加上雙引號。

    這些規則使得開發一個XML解析器要簡便得多,而且也除去了解析SGML中花在判斷何時何地應用那些奇怪語法規則上的工作。僅僅在XML出現后的前六年就衍生出多種不同的語言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時也將HTML改進為XHTML。

    如果需要關于SGML和XML具體技術上的對比,請查看W3C的注解,位于:http://www.w3. org/TR/NOTE-sgml-xml.html

    如今,XML已經是世界上發展最快的技術之一。它的主要目的是使用文本以結構化的方式來表示數據。在某些方面,XML文件也類似于數據庫,提供數據的結構化視圖。這里是一個XML文件的例子:


    每個XML文檔都由XML序言開始,在前面的代碼中的第一行便是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器和瀏覽器,這個文件應該按照前面討論過的XML規則進行解析。第二行代碼,<books>,則是文檔元素(document element),它是文件中最外面的標簽(我們認為元素(element)是起始標簽和結束標簽之間的內容)。所有其他的標簽必須包含在這個標簽之內來組成一個有效的XML文件。XML文件的第二行并不一定要包含文檔元素;如果有注釋或者其他內容,文檔元素可以遲些出現。

    范例文件中的第三行代碼是注釋,你會發現它與HTML中使用的注釋風格是一樣的。這是XML從SGML中繼承的語法元素之一。

    頁面再往下的一些地方,可以發現<desc>標簽里有一些特殊的語法。<![CDATA[ ]]>代碼用于表示無需進行解析的文本,允許諸如大于號和小于號之類的特殊字符包含在文本中,而無需擔心破壞XML的語法。文本必須出現在<![CDATA[和]]>之間才能合適地避免被解析。這樣的文本稱為Character Data Section,簡稱CData Section。

    下面的一行就是在第二本書的定義之前的:

    <?page render multiple authors ?>

    雖然它看上去很像XML序言,但實際上是一種稱為處理指令(processing instruction)的不同類型的語法。處理指令(以下簡稱PI)的目的是為了給處理頁面的程序(例如XML解析器)提供額外的信息。PI通常情況下是沒有固定格式的,唯一的要求是緊隨第一個問號必須至少有一個字母。在此之后,PI可以包含除了小于號和大于號之外的任何字符串序列。

    最常見的PI是用來指定XML文件的樣式表:



    這個PI一般會直接放在XML序言之后,通常由Web瀏覽器使用,來將XML數據以特殊的樣式顯示出來。
    posted @ 2008-05-06 14:09 礦礦 閱讀(273) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 青青草国产免费久久久下载| 韩国二级毛片免费播放| 亚洲久本草在线中文字幕| 一级毛片成人免费看免费不卡| 免费jjzz在在线播放国产| 中文在线免费观看| 亚洲国产视频一区| 曰曰鲁夜夜免费播放视频| 狠狠入ady亚洲精品| 亚洲大尺度无码专区尤物| 中文字幕av无码无卡免费| 国产97视频人人做人人爱免费| 亚洲一区二区三区免费| 亚洲一区二区在线免费观看| 国产精品白浆在线观看免费| 亚洲成av人片在线观看无码不卡| 国产高清在线精品免费软件 | 亚洲一级免费毛片| 黄色网址在线免费观看| 亚洲免费在线视频播放| 国产亚洲精品AA片在线观看不加载 | av无码国产在线看免费网站| 亚洲国产最大av| 国产亚洲精品看片在线观看| 伊伊人成亚洲综合人网7777| 宅男666在线永久免费观看| 成人免费观看一区二区| 中文字幕无码免费久久99| 国产美女被遭强高潮免费网站| 国产91色综合久久免费| 免费看a级黄色片| 亚洲日韩VA无码中文字幕| 亚洲va久久久噜噜噜久久| 亚洲а∨天堂久久精品| 久久精品女人天堂AV免费观看| 污网站在线观看免费| 亚洲无线码在线一区观看| 又粗又硬又黄又爽的免费视频| 99视频在线精品免费观看6| 国产高清免费观看| 国产亚洲人成无码网在线观看 |