
2008年5月6日
“補(bǔ)充說(shuō)明”通常是在求職簡(jiǎn)歷的結(jié)束部分,可以填寫(xiě),也可以空著。不過(guò),如果能夠善于利用它,求職成功率將會(huì)大大提高。畢竟,作為求職簡(jiǎn)歷的最后部分,它是表現(xiàn)自我的最后機(jī)會(huì)。
在“補(bǔ)充說(shuō)明”中填寫(xiě)的最佳信息因人而異,這取決于求職者的職業(yè)目標(biāo)和背景。請(qǐng)記住,求職簡(jiǎn)歷是自我營(yíng)銷(xiāo)的手段,其中的信息應(yīng)當(dāng)有助于向用人單位推銷(xiāo)自己,以實(shí)現(xiàn)自己的職業(yè)目標(biāo)。可以這樣考慮問(wèn)題:如果這是向潛在的用人單位推銷(xiāo)自己的最會(huì)機(jī)會(huì),你會(huì)說(shuō)些什么?
以下是一些填寫(xiě)“補(bǔ)充說(shuō)明”的思路,供大家參考:
能力或業(yè)績(jī)總結(jié)
在補(bǔ)充說(shuō)明對(duì)自己的能力和職業(yè)生涯進(jìn)行總結(jié)。在能力或業(yè)績(jī)總結(jié)中要突出自己主要的“賣(mài)點(diǎn)”和成功案例——這一切都應(yīng)當(dāng)與你想要應(yīng)聘的職位有關(guān)系。
獲獎(jiǎng)情況
用列舉自己的獲獎(jiǎng)情況作為求職簡(jiǎn)歷的結(jié)束,會(huì)給用人單位留下深刻印象。
證明書(shū)或推薦信
你是否收到過(guò)對(duì)于你的工作情況表示滿(mǎn)意的推薦信或業(yè)績(jī)?cè)u(píng)估證明?如果有,可以摘選其中的精采部分作為“補(bǔ)充說(shuō)明”。
發(fā)表作品
如果在報(bào)刊、雜志上發(fā)表過(guò)作品,可以考慮在“補(bǔ)充說(shuō)明”里羅列出來(lái)。
專(zhuān)利
如果擁有專(zhuān)利(包括正在申請(qǐng)的),請(qǐng)?jiān)?#8220;補(bǔ)充說(shuō)明”中列出。
演講能力
許多職位要有演講能力才能勝任。列舉自己參加過(guò)的演講、主題發(fā)言會(huì)給用人單位留下好印象。
計(jì)算機(jī)運(yùn)用技能
在“補(bǔ)充說(shuō)明”中列舉自己在計(jì)算機(jī)操作系統(tǒng)、網(wǎng)絡(luò)和硬件等方面的技能,多多益善。
培訓(xùn)情況
在“補(bǔ)充說(shuō)明”中列出自己參加過(guò)的專(zhuān)業(yè)
培訓(xùn)和繼續(xù)教育。
再次強(qiáng)調(diào)工作地點(diǎn)
在“補(bǔ)充說(shuō)明”中再次強(qiáng)調(diào)工作地點(diǎn)不失為結(jié)束求職簡(jiǎn)歷的好辦法。
說(shuō)明自己愿意出差
如果愿意出差,可以在補(bǔ)充說(shuō)明中加以說(shuō)明,用人單位或許會(huì)因?yàn)檫@一點(diǎn)而看上你。
應(yīng)該省略的內(nèi)容
補(bǔ)充說(shuō)明不要涉及婚姻狀況、年齡、有多少個(gè)孩子等情況,如果興趣愛(ài)好與工作無(wú)關(guān),最好也不要提及。
來(lái)源:
中華英才網(wǎng)
下表是元字符及其在正則表達(dá)式上下文中的行為的一個(gè)完整列表:
字符 描述
將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)后向引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個(gè)換行符。序列 '\' 匹配 "" 而 "\(" 則匹配 "("。
^
匹配輸入字符串的開(kāi)始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$
匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*
匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等價(jià)于{0,}。[/size]
+
匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
?
匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價(jià)于 {0,1}。
{n}
n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
{n,}
n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
{n,m}
m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。劉, "o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
?
當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串 "oooo",'o+?' 將匹配單個(gè) "o",而 'o+' 將匹配所有 'o'。
.
匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 '\n' 在內(nèi)的任何字符,請(qǐng)使用象 '[.\n]' 的模式。
(pattern)
匹配pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 {CONTENT}… 屬性。要匹配圓括號(hào)字符,請(qǐng)使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不獲取匹配結(jié)果,也就是說(shuō)這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。這在使用 "或" 字符 (|) 來(lái)組合一個(gè)模式的各個(gè)部分是很有用。例如, 'industr(?:y|ies) 就是一個(gè)比 'industry|industries' 更簡(jiǎn)略的表達(dá)式。
(?=pattern)
正向預(yù)查,在任何匹配 pattern 的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說(shuō),該匹配不需要獲取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。
(?!pattern)
負(fù)向預(yù)查,在任何不匹配N(xiāo)egative lookahead matches the search string at any point where a string not matching pattern 的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說(shuō),該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一個(gè)字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
負(fù)值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字符范圍。匹配指定范圍內(nèi)的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫(xiě)字母字符。
[^a-z]
負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符。
\b
匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx
匹配由x指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車(chē)符。 x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
\d
匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。
\D
匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。
\f
匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL。
\n
匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。
\r
匹配一個(gè)回車(chē)符。等價(jià)于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。
\S
匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
\t
匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。
\v
匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。
\w
匹配包括下劃線(xiàn)的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'。
\W
匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'。
\xn
匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如, '\x41' 匹配 "A"。'\x041' 則等價(jià)于 '\x04' & "1"。正則表達(dá)式中可以使用 ASCII 編碼。.
\num
匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,'(.)' 匹配兩個(gè)連續(xù)的相同字符。
\n
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 \n 之前至少 n 個(gè)獲取的子表達(dá)式,則 n 為后向引用。否則,如果 n 為八進(jìn)制數(shù)字 (0-7),則 n 為一個(gè)八進(jìn)制轉(zhuǎn)義值。
\nm
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 \nm 之前至少有is preceded by at least nm 個(gè)獲取得子表達(dá)式,則 nm 為后向引用。如果 \nm 之前至少有 n 個(gè)獲取,則 n 為一個(gè)后跟文字 m 的后向引用。如果前面的條件都不滿(mǎn)足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 \nm 將匹配八進(jìn)制轉(zhuǎn)義值 nm。
\nml
如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字 (0-7),則匹配八進(jìn)制轉(zhuǎn)義值 nml。
\un
匹配 n,其中 n 是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的 Unicode 字符。例如,\u00A9 匹配版權(quán)符號(hào) (?)。
匹配中文字符的正則表達(dá)式: [u4e00-u9fa5]
評(píng)注:匹配中文還真是個(gè)頭疼的事,有了這個(gè)表達(dá)式就好辦了
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^x00-xff]
評(píng)注:可以用來(lái)計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
匹配空白行的正則表達(dá)式:ns*r
評(píng)注:可以用來(lái)刪除空白行
匹配HTML標(biāo)記的正則表達(dá)式:<(S*?)[^>]*>.*?|<.*? />
評(píng)注:網(wǎng)上流傳的版本太糟糕,上面這個(gè)也僅僅能匹配部分,對(duì)于復(fù)雜的嵌套標(biāo)記依舊無(wú)能為力
匹配首尾空白字符的正則表達(dá)式:^s*|s*$
評(píng)注:可以用來(lái)刪除行首行尾的空白字符(包括空格、制表符、換頁(yè)符等等),非常有用的表達(dá)式
匹配Email地址的正則表達(dá)式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
評(píng)注:表單驗(yàn)證時(shí)很實(shí)用
匹配網(wǎng)址URL的正則表達(dá)式:[a-zA-z]+://[^s]*
評(píng)注:網(wǎng)上流傳的版本功能很有限,上面這個(gè)基本可以滿(mǎn)足需求
匹配帳號(hào)是否合法(字母開(kāi)頭,允許5-16字節(jié),允許字母數(shù)字下劃線(xiàn)):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評(píng)注:表單驗(yàn)證時(shí)很實(shí)用
匹配國(guó)內(nèi)電話(huà)號(hào)碼:d{3}-d{8}|d{4}-d{7}
評(píng)注:匹配形式如 0511-4405222 或 021-87888822
匹配騰訊QQ號(hào):[1-9][0-9]{4,}
評(píng)注:騰訊QQ號(hào)從10000開(kāi)始
匹配中國(guó)郵政編碼:[1-9]d{5}(?!d)
評(píng)注:中國(guó)郵政編碼為6位數(shù)字
匹配身份證:d{15}|d{18}
評(píng)注:中國(guó)的身份證為15位或18位
匹配ip地址:d+.d+.d+.d+
評(píng)注:提取ip地址時(shí)有用
匹配特定數(shù)字:
^[1-9]d*$ //匹配正整數(shù)
^-[1-9]d*$ //匹配負(fù)整數(shù)
^-?[1-9]d*$ //匹配整數(shù)
^[1-9]d*|0$ //匹配非負(fù)整數(shù)(正整數(shù) + 0)
^-[1-9]d*|0$ //匹配非正整數(shù)(負(fù)整數(shù) + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮點(diǎn)數(shù)
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配負(fù)浮點(diǎn)數(shù)
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮點(diǎn)數(shù)
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)
評(píng)注:處理大量數(shù)據(jù)時(shí)有用,具體應(yīng)用時(shí)注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26個(gè)英文字母組成的字符串
^[A-Z]+$ //匹配由26個(gè)英文字母的大寫(xiě)組成的字符串
^[a-z]+$ //匹配由26個(gè)英文字母的小寫(xiě)組成的字符串
^[A-Za-z0-9]+$ //匹配由數(shù)字和26個(gè)英文字母組成的字符串
^w+$ //匹配由數(shù)字、26個(gè)英文字母或者下劃線(xiàn)組成的字符串
在使用RegularExpressionValidator驗(yàn)證控件時(shí)的驗(yàn)證功能及其驗(yàn)證表達(dá)式介紹如下:
只能輸入數(shù)字:“^[0-9]*$”
只能輸入n位的數(shù)字:“^d{n}$”
只能輸入至少n位數(shù)字:“^d{n,}$”
只能輸入m-n位的數(shù)字:“^d{m,n}$”
只能輸入零和非零開(kāi)頭的數(shù)字:“^(0|[1-9][0-9]*)$”
只能輸入有兩位小數(shù)的正實(shí)數(shù):“^[0-9]+(.[0-9]{2})?$”
只能輸入有1-3位小數(shù)的正實(shí)數(shù):“^[0-9]+(.[0-9]{1,3})?$”
只能輸入非零的正整數(shù):“^+?[1-9][0-9]*$”
只能輸入非零的負(fù)整數(shù):“^-[1-9][0-9]*$”
只能輸入長(zhǎng)度為3的字符:“^.{3}$”
只能輸入由26個(gè)英文字母組成的字符串:“^[A-Za-z]+$”
只能輸入由26個(gè)大寫(xiě)英文字母組成的字符串:“^[A-Z]+$”
只能輸入由26個(gè)小寫(xiě)英文字母組成的字符串:“^[a-z]+$”
只能輸入由數(shù)字和26個(gè)英文字母組成的字符串:“^[A-Za-z0-9]+$”
只能輸入由數(shù)字、26個(gè)英文字母或者下劃線(xiàn)組成的字符串:“^w+$”
驗(yàn)證用戶(hù)密碼:“^[a-zA-Z]w{5,17}$”正確格式為:以字母開(kāi)頭,長(zhǎng)度在6-18之間,
只能包含字符、數(shù)字和下劃線(xiàn)。
驗(yàn)證是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+”
只能輸入漢字:“^[u4e00-u9fa5],{0,}$”
驗(yàn)證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
驗(yàn)證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
驗(yàn)證電話(huà)號(hào)碼:“^((d{3,4})|d{3,4}-)?d{7,8}$”
正確格式為:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,
“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
驗(yàn)證身份證號(hào)(15位或18位數(shù)字):“^d{15}|d{}18$”
驗(yàn)證一年的12個(gè)月:“^(0?[1-9]|1[0-2])$”正確格式為:“01”-“09”和“1”“12”
驗(yàn)證一個(gè)月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”
正確格式為:“01”“09”和“1”“31”。
匹配中文字符的正則表達(dá)式: [u4e00-u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^x00-xff]
匹配空行的正則表達(dá)式:n[s| ]*r
匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*</1>|<(.*) />/
匹配首尾空格的正則表達(dá)式:(^s*)|(s*$)
匹配Email地址的正則表達(dá)式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配網(wǎng)址URL的正則表達(dá)式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
(1)應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}
(2)應(yīng)用:javascript中沒(méi)有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來(lái)實(shí)現(xiàn)
String.prototype.trim = function()
{
return this.replace(/(^s*)|(s*$)/g, "");
}
(3)應(yīng)用:利用正則表達(dá)式分解和轉(zhuǎn)換IP地址
function IP2V(ip) //IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值
{
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達(dá)式
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)應(yīng)用:從URL地址中提取文件名的javascript程序
s="http://www.9499.net/page1.htm";
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
(5)應(yīng)用:利用正則表達(dá)式限制網(wǎng)頁(yè)表單里的文本框輸入內(nèi)容
用正則表達(dá)式限制只能輸入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用正則表達(dá)式限制只能輸入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''
[轉(zhuǎn)]自天極網(wǎng)
1使用不帶參數(shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用不帶參數(shù)的存儲(chǔ)過(guò)程時(shí),必須使用 call SQL 轉(zhuǎn)義序列。不帶參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name} |
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程:
以下是引用片段:
CREATE PROCEDURE GetContactFormalNames
AS
BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
FROM Person.Contact
END |
此存儲(chǔ)過(guò)程返回單個(gè)結(jié)果集,其中包含一列數(shù)據(jù)(由 Person.Contact 表中前十個(gè)聯(lián)系人的稱(chēng)呼、名稱(chēng)和姓氏組成)。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 executeQuery 方法調(diào)用 GetContactFormalNames 存儲(chǔ)過(guò)程。
以下是引用片段:
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使用帶有輸入?yún)?shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用帶參數(shù)的存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 IN 參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定 IN 參數(shù)。此字符充當(dāng)要傳遞給該存儲(chǔ)過(guò)程的參數(shù)值的占位符。可以使用 SQLServerPreparedStatement 類(lèi)的 setter 方法之一為參數(shù)指定值。可使用的 setter 方法由 IN 參數(shù)的數(shù)據(jù)類(lèi)型決定。
向 setter 方法傳遞值時(shí),不僅需要指定要在參數(shù)中使用的實(shí)際值,還必須指定參數(shù)在存儲(chǔ)過(guò)程中的序數(shù)位置。例如,如果存儲(chǔ)過(guò)程包含單個(gè) IN 參數(shù),則其序數(shù)值為 1。如果存儲(chǔ)過(guò)程包含兩個(gè)參數(shù),則第一個(gè)序數(shù)值為 1,第二個(gè)序數(shù)值為 2。
作為如何調(diào)用包含 IN 參數(shù)的存儲(chǔ)過(guò)程的實(shí)例,使用 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中的 uspGetEmployeeManagers 存儲(chǔ)過(guò)程。此存儲(chǔ)過(guò)程接受名為 EmployeeID 的單個(gè)輸入?yún)?shù)(它是一個(gè)整數(shù)值),然后基于指定的 EmployeeID 返回雇員及其經(jīng)理的遞歸列表。下面是調(diào)用此存儲(chǔ)過(guò)程的 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使用帶有輸出參數(shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用此類(lèi)存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 OUT 參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定 OUT 參數(shù)。此字符充當(dāng)要從該存儲(chǔ)過(guò)程返回的參數(shù)值的占位符。要為 OUT 參數(shù)指定值,必須在運(yùn)行存儲(chǔ)過(guò)程前使用 SQLServerCallableStatement 類(lèi)的 registerOutParameter 方法指定各參數(shù)的數(shù)據(jù)類(lèi)型。
使用 registerOutParameter 方法為 OUT 參數(shù)指定的值必須是 java.sql.Types 所包含的 JDBC 數(shù)據(jù)類(lèi)型之一,而它又被映射成本地 SQL Server 數(shù)據(jù)類(lèi)型之一。有關(guān) JDBC 和 SQL Server 數(shù)據(jù)類(lèi)型的詳細(xì)信息,請(qǐng)參閱了解 JDBC 驅(qū)動(dòng)程序數(shù)據(jù)類(lèi)型。
當(dāng)您對(duì)于 OUT 參數(shù)向 registerOutParameter 方法傳遞一個(gè)值時(shí),不僅必須指定要用于此參數(shù)的數(shù)據(jù)類(lèi)型,而且必須在存儲(chǔ)過(guò)程中指定此參數(shù)的序號(hào)位置或此參數(shù)的名稱(chēng)。例如,如果存儲(chǔ)過(guò)程包含單個(gè) OUT 參數(shù),則其序數(shù)值為 1;如果存儲(chǔ)過(guò)程包含兩個(gè)參數(shù),則第一個(gè)序數(shù)值為 1,第二個(gè)序數(shù)值為 2。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程: 根據(jù)指定的整數(shù) IN 參數(shù) (employeeID),該存儲(chǔ)過(guò)程也返回單個(gè)整數(shù) OUT 參數(shù) (managerID)。根據(jù) HumanResources.Employee 表中包含的 EmployeeID,OUT 參數(shù)中返回的值為 ManagerID。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 execute 方法調(diào)用 GetImmediateManager 存儲(chǔ)過(guò)程:
以下是引用片段:
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();
}
} |
本示例使用序號(hào)位置來(lái)標(biāo)識(shí)參數(shù)。或者,也可以使用參數(shù)的名稱(chēng)(而非其序號(hào)位置)來(lái)標(biāo)識(shí)此參數(shù)。下面的代碼示例修改了上一個(gè)示例,以說(shuō)明如何在 Java 應(yīng)用程序中使用命名參數(shù)。請(qǐng)注意,這些參數(shù)名稱(chēng)對(duì)應(yīng)于存儲(chǔ)過(guò)程的定義中的參數(shù)名稱(chēng):
CREATE PROCEDURE GetImmediateManager
以下是引用片段:
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END |
存儲(chǔ)過(guò)程可能返回更新計(jì)數(shù)和多個(gè)結(jié)果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規(guī)范,此規(guī)范規(guī)定在檢索 OUT 參數(shù)之前應(yīng)檢索多個(gè)結(jié)果集和更新計(jì)數(shù)。也就是說(shuō),應(yīng)用程序應(yīng)先檢索所有 ResultSet 對(duì)象和更新計(jì)數(shù),然后使用 CallableStatement.getter 方法檢索 OUT 參數(shù)。否則,當(dāng)檢索 OUT 參數(shù)時(shí),尚未檢索的 ResultSet 對(duì)象和更新計(jì)數(shù)將丟失。
4 使用帶有返回狀態(tài)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用這種存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。返回狀態(tài)參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{[?=]call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定返回狀態(tài)參數(shù)。此字符充當(dāng)要從該存儲(chǔ)過(guò)程返回的參數(shù)值的占位符。要為返回狀態(tài)參數(shù)指定值,必須在執(zhí)行存儲(chǔ)過(guò)程前使用 SQLServerCallableStatement 類(lèi)的 registerOutParameter 方法指定參數(shù)的數(shù)據(jù)類(lèi)型。
此外,向 registerOutParameter 方法傳遞返回狀態(tài)參數(shù)值時(shí),不僅需要指定要使用的參數(shù)的數(shù)據(jù)類(lèi)型,還必須指定參數(shù)在存儲(chǔ)過(guò)程中的序數(shù)位置。對(duì)于返回狀態(tài)參數(shù),其序數(shù)位置始終為 1,這是因?yàn)樗冀K是調(diào)用存儲(chǔ)過(guò)程時(shí)的第一個(gè)參數(shù)。盡管 SQLServerCallableStatement 類(lèi)支持使用參數(shù)的名稱(chēng)來(lái)指示特定參數(shù),但您只能對(duì)返回狀態(tài)參數(shù)使用參數(shù)的序號(hào)位置編號(hào)。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程:
以下是引用片段:
CREATE PROCEDURE CheckContactCity
(@cityName CHAR(50))
AS
BEGIN
IF ((SELECT COUNT(*)
FROM Person.Address
WHERE City = @cityName) > 1)
RETURN 1
ELSE
RETURN 0
END |
該存儲(chǔ)過(guò)程返回狀態(tài)值 1 或 0,這取決于是否能在表 Person.Address 中找到 cityName 參數(shù)指定的城市。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 execute 方法調(diào)用 CheckContactCity 存儲(chǔ)過(guò)程:
以下是引用片段:
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 使用帶有更新計(jì)數(shù)的存儲(chǔ)過(guò)程
使用 SQLServerCallableStatement 類(lèi)構(gòu)建對(duì)存儲(chǔ)過(guò)程的調(diào)用之后,可以使用 execute 或 executeUpdate 方法中的任意一個(gè)來(lái)調(diào)用此存儲(chǔ)過(guò)程。executeUpdate 方法將返回一個(gè) int 值,該值包含受此存儲(chǔ)過(guò)程影響的行數(shù),但 execute 方法不返回此值。如果使用 execute 方法,并且希望獲得受影響的行數(shù)計(jì)數(shù),則可以在運(yùn)行存儲(chǔ)過(guò)程后調(diào)用 getUpdateCount 方法。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下表和存儲(chǔ)過(guò)程:
以下是引用片段:
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; |
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,并使用 execute 方法調(diào)用 UpdateTestTable 存儲(chǔ)過(guò)程,然后使用 getUpdateCount 方法返回受存儲(chǔ)過(guò)程影響的行計(jì)數(shù)。
以下是引用片段:
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();
}
} |
[轉(zhuǎn)]自天極網(wǎng)
1使用不帶參數(shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用不帶參數(shù)的存儲(chǔ)過(guò)程時(shí),必須使用 call SQL 轉(zhuǎn)義序列。不帶參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name} |
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程:
以下是引用片段:
CREATE PROCEDURE GetContactFormalNames
AS
BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
FROM Person.Contact
END |
此存儲(chǔ)過(guò)程返回單個(gè)結(jié)果集,其中包含一列數(shù)據(jù)(由 Person.Contact 表中前十個(gè)聯(lián)系人的稱(chēng)呼、名稱(chēng)和姓氏組成)。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 executeQuery 方法調(diào)用 GetContactFormalNames 存儲(chǔ)過(guò)程。
以下是引用片段:
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使用帶有輸入?yún)?shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用帶參數(shù)的存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 IN 參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定 IN 參數(shù)。此字符充當(dāng)要傳遞給該存儲(chǔ)過(guò)程的參數(shù)值的占位符。可以使用 SQLServerPreparedStatement 類(lèi)的 setter 方法之一為參數(shù)指定值。可使用的 setter 方法由 IN 參數(shù)的數(shù)據(jù)類(lèi)型決定。
向 setter 方法傳遞值時(shí),不僅需要指定要在參數(shù)中使用的實(shí)際值,還必須指定參數(shù)在存儲(chǔ)過(guò)程中的序數(shù)位置。例如,如果存儲(chǔ)過(guò)程包含單個(gè) IN 參數(shù),則其序數(shù)值為 1。如果存儲(chǔ)過(guò)程包含兩個(gè)參數(shù),則第一個(gè)序數(shù)值為 1,第二個(gè)序數(shù)值為 2。
作為如何調(diào)用包含 IN 參數(shù)的存儲(chǔ)過(guò)程的實(shí)例,使用 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中的 uspGetEmployeeManagers 存儲(chǔ)過(guò)程。此存儲(chǔ)過(guò)程接受名為 EmployeeID 的單個(gè)輸入?yún)?shù)(它是一個(gè)整數(shù)值),然后基于指定的 EmployeeID 返回雇員及其經(jīng)理的遞歸列表。下面是調(diào)用此存儲(chǔ)過(guò)程的 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使用帶有輸出參數(shù)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用此類(lèi)存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 OUT 參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定 OUT 參數(shù)。此字符充當(dāng)要從該存儲(chǔ)過(guò)程返回的參數(shù)值的占位符。要為 OUT 參數(shù)指定值,必須在運(yùn)行存儲(chǔ)過(guò)程前使用 SQLServerCallableStatement 類(lèi)的 registerOutParameter 方法指定各參數(shù)的數(shù)據(jù)類(lèi)型。
使用 registerOutParameter 方法為 OUT 參數(shù)指定的值必須是 java.sql.Types 所包含的 JDBC 數(shù)據(jù)類(lèi)型之一,而它又被映射成本地 SQL Server 數(shù)據(jù)類(lèi)型之一。有關(guān) JDBC 和 SQL Server 數(shù)據(jù)類(lèi)型的詳細(xì)信息,請(qǐng)參閱了解 JDBC 驅(qū)動(dòng)程序數(shù)據(jù)類(lèi)型。
當(dāng)您對(duì)于 OUT 參數(shù)向 registerOutParameter 方法傳遞一個(gè)值時(shí),不僅必須指定要用于此參數(shù)的數(shù)據(jù)類(lèi)型,而且必須在存儲(chǔ)過(guò)程中指定此參數(shù)的序號(hào)位置或此參數(shù)的名稱(chēng)。例如,如果存儲(chǔ)過(guò)程包含單個(gè) OUT 參數(shù),則其序數(shù)值為 1;如果存儲(chǔ)過(guò)程包含兩個(gè)參數(shù),則第一個(gè)序數(shù)值為 1,第二個(gè)序數(shù)值為 2。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程: 根據(jù)指定的整數(shù) IN 參數(shù) (employeeID),該存儲(chǔ)過(guò)程也返回單個(gè)整數(shù) OUT 參數(shù) (managerID)。根據(jù) HumanResources.Employee 表中包含的 EmployeeID,OUT 參數(shù)中返回的值為 ManagerID。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 execute 方法調(diào)用 GetImmediateManager 存儲(chǔ)過(guò)程:
以下是引用片段:
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();
}
} |
本示例使用序號(hào)位置來(lái)標(biāo)識(shí)參數(shù)。或者,也可以使用參數(shù)的名稱(chēng)(而非其序號(hào)位置)來(lái)標(biāo)識(shí)此參數(shù)。下面的代碼示例修改了上一個(gè)示例,以說(shuō)明如何在 Java 應(yīng)用程序中使用命名參數(shù)。請(qǐng)注意,這些參數(shù)名稱(chēng)對(duì)應(yīng)于存儲(chǔ)過(guò)程的定義中的參數(shù)名稱(chēng):
CREATE PROCEDURE GetImmediateManager
以下是引用片段:
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END |
存儲(chǔ)過(guò)程可能返回更新計(jì)數(shù)和多個(gè)結(jié)果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規(guī)范,此規(guī)范規(guī)定在檢索 OUT 參數(shù)之前應(yīng)檢索多個(gè)結(jié)果集和更新計(jì)數(shù)。也就是說(shuō),應(yīng)用程序應(yīng)先檢索所有 ResultSet 對(duì)象和更新計(jì)數(shù),然后使用 CallableStatement.getter 方法檢索 OUT 參數(shù)。否則,當(dāng)檢索 OUT 參數(shù)時(shí),尚未檢索的 ResultSet 對(duì)象和更新計(jì)數(shù)將丟失。
4 使用帶有返回狀態(tài)的存儲(chǔ)過(guò)程
使用 JDBC 驅(qū)動(dòng)程序調(diào)用這種存儲(chǔ)過(guò)程時(shí),必須結(jié)合 SQLServerConnection 類(lèi)的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。返回狀態(tài)參數(shù)的 call 轉(zhuǎn)義序列的語(yǔ)法如下所示:
以下是引用片段:
{[?=]call procedure-name[([parameter][,[parameter]]...)]} |
構(gòu)造 call 轉(zhuǎn)義序列時(shí),請(qǐng)使用 ?(問(wèn)號(hào))字符來(lái)指定返回狀態(tài)參數(shù)。此字符充當(dāng)要從該存儲(chǔ)過(guò)程返回的參數(shù)值的占位符。要為返回狀態(tài)參數(shù)指定值,必須在執(zhí)行存儲(chǔ)過(guò)程前使用 SQLServerCallableStatement 類(lèi)的 registerOutParameter 方法指定參數(shù)的數(shù)據(jù)類(lèi)型。
此外,向 registerOutParameter 方法傳遞返回狀態(tài)參數(shù)值時(shí),不僅需要指定要使用的參數(shù)的數(shù)據(jù)類(lèi)型,還必須指定參數(shù)在存儲(chǔ)過(guò)程中的序數(shù)位置。對(duì)于返回狀態(tài)參數(shù),其序數(shù)位置始終為 1,這是因?yàn)樗冀K是調(diào)用存儲(chǔ)過(guò)程時(shí)的第一個(gè)參數(shù)。盡管 SQLServerCallableStatement 類(lèi)支持使用參數(shù)的名稱(chēng)來(lái)指示特定參數(shù),但您只能對(duì)返回狀態(tài)參數(shù)使用參數(shù)的序號(hào)位置編號(hào)。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下存儲(chǔ)過(guò)程:
以下是引用片段:
CREATE PROCEDURE CheckContactCity
(@cityName CHAR(50))
AS
BEGIN
IF ((SELECT COUNT(*)
FROM Person.Address
WHERE City = @cityName) > 1)
RETURN 1
ELSE
RETURN 0
END |
該存儲(chǔ)過(guò)程返回狀態(tài)值 1 或 0,這取決于是否能在表 Person.Address 中找到 cityName 參數(shù)指定的城市。
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,然后使用 execute 方法調(diào)用 CheckContactCity 存儲(chǔ)過(guò)程:
以下是引用片段:
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 使用帶有更新計(jì)數(shù)的存儲(chǔ)過(guò)程
使用 SQLServerCallableStatement 類(lèi)構(gòu)建對(duì)存儲(chǔ)過(guò)程的調(diào)用之后,可以使用 execute 或 executeUpdate 方法中的任意一個(gè)來(lái)調(diào)用此存儲(chǔ)過(guò)程。executeUpdate 方法將返回一個(gè) int 值,該值包含受此存儲(chǔ)過(guò)程影響的行數(shù),但 execute 方法不返回此值。如果使用 execute 方法,并且希望獲得受影響的行數(shù)計(jì)數(shù),則可以在運(yùn)行存儲(chǔ)過(guò)程后調(diào)用 getUpdateCount 方法。
作為實(shí)例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫(kù)中創(chuàng)建以下表和存儲(chǔ)過(guò)程:
以下是引用片段:
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; |
在下面的實(shí)例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫(kù)的打開(kāi)連接,并使用 execute 方法調(diào)用 UpdateTestTable 存儲(chǔ)過(guò)程,然后使用 getUpdateCount 方法返回受存儲(chǔ)過(guò)程影響的行計(jì)數(shù)。
以下是引用片段:
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();
}
} |
--創(chuàng)建數(shù)據(jù)庫(kù)
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
--創(chuàng)建帳戶(hù)信息表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
--創(chuàng)建信用卡信息表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
--創(chuàng)建交易信息表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
-------------------------------插入測(cè)試數(shù)據(jù)-------------------------------------
---為AccountInfo表插入測(cè)試數(shù)據(jù)
insert into AccountInfo values('孫悟空','422322123902140019','027-8888988','花果山')
insert into AccountInfo values('唐僧','422322001902140019','027-8536896','大唐')
insert into AccountInfo values('沙和尚','410334020157144719','13295654665','通天河')
---為CardInfo表插入測(cè)試數(shù)據(jù)
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
--孫悟空取錢(qián)
--事務(wù)開(kāi)始
begin transaction tran_Qu
--定義一個(gè)用于記錄錯(cuò)誤的變量
declare @tran_error int
set @tran_error = 0;
--將孫悟空交易進(jìn)行記錄
insert into TransInfo values('1027 3726 1536 1135','支取',200.00,getdate())
set @tran_error = @tran_error + @@error
--從孫悟空的帳戶(hù)中減去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
--執(zhí)行錯(cuò)誤,回滾事務(wù)
rollback transaction
print '支取失敗,交易已取消'
end
else
begin
--沒(méi)有發(fā)現(xiàn)錯(cuò)誤,提交事務(wù)
commit transaction
print'交易成功,已保存新數(shù)據(jù)'
end
go
select * from CardInfo where CustID = 1
--沙和尚存錢(qián)
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'交易成功,已保存新數(shù)據(jù)'
end
go
select * from CardInfo where CustID = 3
--唐僧卡丟失
update CardInfo set IsLoss='是' where CustID = 2
--查詢(xún)最近10開(kāi)戶(hù)的銀行卡信息
select * from CardInfo where datediff(dd,OpenDate,getdate()) <= 10
--查詢(xún)最大交易的卡信息
declare @maxMoney money
select @maxMoney = max(TransMoney) from TransInfo
select * from CardInfo where CardID in(select CardID from TransInfo where TransMoney = @maxMoney)
--查詢(xún)交易信息表中總的交易
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)
--給交易信息表加上非聚集索引,并利用非聚集索引查詢(xún)數(shù)據(jù)
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'
--查詢(xún)掛失的賬戶(hù)信息
select * from AccountInfo where CustID in(select CustID from CardInfo where IsLoss = '是')
--賬戶(hù)信息視圖
if exists(select * from sysobjects where name = 'view_AccountCardInfo')
drop view view_AccountCardInfo
go
create view view_AccountCardInfo
as
select AccountInfo.CustID '帳戶(hù)編號(hào)',CustName '帳戶(hù)姓名',IDCard'身份證號(hào)碼',TelePhone'客戶(hù)電話(huà)',Address'客戶(hù)地址',
CardID'信用卡編號(hào)',SaveType'儲(chǔ)蓄類(lèi)型',OpenDate'開(kāi)戶(hù)日期',OpenMoney'開(kāi)戶(hù)金額',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 '卡號(hào)',TransType '交易類(lèi)型',TransMoney '交易金額',TransDate '交易時(shí)間'
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) --定義臨時(shí)的變量存放交易類(lèi)型
declare @TempTransMoney money --定義臨時(shí)的變量存放交易金額
declare @TempCardID varchar(19) --定義臨時(shí)的變量存放卡號(hào)
declare @TempLeftMoney money --定義臨時(shí)的變量存放客戶(hù)的余額
--從inserted臨時(shí)表中取出數(shù)據(jù)賦值
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 '卡號(hào):' + convert(varchar(19),@TempCardID) + ' 余額:' + convert(varchar(10),@TempLeftMoney)
go
set nocount on --不顯示語(yǔ)句影響記錄行數(shù)
--測(cè)試觸發(fā)器,沙和尚支取
insert into TransInfo(CardID,TransType,TransMoney) values('9645 9087 9371 4492','支取',500)
go
select * from TransInfo
select * from accountinfo
select * from CardInfo
--利用存儲(chǔ)過(guò)程實(shí)現(xiàn)備份交易信息的業(yè)務(wù)
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 '開(kāi)始備份......'
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
--實(shí)現(xiàn)銀行卡的存儲(chǔ)過(guò)程
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 '產(chǎn)生的隨即卡號(hào)是:' + @MyCardID
go
--實(shí)現(xiàn)開(kāi)戶(hù)的存儲(chǔ)過(guò)程
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 '尊敬的客戶(hù):' +@CustName +'開(kāi)戶(hù)成功,卡號(hào)為:'+@MyCardId
print '產(chǎn)生的隨機(jī)卡號(hào)為:' + @MyCardID
exec Proc_OpenAcount '白骨精','245687556977812345','12478964568'
exec Proc_OpenAcount '嫦娥公主','745687476912812335','14796653141',@Address = '月亮'
----銷(xiāo)戶(hù)
if exists(select * from sysobjects where name = 'Proc_DropAcount')
drop procedure Proc_DropAcount
go
create procedure Proc_DropAcount
--@CardID varchar(19)
@IDCard varchar(18) --身份證號(hào)
as
declare @TempCustID int
declare @TempLeftMoney money
--select @TempCustID = CustID from CardInfo where CardID = @CardID
--select @TempLeftMoney = LeftMoney from CardInfo where CardID = @CardID
print '該帳戶(hù)余額:' +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'--根據(jù)身份證號(hào)刪除
go
---表的查看
select * from AccountInfo
select * from CardInfo
類(lèi)和對(duì)象:
類(lèi):主觀(guān)抽象,是對(duì)象的模板,可以實(shí)例化對(duì)象
習(xí)慣上類(lèi)的定義格式:
package xxx;
import xxx;
public class Xxxx{
屬性 ······;
構(gòu)造器 ······;
方法 ······;
}
定義屬性:實(shí)例變量
格式:[ 修飾符 ] 類(lèi)型 變量名 [ = ? ]
實(shí)例變量定義在類(lèi)中但在任何方法之外。
實(shí)例變量有默認(rèn)值:各種各樣的0。(同數(shù)組)
實(shí)例變量的作用域至少在本類(lèi)內(nèi)部,受訪(fǎng)問(wèn)控制符的限制。
在重合作用域,實(shí)例變量和局部變量允許有命名沖突,“局部?jī)?yōu)先”。
定義方法:
格式: [ 修飾符 ] 返回類(lèi)型 方法名( 參數(shù)列表 ) [ throws 異常 ] { ······ }
java中所有參數(shù)都是值傳遞。
當(dāng)沒(méi)有值返回時(shí),返回類(lèi)型必須被定義為void。
返回類(lèi)型必須與方法名相鄰,其他修飾符可以調(diào)換位置。
構(gòu)造器:
在創(chuàng)建對(duì)象的過(guò)程中調(diào)用的方法。
構(gòu)造器沒(méi)有返回類(lèi)型。
構(gòu)造器的名字與類(lèi)名相同。
格式為:[ 修飾符 ] 類(lèi)名( 參數(shù)列表 ){ },修飾符可以是private、 protected、 default、private
在一個(gè)對(duì)象的生成周期中構(gòu)造器只用一次,由系統(tǒng)自動(dòng)調(diào)用,不允許手工調(diào)用。
程序員沒(méi)有提供一個(gè)構(gòu)造器,系統(tǒng)會(huì)自動(dòng)提供一個(gè)無(wú)參的構(gòu)造器。
獲得對(duì)象的方式:
通過(guò)new(在堆空間中申請(qǐng)分配空間),new 類(lèi)名(),可以通過(guò)這種形式或的一個(gè)對(duì)象,這時(shí)的對(duì)象是無(wú)法使用,必須把他的地址存放進(jìn)一個(gè)對(duì)象變量才能夠使用。
例如 :
Car c=new Car();
注意:
最好在寫(xiě)類(lèi)時(shí)提供一個(gè)無(wú)參的構(gòu)造器。
this關(guān)鍵字:
this是個(gè)隱式參數(shù),代表當(dāng)前對(duì)象;
publie class Student{
private String name;
public void setName(String name){
this.name=name; //this.name為當(dāng)前對(duì)象的成員變量
}
}
如果某個(gè)構(gòu)造方法的第一個(gè)語(yǔ)句具有形式this( ··· ),那么這個(gè)構(gòu)造方法將調(diào)用同一類(lèi)中的其他構(gòu)造方法。
注意:
在構(gòu)造器中this(...)必須放在該構(gòu)造器的第一行。
this不能出現(xiàn)在靜態(tài)方法里面
類(lèi)、對(duì)象、實(shí)例三者的關(guān)系:
類(lèi):是對(duì)象的模板,可以實(shí)例化對(duì)象
對(duì)象:類(lèi)的個(gè)體
實(shí)例:實(shí)現(xiàn)的對(duì)象
student s;
s=new student();
其中 Student為類(lèi),s為對(duì)象,new Student()為實(shí)例,s賦值后也是實(shí)例了。
方法重載:
方法名相同,參數(shù)表不同,不考慮返回值類(lèi)型(但最好還是使返回類(lèi)型一致)。
編譯器根據(jù)參數(shù),選擇一個(gè)方法,如果沒(méi)有完全匹配的,對(duì)于參數(shù)表采用“向上就近匹配原則”,但不允許模棱兩可。
方法重載屏蔽了一個(gè)對(duì)象的同一類(lèi)方法由于參數(shù)不同所造成的差異。
封裝:
類(lèi)的屬性加private修飾符,來(lái)限制只能夠在類(lèi)的內(nèi)部進(jìn)行訪(fǎng)問(wèn),有效的保護(hù)數(shù)據(jù)。
對(duì)于類(lèi)中的私有屬性,要對(duì)其給出一對(duì)方法getXxx(),setXxx()訪(fǎng)問(wèn)私有屬性,保證對(duì)私有屬性的操作的安全性。
方法公開(kāi)的是方法的聲明,即只須知道參數(shù)和返回值就可以調(diào)用該方法,隱藏方法的實(shí)現(xiàn)的細(xì)節(jié)。
一個(gè)對(duì)象和外界的聯(lián)系應(yīng)當(dāng)通過(guò)一個(gè)統(tǒng)一的接口,應(yīng)當(dāng)公開(kāi)的公開(kāi),應(yīng)當(dāng)隱藏的隱藏。
繼承:
父類(lèi)到子類(lèi)是從一般到特殊的關(guān)系。
泛化:將不同子類(lèi)中的共性抽象成父類(lèi)的過(guò)程。
特化:在原有父類(lèi)的基礎(chǔ)上加入一些個(gè)性的過(guò)程。
原則:父類(lèi)放共性,子類(lèi)放個(gè)性。
繼承的關(guān)鍵字:extends
Java只支持單繼承:一個(gè)類(lèi)最多只有一個(gè)直接的父類(lèi)。
方法覆蓋:
方法名:相同
參數(shù)表:相同
訪(fǎng)問(wèn)限制符:相同或者更寬
返回值類(lèi)型:相同或者子類(lèi)返回的類(lèi)型是父類(lèi)返回的類(lèi)型的子類(lèi)(在JDK5.0以后)
拋出的異常:不能比父類(lèi)更寬。
super關(guān)鍵字:
super()表示調(diào)用父類(lèi)的構(gòu)造器
super()也和this()一樣必須放在方法的第一句
super()和this()不能同時(shí)出現(xiàn)
super可以屏蔽子類(lèi)屬性和父類(lèi)屬性重名時(shí)帶來(lái)的屬性遮蓋,super. 表示調(diào)用父類(lèi)的方法或?qū)傩?br />
在子類(lèi)的構(gòu)造器中如果沒(méi)有指定調(diào)用父類(lèi)的哪一個(gè)構(gòu)造器,那么就會(huì)調(diào)用父類(lèi)的無(wú)參構(gòu)造器,即super()
注意:
父類(lèi)的構(gòu)造器不能被子類(lèi)繼承
方法和屬性可以被繼承,權(quán)限不限制能否繼承過(guò)來(lái),限制的是能否直接訪(fǎng)問(wèn)
先構(gòu)造父類(lèi),后構(gòu)造子類(lèi),先this后super
多態(tài):
多態(tài)分為兩種:編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。
編譯時(shí)類(lèi)型:主觀(guān)概念,把它看作什么。
運(yùn)行時(shí)類(lèi)型:客觀(guān)概念,實(shí)際它是什么。
例:Animal a=new Dog();
指著狗問(wèn),這個(gè)動(dòng)物是什么?
運(yùn)行時(shí)多態(tài)的三原則:
對(duì)象類(lèi)型不變。
只能對(duì)對(duì)象調(diào)用編譯時(shí)類(lèi)型中定義的方法。
在程序的運(yùn)行時(shí),根據(jù)對(duì)象的運(yùn)行時(shí)類(lèi)型,找覆蓋后的方法來(lái)調(diào)用。(運(yùn)行時(shí)動(dòng)態(tài)類(lèi)型綁定)
強(qiáng)制類(lèi)型轉(zhuǎn)換: 一定沒(méi)有新對(duì)象生成。(父類(lèi)的引用賦值給子類(lèi)的引用需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換)
關(guān)鍵字:instanceof
用法:引用 instanceof 類(lèi)名 判斷這個(gè)引用所指向的對(duì)象是否屬于這個(gè)類(lèi)。
用在強(qiáng)制轉(zhuǎn)換之前,避免類(lèi)型轉(zhuǎn)換異常。
if(a instanceof Dog){
Dog d=(Dog)a;
}
多態(tài)的作用:把不同的子類(lèi)對(duì)象都當(dāng)作父類(lèi)來(lái)看,可以屏蔽不同子類(lèi)對(duì)象之間的差異,寫(xiě)出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
局部變量:不是聲明在類(lèi)體括號(hào)里面的變量
(1)必須要先賦值,后使用,否則通不過(guò)編譯,局部變量沒(méi)有默認(rèn)初始化值
(2)作用范圍:定義開(kāi)始到定義它的代碼塊結(jié)束
(3)同一范圍內(nèi),不允許2個(gè)局部變量命名沖突
參數(shù)傳遞時(shí),簡(jiǎn)單類(lèi)型進(jìn)行值轉(zhuǎn)遞 (參數(shù)進(jìn)行傳遞時(shí)都會(huì)先去棧中生成一個(gè)副本的,使用結(jié)束后釋放)
自動(dòng)類(lèi)型提升:
byte a = 1;
byte b = 2;
a = a+b; //編譯出錯(cuò)自動(dòng)類(lèi)型提升成int
a += b; //自加沒(méi)有自動(dòng)類(lèi)型提升問(wèn)題
類(lèi)型自動(dòng)提升規(guī)則:
a和b作某種運(yùn)算
a和b中有double,結(jié)果就是double
a和b中有float,結(jié)果就是float
a和b中有l(wèi)ong,結(jié)果就是long
除此之外,結(jié)果都是int
把高字節(jié)轉(zhuǎn)成低字節(jié),需要作強(qiáng)制類(lèi)型轉(zhuǎn)換. byte c=(byte)a+b;
移位運(yùn)算符:效率最高
>> 有符號(hào)右移,補(bǔ)符號(hào)位
移負(fù)數(shù)位,則將該數(shù)值加32后再進(jìn)行移位
數(shù)值的2進(jìn)制是按照補(bǔ)碼保存的
>>> 右移后高位都補(bǔ)0
邏輯運(yùn)算符:
&/|也可以作為邏輯運(yùn)算符
&& 先判斷前面一個(gè)條件,如果為假,則不用計(jì)算后一個(gè)條件
|| 先判斷前面一個(gè)條件,如果為真,則不用計(jì)算后一個(gè)條件
" + "運(yùn)算符:
兩個(gè)操作的對(duì)象是數(shù)值時(shí),是加法
如果有一個(gè)是字符串時(shí),則是字符串的連接
流程控制語(yǔ)句:
同Core C++
switch中的變量類(lèi)型只能是byte、 short、int、char四種類(lèi)型
數(shù)組:
聲明數(shù)組:
數(shù)組能以下列形式聲明:
類(lèi)型[] array;
類(lèi)型 array[];
注:
JAVA中推薦用:類(lèi)型[] array;
一個(gè)數(shù)組是一個(gè)對(duì)象
聲明一個(gè)數(shù)組沒(méi)有創(chuàng)建一個(gè)對(duì)象
聲明時(shí)不用指定長(zhǎng)度
創(chuàng)建數(shù)組:
創(chuàng)建基本數(shù)據(jù)類(lèi)型數(shù)組:int[] i = new int[2];
創(chuàng)建引用數(shù)據(jù)類(lèi)型數(shù)組:Student[] s = new Student[100];
數(shù)組創(chuàng)建后其中的元素有初始值
類(lèi)型 黙認(rèn)值
byte 0
short 0
int 0
long 0l
float 0.0f
double 0.0d
char \u0000
boolean false
reference types null
注:
創(chuàng)建時(shí)一定要指定長(zhǎng)度
int[] i2=new int[]; //error
初始化數(shù)組:
聲明、創(chuàng)建、初始化分開(kāi):
int[] i; //定義數(shù)組
i = new int[2]; //分配空間
i[0] = 0; //初始化
i[1] = 1;
聲明、創(chuàng)建、初始化在同一時(shí)間 :
int[] i = {0,1}; //顯示初始化 {}中有幾個(gè)值,則數(shù)組長(zhǎng)度為幾
Student[] s = {new Student(),new Student()};
注: int[] i=new int[]{1,2,3}; //后面[]中不可以寫(xiě)數(shù)值
int[] i1=new int[3]{1,2,3}; //error
二維數(shù)組:(其實(shí)是一個(gè)一維數(shù)組,它的每一個(gè)元素又是一個(gè)一維數(shù)組)
int[][] i1 = new int[2][3];
int[][] i4 = {{1,1,1},{2,2,2},{3,3,3}};
int[][] i3 = new int[][3]; //不允許高維沒(méi)分配空間而先給低維分配空間
int[][] i2 = new int[2][];
i2[0] = new int[2];
i2[1] = new int[3];
數(shù)組長(zhǎng)度:
數(shù)組的屬性length
數(shù)組長(zhǎng)度一旦確定,不可改變
int[] i = new int[5]; 則i.length= 5
數(shù)組拷貝:
系統(tǒng)類(lèi)System提供的
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src: 源數(shù)組
srcPos: 從源數(shù)組哪個(gè)位置開(kāi)始拷貝(位置指的是元素的下標(biāo))
dest: 目標(biāo)數(shù)組
destPos: 拷貝的元素放到目標(biāo)數(shù)組的起始位置
length: 拷貝多少個(gè)
數(shù)組排序:
自己實(shí)現(xiàn)一個(gè)排序方法來(lái)進(jìn)行排序
或者調(diào)用java.util.Arrays.sort(Object o)
JAVA_HOME:配置JDK的目錄
CLASSPATH:指定到哪里去找運(yùn)行時(shí)需要用到的類(lèi)代碼(字節(jié)碼)
PATH:指定可執(zhí)行程序的位置
LINUX系統(tǒng)(在" .bash_profile "下的環(huán)境變量設(shè)置)
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 (將指定的環(huán)境變量聲明為全局的)
windows系統(tǒng):
右擊我的電腦-->屬性-->高級(jí)-->環(huán)境變量
Java的運(yùn)行過(guò)程:
編譯:生成可執(zhí)行文件,如C++中利用g++生成a.out,效率高,但不跨平臺(tái)
解釋?zhuān)航忉屍靼言次募鹦薪忉專(zhuān)缙脚_(tái)但效率不高
在java中:先編譯后解釋?zhuān)?java文件編譯成.class字節(jié)碼文件
Java源代碼文件(.java文件)--->
Java編譯器(javac)--->
Java字節(jié)碼文件(.class文件,平臺(tái)無(wú)關(guān)的)--->
Java解釋器(java),執(zhí)行Java字節(jié)碼
Java的垃圾回收:
由一個(gè)后臺(tái)線(xiàn)程gc進(jìn)行垃圾回收
虛擬機(jī)判定內(nèi)存不夠的時(shí)候會(huì)中斷代碼的運(yùn)行,這時(shí)候gc才進(jìn)行垃圾回收
缺點(diǎn):不能夠精確的去回收內(nèi)存
java.lang.System.gc(); 建議回收內(nèi)存,但系統(tǒng)不一定回應(yīng),他會(huì)先去看內(nèi)存是否夠用,夠用則不予理睬,不夠用才會(huì)去進(jìn)行垃圾回收
內(nèi)存中什么算是垃圾:
不在被引用的對(duì)象(局部變量,沒(méi)有指針指向的)
java的安全性:
沙箱機(jī)制:只能做沙箱允許的操作
通過(guò)下面環(huán)節(jié),實(shí)現(xiàn)安全
加載有用的類(lèi)文件,不需要的不加載
校驗(yàn)字節(jié)碼,查看允許的操作
查看代碼和虛擬機(jī)的特性是否相符
查看代碼是否有破壞性
查看是否有違規(guī)操作,如越界
查看類(lèi)型是否匹配,類(lèi)型轉(zhuǎn)換是否能正確執(zhí)行
源程序:
package mypack; //相當(dāng)于一個(gè)目錄
public class HelloWorld{
public static void main(String[] args){
System.out.println(“Hello World”);
}
}
注:
1、文件名必須和public修飾的類(lèi)名一致,以.java作為文件后綴,如果定義的類(lèi)不是public的,則文件名與類(lèi)名可以不同。
2、一個(gè).java文件中可以有多個(gè)class,但是只有一個(gè)public修飾的類(lèi)。
3、java源代碼文件編譯后,一個(gè)類(lèi)對(duì)應(yīng)生成一個(gè).class文件
4、一個(gè)java應(yīng)用程序應(yīng)該包含一個(gè)main()方法,而且其簽名是固定的,它是應(yīng)用程序的入口方法,可以定義在任意一個(gè)類(lèi)中,不一定是public修飾的類(lèi)
編譯:javac -d . HelloWorld.java
含有包的類(lèi),在編譯的時(shí)候最好用上面的格式,-d指的是讓該類(lèi)生成的時(shí)候按照包結(jié)構(gòu)去生成," . "指的是在當(dāng)前路徑下生成
如果不用上面的格式,也可以用javac HelloWorld.java,但是需要注意的是包結(jié)構(gòu)就要由自己去建立,然后將生成的.class文件放到該目錄下
執(zhí)行:java mypack.HelloWorld
將字節(jié)碼文件交給Java虛擬機(jī)去解釋執(zhí)行
需要注意的事,必須使用包名.類(lèi)名去解釋執(zhí)行
包(package):把源文件放在目錄下
由于工程的需要,將不同的源文件放在不同的目錄下,從而引入了包。
包可以看作就是一個(gè)存放java源文件的目錄。
在源碼中聲明一個(gè)包名:package p;(只能放在第一行,且最多只能是一行)
如果指定多層包,那么在包名之間我們可以用.作為分隔符:package p1.p2.p3.p4;
用“javac HelloWorld.java –d 絕對(duì)路徑”,編譯后生成的字節(jié)碼文件就會(huì)放在指定的包結(jié)構(gòu)下
執(zhí)行該程序需要用" java 包名.類(lèi)名 "
引進(jìn)包中的某個(gè)類(lèi):import 包名.類(lèi)名;
引進(jìn)包中的所有類(lèi):import 包名.*;
注釋?zhuān)?br />
// 單行注釋?zhuān)?到本行結(jié)束的所有字符會(huì)被編譯器忽略
/* */ 多行注釋?zhuān)?nbsp; 在/* */之間的所有字符會(huì)被編譯器忽略
/** */ 文檔注釋?zhuān)?java特有的,在/** */之間的所有字符會(huì)被編譯器忽略
可以用javadoc把java源程序中這種注釋抽取出來(lái)形成html頁(yè)面(只有寫(xiě)在包,類(lèi),屬性,方法,構(gòu)造器,引入之前的注釋才可以進(jìn)行抽取)
標(biāo)識(shí)符:
命名規(guī)則:
(1) 由字母、數(shù)字、下劃線(xiàn)、$組成,不能以數(shù)字開(kāi)頭
(2) 大小寫(xiě)敏感
(3) 不得使用java中的關(guān)鍵字和保留字
關(guān)鍵字:都是小寫(xiě)的,jdk1.2多了strictfp(經(jīng)準(zhǔn)浮點(diǎn)型),關(guān)鍵字 jdk1.4多了assert(斷言)關(guān)鍵字, jdk1.5多了enum(枚舉) 關(guān)鍵字
隨著學(xué)習(xí)進(jìn)度,會(huì)慢慢接觸到的
true、false、null嚴(yán)格說(shuō)不應(yīng)該算關(guān)鍵字,應(yīng)稱(chēng)其為保留字更合適
習(xí)慣:
(1) 標(biāo)識(shí)符要符合語(yǔ)義信息
(2) 包名所有字母小寫(xiě)
(3) 類(lèi)名每個(gè)單詞首字母大寫(xiě),其它小寫(xiě) //TarenaStudent
(4) 變量和方法:第一個(gè)單詞小寫(xiě),從第二個(gè)單詞開(kāi)始首字母大寫(xiě) //tarenaStudent
(5) 常量:所有字母大寫(xiě),每個(gè)單詞之間用" _ "連接
基本數(shù)據(jù)類(lèi)型: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) 浮點(diǎn)類(lèi)型
float 4B 32位
double 8B 64位
3) 字符類(lèi)型
char 2B 16位
4) 布爾型 1B
boolean false/true
注:
1、Java中的自動(dòng)類(lèi)型提升問(wèn)題。
1)、正向過(guò)程:從低字節(jié)到高字節(jié)可以自動(dòng)轉(zhuǎn)換。
byte->short->int->long->float->double
2)、逆向過(guò)程:從高字節(jié)到低字節(jié)用強(qiáng)制類(lèi)型轉(zhuǎn)換。
例:int a = (int)4.562;
注:逆向轉(zhuǎn)換將丟失精度。
2、boolean:只有true和false。
3、char:Java中用" \u四位十六進(jìn)制的數(shù)字 (即使在注釋中出現(xiàn)\u,后面如果跟的不是4個(gè)數(shù)字,也會(huì)報(bào)錯(cuò))"表示將字符轉(zhuǎn)換成對(duì)應(yīng)的unicode編碼,字符類(lèi)型要用單引號(hào)括起來(lái)。
4、黙認(rèn)浮點(diǎn)類(lèi)型為double,float數(shù)據(jù)類(lèi)型有一個(gè)后綴為" f "或" F "。
5、long類(lèi)型有一個(gè)后綴,為" l " 或者" L "
引用數(shù)據(jù)類(lèi)型:
類(lèi)、接口、數(shù)組
引用類(lèi)型 變量名 = new 引用類(lèi)型名(參數(shù)); //new后面一般跟的都是類(lèi)的構(gòu)造器
成員:寫(xiě)在類(lèi)體括號(hào)里面的
內(nèi)存空間的分配:
內(nèi)存分為:
棧:存放簡(jiǎn)單數(shù)據(jù)類(lèi)型變量(值和變量名都存在棧中),存放引用數(shù)據(jù)類(lèi)型的變量名以及它所指向的實(shí)例的首地址
堆:存放引用數(shù)據(jù)類(lèi)型的實(shí)例
在中國(guó),做軟件是當(dāng)今最時(shí)髦的事情,但做軟件早已不僅僅是商業(yè),而已經(jīng)上升為一門(mén)藝術(shù);早已經(jīng)不是真正搞軟件的人獨(dú)占的地盤(pán),而是融入房地產(chǎn)商、硬件廠(chǎng)商、服務(wù)商、各類(lèi)投機(jī)者等三教九流無(wú)所不包的社會(huì)大棋局。 顯然,這是一次幾十年不遇的政策機(jī)遇,其最大價(jià)值不在于真正的軟件產(chǎn)業(yè)本身,不在于軟件業(yè)務(wù)本身。因?yàn)檎嬲闹袊?guó)軟件市場(chǎng)現(xiàn)在撐死也就200個(gè)億,而且大部分(2/3以上)由國(guó)外軟件公司所占有。但是,這次以軟件為名義的熱潮,其調(diào)動(dòng)和轉(zhuǎn)移的財(cái)富和資源,是千億甚至萬(wàn)億計(jì)的,是軟件業(yè)本身的1~2個(gè)數(shù)量級(jí)以上,甚至也是幾年前互聯(lián)網(wǎng)熱潮的2~3個(gè)數(shù)量級(jí)以上。這是所有試圖把握軟件機(jī)遇的人,必須首先判明的方向性問(wèn)題。
我們借用圍棋的術(shù)語(yǔ),可以把商機(jī)劃分為“金角銀邊草肚皮”,鮮明地分析如下:
1、金角:最軟的高科技和最土的房地產(chǎn),鮮花插牛糞也好,天造一雙地配一對(duì)也好,反正今后今年他們都將如膠似漆!以軟件的名義,全國(guó)各省市,各區(qū)縣都將有成千上萬(wàn)畝的土地紛紛成為軟件園,這無(wú)疑是房地產(chǎn)的大好機(jī)遇。因此,各地的軟件園和軟件學(xué)院,以及其他以軟件名義騰出的地皮,是這場(chǎng)軟件熱潮的價(jià)值核心。
2、銀邊:政策效應(yīng)的最根本特點(diǎn)就是全國(guó)上下會(huì)爭(zhēng)先恐后,一齊跟進(jìn)。上上下下都會(huì)響應(yīng)號(hào)召,出臺(tái)各種扶持政策。包括稅收減免、資金投入以及其他優(yōu)先政策,都可以形成不菲的政策資源。這些資源利用得當(dāng)也可以及時(shí)轉(zhuǎn)化為真金白銀。因此,如果幾年之內(nèi),全國(guó)的硬件公司、IT服務(wù)公司甚至其他行業(yè)的公司,全部或者大多都轉(zhuǎn)變成軟件公司,你也不要大驚小怪。只要真正有利益。軟件業(yè)全國(guó)上下大繁榮,也是可以期待的。當(dāng)然,這是中國(guó)“特色”的軟件業(yè),是遠(yuǎn)遠(yuǎn)超越了國(guó)際上一般標(biāo)準(zhǔn)的軟件概念。
3、草肚皮:大獲其利的很少是真正的軟件公司。因?yàn)槟切┮婚T(mén)心思搞軟件的人,大多笨手笨腳。熱潮之下,供需嚴(yán)重失衡,軟件人才幾年后很可能淪為青菜蘿卜一樣。不過(guò),那些真正一頭扎進(jìn)軟件,真的做成軟件公司,也可能不錯(cuò)的。雖然,隨著軟件公司迅速繁衍,真的假的都來(lái)爭(zhēng)奪有限的市場(chǎng),競(jìng)爭(zhēng)進(jìn)一步激化,十分辛苦。但是,現(xiàn)在哪一行不辛苦?如果定位準(zhǔn)確,真的能夠一不留神做成、做大,然后融資上市,也是一步登天。
由此,所有趕潮軟件的人,從高到低,可以分為三類(lèi):最上等是“為地皮而軟件”,中間是“為政策而軟件”,最下等是“為軟件而軟件”,構(gòu)成了食物鏈的金字塔。與國(guó)內(nèi)其他行業(yè)的政策造市的基本規(guī)律沒(méi)有本質(zhì)差異。
面對(duì)軟件熱潮中的一些不和諧現(xiàn)象,我們沒(méi)有必要只從消極和負(fù)面的角度來(lái)評(píng)判。畢竟,在這股熱潮中,假作真時(shí)假也真,軟件業(yè)之外的龐大資源肯定會(huì)有一小部分要轉(zhuǎn)化到軟件產(chǎn)業(yè)。由于資源總量龐大,有百分之一或者百分之幾的轉(zhuǎn)化,對(duì)于軟件業(yè)來(lái)說(shuō),就是“久旱逢甘雨”,就是極大的支持。比如以國(guó)內(nèi)軟件園圈地最為成功的托普為例,它在全國(guó)的幾十個(gè)軟件園都是不錯(cuò)的房地產(chǎn)項(xiàng)目,運(yùn)作得當(dāng),利潤(rùn)十分豐厚。拿出一小部分利潤(rùn)來(lái)投入軟件,補(bǔ)貼軟件,幾年以后一不留神也會(huì)“培育”出真正的軟件業(yè)務(wù)。畢竟,大家打的都是“軟件”的旗號(hào),完全沒(méi)有軟件,這個(gè)美妙的游戲也是難以為繼的。這一切總比那些純粹的房地產(chǎn)商要好一些!
因此,吃著房地產(chǎn)的剩飯,軟件也可能一點(diǎn)點(diǎn)長(zhǎng)大成人。走出過(guò)門(mén),走向世界;挑戰(zhàn)微軟,打敗印度,也不是完全沒(méi)有可能。市場(chǎng)就是一個(gè)追逐利益最大化的棋局,消極的批評(píng)作用和意義不大。不如,我們正視現(xiàn)實(shí),承認(rèn)積極、正面的效應(yīng),坦然應(yīng)對(duì)這場(chǎng)勢(shì)不可當(dāng)?shù)拇鬅岢薄?
總之,政策已經(jīng)為我們布好了巨大的棋盤(pán),至于如何布局和下子,那就是一個(gè)各顯其能的時(shí)候。我們當(dāng)然真誠(chéng)希望,那些真正有心推動(dòng)中國(guó)軟件業(yè)發(fā)展的人士,能夠認(rèn)清形勢(shì),放開(kāi)思路。在這場(chǎng)大規(guī)模的財(cái)富與資源轉(zhuǎn)移中,不要太固守成見(jiàn),應(yīng)放開(kāi)手腳,爭(zhēng)取獲得盡可能多的利益,使中國(guó)軟件得到更好的推動(dòng)。
ADSL撥號(hào)中出現(xiàn)的錯(cuò)誤代碼
Error 602 The port is already open
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)由于設(shè)備安裝錯(cuò)誤或正在使用,不能進(jìn)行連接
原因:RasPPPoE沒(méi)有完全和正確的安裝
解決:卸載干凈任何PPPoE軟件,重新安裝
Error 605 Cannot set port information
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)由于設(shè)備安裝錯(cuò)誤不能設(shè)定使用端口
原因:RasPPPoE沒(méi)有完全和正確的安裝
解決:卸載干凈任何PPPoE軟件,重新安裝
Error 606 The port is not connected
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)不能連接所需的設(shè)備端口
原因:RasPPPoE沒(méi)有完全和正確的安裝,連接線(xiàn)故障,ADSL MODEM故障
解決:卸載干凈任何PPPoE軟件,重新安裝,檢查網(wǎng)線(xiàn)和 ADSL MODEM
Error 608 The device does not exist
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)連接的設(shè)備不存在
原因:RasPPPoE沒(méi)有完全和正確的安裝
解決:卸載干凈任何PPPoE軟件,重新安裝
Error 609 The device type does not exist
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)連接的設(shè)備其種類(lèi)不能確定
原因:RasPPPoE沒(méi)有完全和正確的安裝
解決:卸載干凈任何PPPoE軟件,重新安裝
Error 611 The route is not available/612 The route is not allocated
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)連接路由不正確
原因:RasPPPoE沒(méi)有完全和正確的安裝,ISP服務(wù)器故障
解決:卸載干凈任何PPPoE軟件,重新安裝,致電ISP詢(xún)問(wèn)
Error 617 The port or device is already disconnecting
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)連接的設(shè)備已經(jīng)斷開(kāi)
原因:RasPPPoE沒(méi)有完全和正確的安裝,ISP服務(wù)器故障,連接線(xiàn),ADSL MODEM故障
解決:卸載干凈任何PPPoE軟件,重新安裝,致電ISP詢(xún)問(wèn) ,檢查網(wǎng)線(xiàn)和 ADSL MODEM
Error 619
問(wèn)題:與ISP服務(wù)器不能建立連接
原因:ADSL ISP服務(wù)器故障,ADSL電話(huà)線(xiàn)故障
解決:檢查ADSL信號(hào)燈是否能正確同步。致電ISP詢(xún)問(wèn)
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
問(wèn)題:Windows NT或者Windows 2000 Server網(wǎng)絡(luò)RAS網(wǎng)絡(luò)組件故障
原因:軟件安裝問(wèn)題
解決:卸載所有PPPoE軟件,重新安裝RAS網(wǎng)絡(luò)組件和RasPPPoE
Error 630
問(wèn)題:ADSL MODEM沒(méi)有沒(méi)有響應(yīng)
原因:ADSL電話(huà)線(xiàn)故障,ADSL MODEM故障(電源沒(méi)打開(kāi)等)
解決:檢查ADSL設(shè)備
Error 633
問(wèn)題:撥號(hào)網(wǎng)絡(luò)網(wǎng)絡(luò)由于設(shè)備安裝錯(cuò)誤或正在使用,不能進(jìn)行連接
原因:RasPPPoE沒(méi)有完全和正確的安裝
解決:卸載干凈任何PPPoE軟件,重新安裝
Error 638
問(wèn)題:過(guò)了很長(zhǎng)時(shí)間,無(wú)法連接到ISP的ADSL接入服務(wù)器
原因:ISP服務(wù)器故障;在RasPPPoE所創(chuàng)建的不好連接中你錯(cuò)誤的輸入了一個(gè)電話(huà)號(hào)碼
解決:運(yùn)行其創(chuàng)建撥號(hào)的Raspppoe.exe檢查是否能列出ISP服務(wù),以確定ISP正常;把所使用的撥號(hào)連接中的 電話(huà)號(hào)碼清除或者只保留一個(gè)0。
Error 645
問(wèn)題:網(wǎng)卡沒(méi)有正確響應(yīng)
原因:網(wǎng)卡故障,或者網(wǎng)卡驅(qū)動(dòng)程序故障
解決:檢查網(wǎng)卡,重新安裝網(wǎng)卡驅(qū)動(dòng)程序
Error 650
問(wèn)題:遠(yuǎn)程計(jì)算機(jī)沒(méi)有響應(yīng),斷開(kāi)連接
原因:ADSL ISP服務(wù)器故障,網(wǎng)卡故障,非正常關(guān)機(jī)造成網(wǎng)絡(luò)協(xié)議出錯(cuò)
解決:檢查ADSL信號(hào)燈是否能正確同步,致電ISP詢(xún)問(wèn);檢查網(wǎng)卡,刪除所有網(wǎng)絡(luò)組件重新安裝 網(wǎng)絡(luò)。
Error 651
問(wèn)題:ADSL MODEM報(bào)告發(fā)生錯(cuò)誤
原因:Windows處于安全模式下,或其他錯(cuò)誤
解決:出現(xiàn)該錯(cuò)誤時(shí),進(jìn)行重?fù)埽涂梢詧?bào)告出新的具體錯(cuò)誤代碼
Error 691
問(wèn)題:輸入的用戶(hù)名和密碼不對(duì),無(wú)法建立連接
原因:用戶(hù)名和密碼錯(cuò)誤,ISP服務(wù)器故障
解決:使用正確的用戶(hù)名和密碼,并且使用正確的ISP賬號(hào)格式(name@service),致電ISP詢(xún)問(wèn)。
Error 718
問(wèn)題:驗(yàn)證用戶(hù)名時(shí)遠(yuǎn)程計(jì)算機(jī)超時(shí)沒(méi)有響應(yīng),斷開(kāi)連接
原因:ADSL ISP服務(wù)器故障
解決:致電ISP詢(xún)問(wèn)
Error 720
問(wèn)題:撥號(hào)網(wǎng)絡(luò)無(wú)法協(xié)調(diào)網(wǎng)絡(luò)中服務(wù)器的協(xié)議設(shè)置
原因:ADSL ISP服務(wù)器故障,非正常關(guān)機(jī)造成網(wǎng)絡(luò)協(xié)議出錯(cuò)
解決:致電ISP詢(xún)問(wèn),刪除所有網(wǎng)絡(luò)組件重新安裝網(wǎng)絡(luò)。
Error 734
問(wèn)題:PPP連接控制協(xié)議中止
原因:ADSL ISP服務(wù)器故障,非正常關(guān)機(jī)造成網(wǎng)絡(luò)協(xié)議出錯(cuò)
解決:致電ISP詢(xún)問(wèn),刪除所有網(wǎng)絡(luò)組件重新安裝網(wǎng)絡(luò)。
Error 738
問(wèn)題:服務(wù)器不能分配IP地址
原因:ADSL ISP服務(wù)器故障,ADSL用戶(hù)太多超過(guò)ISP所能提供的IP地址
解決:致電ISP詢(xún)問(wèn)
Error 797
問(wèn)題:ADSL MODEM連接設(shè)備沒(méi)有找到
原因:ADSL MODEM電源沒(méi)有打開(kāi),網(wǎng)卡和ADSL MODEM的連接線(xiàn)出現(xiàn)問(wèn)題,軟件安裝以后相應(yīng)的協(xié)議沒(méi)有正確邦定,在創(chuàng)立撥號(hào)連接時(shí),建立了錯(cuò)誤的空連接
解決:檢查電源,連接線(xiàn);檢查網(wǎng)絡(luò)屬性,RasPPPoE相關(guān)的協(xié)議是否正確的安裝并正確邦定(相關(guān)協(xié)議),檢查網(wǎng)卡是否出現(xiàn)?號(hào)或!號(hào),把它設(shè)置為Enable;檢查撥號(hào)連接的屬性,是否連接的設(shè)備使用了一個(gè)“ISDN channel-Adapter Name(xx)” 的設(shè)備,該設(shè)備為一個(gè)空設(shè)備,如果使用了取消它,并選擇 正確的PPPoE設(shè)備代替它,或者重新創(chuàng)立撥號(hào)連接。
“高效”有時(shí)候并不需要什么技巧,很多人在抱怨沒(méi)有足夠時(shí)間的時(shí)候,其中的潛臺(tái)詞是他們應(yīng)該更專(zhuān)心。時(shí)間對(duì)每個(gè)人都是公平的,你需要的是不要浪費(fèi)時(shí)間,并且專(zhuān)心。
防止浪費(fèi)時(shí)間的竅門(mén)
If the real work that needs doing is offline, disable the internet for an hour at a time.
如果這件事情不需要上網(wǎng)就可以完成,把網(wǎng)斷掉。
Turn email checks into an hourly habit, not an “as the box gets mail” habit.
延長(zhǎng)查看電子郵件的周期。
Don’t answer your cell phone when working on something important. Call back later.
如果手頭的工作很重要,工作期間不要接電話(huà),回頭再打過(guò)去就是了。
If you can’t work at work, negotiate finding a new place to get things done.
如果你的工作環(huán)境讓你不能工作,換個(gè)沒(méi)人打擾的地方
Television means: “I don’t need this time and it doesn’t matter to me.” (Almost always. Really.)
看電視意味著“這段時(shí)間我浪費(fèi)了也無(wú)所謂”。
Bugdet your entertainment time vs. production time. Never cheat the other.
平衡你的娛樂(lè)和工作時(shí)間。
Examine every opportunity along the lines of time vs. projects already underway.
時(shí)時(shí)檢查你的時(shí)間安排和現(xiàn)在已經(jīng)進(jìn)行中的項(xiàng)目。
Try working part of your day in “off-hour” times, to get more done with fewer people around.
以小時(shí)為單位劃分你的工作時(shí)間,用更少的人做更多的事情。
專(zhuān)心的竅門(mén)
Write your goals clearly. Post them in eyeball view of where you work most.
清楚的寫(xiě)下你的目標(biāo)。放在你的眼皮底下。
Spend time with focused people. Meet and befriend those who are where you want to be.
多和專(zhuān)心工作的人在一起。
Consume as much material about your prime focus as you can budget.
盡量把資源用在主要目標(biāo)上,把時(shí)間花在刀刃上。
Analyze your past experiences. Be clear. List your successes. Examine your failures.
回顧總結(jié)以往的成功和失敗經(jīng)驗(yàn)。
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.
想象一下成功后的樣子,寫(xiě)下來(lái),每天讀讀。
Learn how to “chunk.” Hit each milestone and move to the next. Be methodical.
學(xué)會(huì)把大事劃分為幾個(gè)階段,完成一個(gè)階段,再進(jìn)入下一個(gè)。
Develop habits around success and drive.
養(yǎng)成好習(xí)慣。
Recharge your batteries with good sleep and food.
吃好睡足。
Develop your relationship with your family. It nourishes the other goals.
維持家庭關(guān)系。這是你完成其它工作的保障。
1、不說(shuō)“不可能”三個(gè)字;
2、凡事第一反應(yīng):找方法,而不是找借口;
3、遇到挫折對(duì)自己大聲說(shuō):太棒了;
4、不說(shuō)消極的話(huà),不落入消極情緒,一旦出現(xiàn)立即正面處理;
5、凡事先訂立目標(biāo),并且盡量制作“夢(mèng)想版”;
6、凡事預(yù)先作計(jì)劃,盡量前目標(biāo)視覺(jué)化;
7、六點(diǎn)優(yōu)先工作制,每一分,每一秒做生產(chǎn)力的事情;
8、隨時(shí)用零碎的時(shí)間(如等人、排隊(duì)等)做零碎的小活;
9、守時(shí);
10、寫(xiě)下來(lái),不要太依靠腦袋記憶;
11、隨時(shí)記錄靈感;
12、把重要的觀(guān)念、方法寫(xiě)下來(lái),并貼起來(lái),以隨時(shí)提示自己;
13、走路比平時(shí)快30%。走路時(shí),腳尖稍用力推進(jìn);肢體語(yǔ)言健康有力,不懶散;
14、每天出門(mén)照鏡子,給自己一個(gè)自信的笑容;
15、每天自我反省一次;
16、每天堅(jiān)持一次運(yùn)動(dòng);
17、聽(tīng)心跳1分鐘。指在做重要事前,疲勞時(shí),心情煩燥時(shí),緊張時(shí);
18、開(kāi)會(huì)坐在前排;
19、微笑;
20、用心傾聽(tīng),不打斷對(duì)方說(shuō)話(huà);
21、說(shuō)話(huà)時(shí),聲音有力。感覺(jué)自己聲音似乎能產(chǎn)生有感染力的磁場(chǎng);
22、同理心。說(shuō)話(huà)之前,先考慮一下對(duì)方的感覺(jué);
23、每天有意識(shí)、真誠(chéng)地贊美別人三次以上;
24、及時(shí)寫(xiě)感謝卡,哪怕是用便條寫(xiě);
25、不用訓(xùn)斥、指責(zé)的口吻跟別人說(shuō)話(huà);
26、控制住不要讓自己做出為自己辯護(hù)的第一反應(yīng);
27、每天多做一件“分外事”
28、不管任何方面,每天必須至少做一次“進(jìn)步一點(diǎn)點(diǎn)”;
29、每天提前15分鐘上班,推遲30分鐘下班;
30、每天在下班前5分鐘的時(shí)間做一天的整理性工作;
31、定期存錢(qián);
32、節(jié)儉;
新華網(wǎng)北京5月20日電(記者 隋笑飛楊維漢)這次地震前,中國(guó)地震局沒(méi)有作出短臨預(yù)報(bào),同時(shí)也沒(méi)有收到任何單位、個(gè)人或團(tuán)體提交的有關(guān)這次地震的短臨預(yù)報(bào)意見(jiàn)。至于網(wǎng)上發(fā)布曾經(jīng)有人提出過(guò)關(guān)于這次地震的預(yù)報(bào)意見(jiàn)的信息,是不符合實(shí)際的。中國(guó)地震局對(duì)于個(gè)人或團(tuán)體的地震短臨預(yù)報(bào)意見(jiàn),有專(zhuān)門(mén)的管理辦法和處理程序。中國(guó)地震局監(jiān)測(cè)預(yù)報(bào)司是具體負(fù)責(zé)這項(xiàng)工作的部門(mén)。
20日上午,中國(guó)地震局監(jiān)測(cè)預(yù)報(bào)司副司長(zhǎng)車(chē)時(shí)接受中國(guó)地震信息網(wǎng)專(zhuān)訪(fǎng)時(shí)作上述表示。
車(chē)時(shí)同時(shí)介紹了中國(guó)地震局對(duì)個(gè)人或團(tuán)體的地震短臨預(yù)報(bào)意見(jiàn)的管理辦法。他說(shuō),中國(guó)地震局監(jiān)測(cè)預(yù)報(bào)司從20世紀(jì)80年代后期開(kāi)始對(duì)個(gè)人、學(xué)術(shù)團(tuán)體的短臨地震預(yù)報(bào)意見(jiàn)實(shí)施管理,具體管理工作由中國(guó)地震臺(tái)網(wǎng)中心統(tǒng)一管理。具體辦法是,指定專(zhuān)門(mén)的地震預(yù)報(bào)專(zhuān)家管理個(gè)人、學(xué)術(shù)團(tuán)體等提出的短臨預(yù)報(bào)意見(jiàn)。由專(zhuān)家收集、整理,并及時(shí)在地震部門(mén)的周、月會(huì)商中,介紹預(yù)測(cè)意見(jiàn)的主要依據(jù)、結(jié)論等,供震情跟蹤判定時(shí)參考。每年年底,對(duì)一年中的所有短臨預(yù)報(bào)意見(jiàn)進(jìn)行評(píng)估,對(duì)其中預(yù)報(bào)準(zhǔn)確或預(yù)報(bào)效果較好的給予獎(jiǎng)勵(lì)。
車(chē)時(shí)還指出,中國(guó)防震減災(zāi)法和地震預(yù)報(bào)管理?xiàng)l例中,有關(guān)于地震短臨預(yù)報(bào)的明確規(guī)定。防震減災(zāi)法第十六條規(guī)定:國(guó)家對(duì)地震預(yù)報(bào)實(shí)行統(tǒng)一發(fā)布制度。地震短期預(yù)報(bào)和臨震預(yù)報(bào),由省、自治區(qū)、直轄市人民政府按照國(guó)務(wù)院規(guī)定的程序發(fā)布。任何單位或者從事地震工作的專(zhuān)業(yè)人員關(guān)于短期地震預(yù)測(cè)或者臨震預(yù)測(cè)的意見(jiàn),應(yīng)當(dāng)報(bào)國(guó)務(wù)院地震行政主管部門(mén)或者縣級(jí)以上地方人民政府負(fù)責(zé)管理地震工作的部門(mén)或者機(jī)構(gòu)按照前款處理,不得擅自向社會(huì)擴(kuò)散。
車(chē)時(shí)表示,地震預(yù)報(bào)管理?xiàng)l例規(guī)定,國(guó)家鼓勵(lì)和扶持地震預(yù)報(bào)的科學(xué)技術(shù)研究。中國(guó)地震局監(jiān)測(cè)預(yù)報(bào)司本著對(duì)人民、對(duì)國(guó)家高度負(fù)責(zé)的態(tài)度,嚴(yán)格遵照該規(guī)定,支持地震預(yù)報(bào)科學(xué)研究,高度重視個(gè)人和團(tuán)體提出的短臨預(yù)測(cè)意見(jiàn),但是對(duì)這些預(yù)測(cè)意見(jiàn)的處理是有嚴(yán)格程序的,要組織專(zhuān)家按照有關(guān)規(guī)定對(duì)預(yù)測(cè)意見(jiàn)的科學(xué)性和可能性進(jìn)行審定。同時(shí),由于地震預(yù)報(bào)既具有科學(xué)性,又具有社會(huì)性,政府發(fā)布地震預(yù)測(cè)意見(jiàn)是非常慎重的。
關(guān)于個(gè)人或團(tuán)體有了地震預(yù)報(bào)意見(jiàn)后應(yīng)如何提交給地震部門(mén)的問(wèn)題,車(chē)時(shí)表示,任何單位和個(gè)人根據(jù)地震觀(guān)測(cè)資料和研究成果,提出了短臨地震預(yù)測(cè)意見(jiàn),可向所在地或者所預(yù)測(cè)地區(qū)的縣級(jí)以上地方人民政府負(fù)責(zé)管理地震工作的機(jī)構(gòu)提出書(shū)面報(bào)告,也可以直接向國(guó)務(wù)院地震工作主管部門(mén)書(shū)面報(bào)告。但是,不得向社會(huì)散布。并且,任何單位和個(gè)人不得向國(guó)(境)外提出地震預(yù)測(cè)意見(jiàn)。個(gè)人或團(tuán)體對(duì)地震活動(dòng)趨勢(shì)的長(zhǎng)期和中期預(yù)測(cè)研究成果除外,可以進(jìn)行學(xué)術(shù)交流討論。
車(chē)時(shí)還談了個(gè)人或團(tuán)體提交的地震短臨預(yù)報(bào)意見(jiàn)的具體情況。他說(shuō),現(xiàn)在有很多個(gè)人或團(tuán)體開(kāi)展地震預(yù)報(bào)探索,每年都收到幾十至上百份的正式短臨預(yù)報(bào)意見(jiàn)。但是,當(dāng)前地震預(yù)報(bào)是公認(rèn)的世界科學(xué)難題,總體水平是很低的。準(zhǔn)確的短臨預(yù)報(bào)意見(jiàn)是非常少的,2000年以來(lái),中國(guó)地震臺(tái)網(wǎng)中心(前分析預(yù)報(bào)中心)共收到700多份地震短臨預(yù)報(bào)意見(jiàn),其中基本上準(zhǔn)確的預(yù)報(bào)意見(jiàn)有7份。2008年以來(lái),共收到26份短臨預(yù)報(bào)意見(jiàn),尚沒(méi)有正確預(yù)報(bào)的短臨預(yù)報(bào)意見(jiàn)。盡管這些意見(jiàn)的準(zhǔn)確性非常低,但作為地震主管部門(mén),根據(jù)有關(guān)法律,歡迎和鼓勵(lì)個(gè)人和團(tuán)體繼續(xù)開(kāi)展地震預(yù)報(bào)探索。
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("請(qǐng)輸入郵箱和密碼");
//用戶(hù)名、密碼以及其輸入框
JLabel Name = new JLabel("用戶(hù)名");
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("郵件登陸");//窗口標(biāo)題
//以下為加入面版
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);//設(shè)置大小
this.setVisible(true);//設(shè)置可見(jiàn)
setResizable(false);//禁止拉動(dòng)窗口大小
//居中窗口
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screen.width - getSize().width)/2,(screen.height - getSize().height)/2 );
// this.setDefaultCloseOperation(3);//關(guān)閉窗口
this.addWindowListener(new WindowClose());
}
//對(duì)郵箱的輸入格式進(jìn)行判斷
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;
}
//郵箱檢測(cè)
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("請(qǐng)輸入郵箱");
// tName.setText("");//清空輸入內(nèi)容
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}else if(name.indexOf("@")== -1){
Message.setForeground(Color.red);
Message.setText("您輸入郵箱格式錯(cuò)誤,不包含“@”");
//tName.setText("");
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}else if(first<65 || (first>90 && first <97)||first>122){
Message.setForeground(Color.red);
Message.setText("郵箱首字母應(yīng)為英文字母");
// tName.setText("");
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}else if(!booFormat){
Message.setForeground(Color.red);
Message.setText("郵箱名不和法:只能包含字母、數(shù)字、下劃線(xiàn)");
//tName.setText("");
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}else if(!boo){
Message.setForeground(Color.red);
Message.setText("郵箱后綴不和法");
//tName.setText("");
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}else if(password.equals("")){
Message.setForeground(Color.red);
Message.setText("密碼不能為空");
pPwd.setText("");//清空輸入內(nèi)容
pPwd.grabFocus();
}else if(password.length()<6){
Message.setForeground(Color.red);
Message.setText("密碼必須為6位,請(qǐng)檢查后重新輸入");
pPwd.setText("");//清空輸入內(nèi)容
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("郵箱或密碼錯(cuò)誤!請(qǐng)重新輸入!");
pPwd.setText("");//清空輸入內(nèi)容
tName.grabFocus();
}
}
}
// 重置鍵清空輸入內(nèi)容
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();
}
}
字符串
1、獲取字符串的長(zhǎng)度
length()
2 、判斷字符串的前綴或后綴與已知字符串是否相同
前綴 startsWith(String s)
后綴 endsWith(String s)
3、比較兩個(gè)字符串
equals(String s)
4、把字符串轉(zhuǎn)化為相應(yīng)的數(shù)值
int型 Integer.parseInt(字符串)
long型 Long.parseLong(字符串)
float型 Folat.valueOf(字符串).floatValue()
double型 Double.valueOf(字符串).doubleValue()
4、將數(shù)值轉(zhuǎn)化為字符串
valueOf(數(shù)值)
5、字符串檢索
indexOf(Srting s) 從頭開(kāi)始檢索
indexOf(String s ,int startpoint) 從startpoint處開(kāi)始檢索
如果沒(méi)有檢索到,將返回-1
6、得到字符串的子字符串
substring(int startpoint) 從startpoint處開(kāi)始獲取
substring(int start,int end) 從start到end中間的字符
7、替換字符串中的字符,去掉字符串前后空格
replace(char old,char new) 用new替換old
trim()
8、分析字符串
StringTokenizer(String s) 構(gòu)造一個(gè)分析器,使用默認(rèn)分隔字符(空格,換行,回車(chē),Tab,進(jìn)紙符)
StringTokenizer(String s,String delim) delim是自己定義的分隔符
nextToken() 逐個(gè)獲取字符串中的語(yǔ)言符號(hào)
boolean hasMoreTokens() 只要字符串還有語(yǔ)言符號(hào)將返回true,否則返回false
countTokens() 得到一共有多少個(gè)語(yǔ)言符號(hào)
文本框和文本區(qū)
1、文本框
TextField() 構(gòu)造文本框,一個(gè)字符長(zhǎng)
TextField(int x) 構(gòu)造文本框,x個(gè)字符長(zhǎng)
TextField(String s) 構(gòu)造文本框,顯示s
setText(String s) 設(shè)置文本為s
getText() 獲取文本
setEchoChar(char c) 設(shè)置顯示字符為c
setEditable(boolean) 設(shè)置文本框是否可以被修改
addActionListener() 添加監(jiān)視器
removeActionListener() 移去監(jiān)視器
2、文本區(qū)
TextArea() 構(gòu)造文本區(qū)
TextArea(String s) 構(gòu)造文本區(qū),顯示s
TextArea(String s,int x,int y) 構(gòu)造文本區(qū),x行,y列,顯示s
TextArea(int x,int y) 構(gòu)造文本區(qū),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) 設(shè)置文本為s
getText() 獲取文本
addTextListener() 添加監(jiān)視器
removeTextListener() 移去監(jiān)視器
insert(String s,int x) 在x處插入文本s
replaceRange(String s,int x,int y) 用s替換從x到y(tǒng)處的文本
append(String s) 在文本的最后追加文本s
Int getCaretPosition(int n) 獲取文本區(qū)中光標(biāo)的位置
按鈕
1、按鈕
Button() 構(gòu)造按鈕
Button(String s) 構(gòu)造按鈕,標(biāo)簽是s
setLabel(String s) 設(shè)置按鈕標(biāo)簽是s
getLabel() 獲取按鈕標(biāo)簽
addActionListener() 添加監(jiān)視器
removeActionListener() 移去監(jiān)視器
標(biāo)簽
1、標(biāo)簽
Label() 構(gòu)造標(biāo)簽
Label(String s) 構(gòu)造標(biāo)簽,顯示s
Label(String s,int x)
x是對(duì)齊方式,取值:
Label.LEFT
Label.RIGHT
Label.CENTER
setText(String s) 設(shè)置文本s
getText() 獲取文本
setBackground(Color c) 設(shè)置標(biāo)簽背景顏色
setForeground(Color c) 設(shè)置字體顏色
選擇框
1、選擇框
Checkbox() 構(gòu)造選擇框
Checkbox(String s) 構(gòu)造選擇框,給定標(biāo)題s
Checkbox(String s,boolean b) b設(shè)定初始狀態(tài)
Checkbox(String s,boolean b,CheckboxGroup g) g設(shè)定了所屬的組(有了組就成為單選框)
addItemListener() 添加監(jiān)視器
removeItemListener() 移去監(jiān)視器
getState() 返回選擇框的是否選中狀態(tài)
setState(boolean b) 設(shè)置選擇框的狀態(tài)
getLabel() 獲取選擇框的標(biāo)題
setLabel(String s) 設(shè)置選擇框的標(biāo)題為s
選擇控件和滾動(dòng)列表
1、選擇控件
Choice() 構(gòu)造選擇控件
add(String s) 向選擇控件增加一個(gè)選項(xiàng)
addItemListener() 添加監(jiān)視器
removeItemListener() 移去監(jiān)視器
getSelectedIndex() 返回當(dāng)前選項(xiàng)的索引
getSelectedItem() 返回當(dāng)前選項(xiàng)的字符串代表
insert(String s,int n) 在n處插入選項(xiàng)s
remove(int n)
removeAll()
2、滾動(dòng)列表
List() 構(gòu)造滾動(dòng)列表
List(int n) 參數(shù)n是可見(jiàn)行數(shù)
List(int n,boolean b) 參數(shù)b是設(shè)置是否可以多項(xiàng)選擇
add(String s) 向列表的結(jié)尾增加一個(gè)選項(xiàng)
add(String s,int n) 在n處增加一個(gè)選項(xiàng)
AddActionListener() 滾動(dòng)列表添加監(jiān)視器
addItemListener() 滾動(dòng)列表上的選項(xiàng)添加監(jiān)視器
remove(int n) 刪除n初的選項(xiàng)
remnoveAll() 刪除全部選項(xiàng)
getSelectedIndex() 返回當(dāng)前選項(xiàng)的索引
getSelectedItem() 返回當(dāng)前選項(xiàng)的字符串代表
3、組件類(lèi)的一些常用方法
void setBackground(Color c) 設(shè)置組件背景顏色
void setForeground(Color c) 設(shè)置組件前景顏色
void setFonts(Font f) 設(shè)置組件字體
void setBounds(int x,int y,int w,int h) 設(shè)置坐標(biāo),x,y表示在容器中坐標(biāo),w,h表示寬和高
void setLocation(int x,int y) 移動(dòng)到x,y 處
void setSize(int w,int h) 設(shè)置寬和高
void setVisible(boolean b) 設(shè)置組建是否可見(jiàn)
int getBounds().wigth 獲取寬
int getBounds().height 獲取高
int getBounds().x 獲取x 坐標(biāo)
int getBounds().y 獲取y 坐標(biāo)
Toolkit getToolkit() 獲取工具包對(duì)
void setEnabled(boolean b) 設(shè)置是否可以使用(默認(rèn)可以)
窗口和菜單
1、窗口
Frame() 構(gòu)造窗口
Frame(String s) 窗口標(biāo)題是s
setBounds(int x,int y,int w,int h) 窗口位置x,y,寬w,高y
setSize(int w,int h) 設(shè)置窗口位置(單位是像素)
setBackground(Color c) 設(shè)置背景顏色
setVisible(boolean b) 設(shè)置窗口是否可見(jiàn)
pack() 窗口出現(xiàn)時(shí)緊湊
setTitle(String s) 設(shè)置標(biāo)題為s
getTitle() 獲取標(biāo)題
setResizable(boolean b) 設(shè)置窗口大小是否可以調(diào)整
2、菜單條
Menubar() 構(gòu)造菜單條
setMenubar() 窗口添加菜單條
3、菜單
Menu() 構(gòu)造菜單
Menu(String s) 構(gòu)造菜單,標(biāo)題s
add
add(MenuItem item) 菜單增加菜單選項(xiàng)item
add(String s) 向菜單增加選項(xiàng)s
getItem(int n) 獲取n處的選項(xiàng)
getItemCount() 獲取選項(xiàng)數(shù)目
insert(MenuItem item,int n) 在n處插入菜單選項(xiàng)item
insert(String s,int n) 在n處插入菜單選項(xiàng)
remove(int n) 刪除菜單的n處的菜單選項(xiàng)
removeAll() 刪除全部
4、菜單項(xiàng)
MenuItem() 構(gòu)造菜單項(xiàng)
MenuItem(String s) 構(gòu)造標(biāo)題是s的菜單項(xiàng)
setEnabled(boolean b) 設(shè)置是否可以被選擇
getLabel() 得到菜單選項(xiàng)名
addActionListener() 添加監(jiān)視器
5、有關(guān)菜單的技巧
addSeparator() 增加菜單分割線(xiàn)
CheckboxMenuItem() 復(fù)選框菜單項(xiàng)
setShortcut(MenuShortcut k) 設(shè)置快捷鍵(k取值KeyEvent.VK_A----KeyEvent.VK_Z)
建立對(duì)話(huà)框
1、Dialog類(lèi)
Dialog(Frame f,String s) 構(gòu)造對(duì)話(huà)框,初始不可見(jiàn),s是標(biāo)題,f是對(duì)話(huà)框所依賴(lài)的窗口
Dialog(Frame f,String s,boolean b) b設(shè)置初始是否可見(jiàn)
getTitle() 獲取對(duì)話(huà)框標(biāo)題
setTitle(String s) 設(shè)置對(duì)話(huà)框標(biāo)題
setModal(boolean b) 設(shè)置對(duì)話(huà)框模式
setSize(int w,int h) 設(shè)置對(duì)話(huà)框大小
setVisible(boolean b) 顯示或隱藏對(duì)話(huà)框
2、FileDialog類(lèi)
Filedialog(Frame f,String s,int mode) mode的值是fileDialog.LOAD或者fileDialog.SAVE
public String getDirectory() 獲取當(dāng)前文件對(duì)話(huà)框中顯示的文件所屬目錄
public String getFile() 獲取當(dāng)前文件對(duì)話(huà)框中文件的字符串表示,不存在返回null
Java中的鼠標(biāo)和鍵盤(pán)事件
1、使用MouseListener借口處理鼠標(biāo)事件
鼠標(biāo)事件有5種:按下鼠標(biāo)鍵,釋放鼠標(biāo)鍵,點(diǎn)擊鼠標(biāo)鍵,鼠標(biāo)進(jìn)入和鼠標(biāo)退出
鼠標(biāo)事件類(lèi)型是MouseEvent,主要方法有:
getX(),getY() 獲取鼠標(biāo)位置
getModifiers() 獲取鼠標(biāo)左鍵或者右鍵
getClickCount() 獲取鼠標(biāo)被點(diǎn)擊的次數(shù)
getSource() 獲取鼠標(biāo)發(fā)生的事件源
事件源獲得監(jiān)視器的方法是addMouseListener(),移去監(jiān)視器的方法是removeMouseListener()
處理事件源發(fā)生的時(shí)間的事件的接口是MouseListener 接口中有如下的方法
mousePressed(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)按下事件
mouseReleased(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)釋放事件
mouseEntered(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)進(jìn)入容器事件
mouseExited(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)離開(kāi)事件
mouseClicked(MouseEvent) 負(fù)責(zé)處理點(diǎn)擊事件
2、使用MouseMotionListener接口處理鼠標(biāo)事件
事件源發(fā)生的鼠標(biāo)事件有2種:拖動(dòng)鼠標(biāo)和鼠標(biāo)移動(dòng)
鼠標(biāo)事件的類(lèi)型是MouseEvent
事件源獲得監(jiān)視器的方法是addMouseMotionListener()
處理事件源發(fā)生的事件的接口是MouseMotionListener 接口中有如下的方法
mouseDragged() 負(fù)責(zé)處理鼠標(biāo)拖動(dòng)事件
mouseMoved() 負(fù)責(zé)處理鼠標(biāo)移動(dòng)事件
3、控制鼠標(biāo)的指針形狀
setCursor(Cursor.getPreddfinedCursor(Cursor.鼠標(biāo)形狀定義)) 鼠標(biāo)形狀定義見(jiàn)(書(shū) P 210)
4、鍵盤(pán)事件
鍵盤(pán)事件源使用addKeyListener 方法獲得監(jiān)視器
鍵盤(pán)事件的接口是KeyListener 接口中有3個(gè)方法
public void keyPressed(KeyEvent e) 按下鍵盤(pán)按鍵
public void keyReleased(KeyEvent e) 釋放鍵盤(pán)按鍵
public void keyTypde(KeyEvent e) 按下又釋放鍵盤(pán)按鍵
Java多線(xiàn)程機(jī)制
1、Java的線(xiàn)程類(lèi)與Runnable接口
Thread類(lèi)
public Thread() 創(chuàng)建線(xiàn)程對(duì)象
public Thread(Runnable target) target 稱(chēng)為被創(chuàng)建線(xiàn)程的目標(biāo)對(duì)象,負(fù)責(zé)實(shí)現(xiàn)Runnable接口
線(xiàn)程優(yōu)先級(jí)
Thread類(lèi)有三個(gè)有關(guān)線(xiàn)程優(yōu)先級(jí)的靜態(tài)常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
新建線(xiàn)程將繼承創(chuàng)建它的副相承的優(yōu)先級(jí),用戶(hù)可以調(diào)用Thread類(lèi)的setPriority(int a)來(lái)修改
a的取值:
Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY
主要方法
啟動(dòng)線(xiàn)程 start()
定義線(xiàn)程操作 run()
使線(xiàn)程休眠 sleep()
sleep(int millsecond) 以毫秒為單位的休眠時(shí)間
sleep(int millsecond,int nanosecond) 以納秒為單位的休眠時(shí)間
currentThread() 判斷誰(shuí)在占用CPU的線(xiàn)程
第二十章 輸入輸出流
1、FileInputStream類(lèi)
FileInputStream(String name) 使用給定的文件名name創(chuàng)建一個(gè)FileInputStream對(duì)象
FileInputStream(File file) 使用File對(duì)象創(chuàng)建FileInpuStream對(duì)象
File類(lèi)有兩個(gè)常用方法:
File(String s) s確定文件名字
File(String directory,String s) directory是文件目錄
例如:
File f=new File("Myfile.dat");
FileInputStream istream=new FileInputStream(f);
處理I/O異常
當(dāng)出現(xiàn)I/O錯(cuò)誤的時(shí)候,Java生成一個(gè)IOException(I/O異常)對(duì)象來(lái)表示這個(gè)錯(cuò)誤的信號(hào)。
程序必須使用一個(gè)catch檢測(cè)這個(gè)異常
例如:
try{
FileInputStream ins= new FileInputStream("Myfile.dat");
}
catch(IOException e){
System.out.println("File read Error:"+e);
}
從輸入流中讀取字節(jié)
int read() 返回0~255之間一個(gè)整數(shù),如果到輸入流末尾,則返回-1
int read(byte b[]) 讀取字節(jié)數(shù)組
int read(byte b[],int off,int len) off指定把數(shù)據(jù)存放在b中什么地方,len指定讀取的最大字節(jié)數(shù)
關(guān)閉流
close()
2、FileOutputStream類(lèi)
FileOutputStream(String name) 使用指定的文件名name創(chuàng)建FileOutputStream對(duì)象
FileOutputStream(File file) 使用file對(duì)象創(chuàng)建FileOutputStream對(duì)象
FileOutputStream(FileDescriptor fdobj) 使用FileDescriptor對(duì)象創(chuàng)建FileOutputStream對(duì)象
3、FileReader類(lèi)和FileWriter類(lèi)
FileReader(String filename)
FileWriter(String filename)
處理時(shí)需要FileNotFoundException異常
4、RandomAccessFile類(lèi)
RandomAccessFile不同于FileInputStream和FileOutputStream,不是他們的子類(lèi)
當(dāng)我們想對(duì)一個(gè)文件進(jìn)行讀寫(xiě)操作的時(shí)候,創(chuàng)建一個(gè)指向該文件的RandomAccessFile流就可以了
RandomAccessFile類(lèi)有兩個(gè)構(gòu)造方法:
RandomAccessFile(String name, String mode) name是文件名,mode取r(只讀)或rw(讀寫(xiě))
RandomAccessFile(File file,String mode) file給出創(chuàng)建流的源
seek(long a) 移動(dòng)RandomAccessFile流指向文件的指針,a確定指針距文件開(kāi)頭的位置
getFilePointer() 獲取當(dāng)前文件的指針位置
close() 關(guān)閉文件
getFD() 獲取文件的FileDescriptor
length() 獲取文件長(zhǎng)度
read() 讀取一個(gè)字節(jié)數(shù)據(jù)
readBoolean() 讀取一個(gè)布爾值
readByte() 讀取一個(gè)字節(jié)
readChar()
readFloat()
readFully(byte b[])
readInt()
readLine()
readLong()
readUnsignedShort()
readUTF() 讀取一個(gè)UTF字符串
setLength(long newLength) 設(shè)置文件長(zhǎng)度
skipByte(int n) 在文件中跳過(guò)給定數(shù)量的字節(jié)
write(byte b[]) 寫(xiě)b.length個(gè)字節(jié)到文件
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類(lèi)
PipedInputStream() 創(chuàng)建一個(gè)管道輸入流
PipedInputStream(PipedOutputStream a) 連接到輸出流a的輸入流
read() 從輸入流中讀取一個(gè)字節(jié)
read(byte b[],int off,int len) off是在b中的開(kāi)始位置,len是字節(jié)長(zhǎng)度
PipedOutputStream類(lèi)
PipedOutputStream() 創(chuàng)建一個(gè)輸出流
PipedOutputStream(PipedInputStream a) 連接到輸入流a的輸出流
write(int b)
write(byte b[],int off,int len)
counnect() 連接輸入輸出流
close() 關(guān)閉流
在使用的時(shí)候要捕獲IOException異常。
6、數(shù)據(jù)流
DataInputStream類(lèi)(數(shù)據(jù)輸入流)
DataInputStream(InputStream in) 將數(shù)據(jù)輸入流指向一個(gè)由in指定的輸入流
DataOutputStream類(lèi)(數(shù)據(jù)輸出流)
DataOutputStream(OutputStream out) 將數(shù)據(jù)輸出流指向一個(gè)由out指定的輸出流
主要方法:
close()
read() 讀取一個(gè)字節(jié)數(shù)據(jù)
readBoolean() 讀取一個(gè)布爾值
readByte() 讀取一個(gè)字節(jié)
readChar()
readFloat()
readFully(byte b[])
readInt()
readLine()
readLong()
readUnsignedShort()
readUTF() 讀取一個(gè)UTF字符串
skipByte(int n) 在文件中跳過(guò)給定數(shù)量的字節(jié)
write(byte b[]) 寫(xiě)b.length個(gè)字節(jié)到文件
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、對(duì)象流
ObjectInputStream類(lèi)和ObjectOutputStream類(lèi)分別是DataInputStream類(lèi)和DataOutputStream類(lèi)的子類(lèi)
8、回壓輸入流
PushbackInputStream類(lèi)
PushbackInputStream(InputStream in)
PushbackReader類(lèi)
PushbackReader(Reader in)
unread(char c) 回壓一個(gè)字符
unread(char c[]) 回壓數(shù)組c中全部字符
unread(char c[],offset,int n) 回壓c中從offset開(kāi)始的n個(gè)字符
java網(wǎng)絡(luò)的基本知識(shí)
1、使用URL(統(tǒng)一資源定位)
例如:
try
{
url=new URL("http://www.sina.com.cn";
}
catch(MalformedURLException e)
{
System.out.println("Bad URL:"+url);
}
在Applet 中鏈接向另外的Web頁(yè)面,使用代碼:
getAppletContext().showDocument(url);
2、套接字
客戶(hù)建立到服務(wù)器的套接字(Socket)
Socket(String host,int port) host是服務(wù)器的IP地址,port是端口號(hào)
建立了套接字后可以使用getInputStream()獲得輸入流
還可以使用getOutputStream()獲得一個(gè)輸出流
服務(wù)器建立接受客戶(hù)套接字的服務(wù)器套接字(ServerSocket)
ServerSocket(int port) port是端口號(hào)
建立了套接字連接后可以使用accept()接收客戶(hù)的套接字
可以使用getOutputStream()獲得一個(gè)輸出流
還可以使用getInputStream()獲得一個(gè)輸入流
3、InetAddress類(lèi)
getByName(String )
3、InetAddress類(lèi)
getByName(String s) 獲取Internet上主機(jī)的地址
getHostName() 獲取InetAddress對(duì)象所包含的域名
getHostAddress() 獲取InetAddress對(duì)象所包含的IP地址
getLocalHost() 獲取本地地址
4、UDP數(shù)據(jù)報(bào)
發(fā)送數(shù)據(jù)包,即使用DatagramPacket類(lèi)將數(shù)據(jù)打包,有兩種構(gòu)造方法
DatagramPacket(byte data[],int length,InetAddress address,int port)
?含有data數(shù)組的數(shù)據(jù)
?該數(shù)據(jù)包將發(fā)送到地質(zhì)是address,端口是port的主機(jī)上
DatagramPacket(byte data[],int offset,int length,InetAddress address,int port)
?含有data數(shù)組的從offset開(kāi)始,length長(zhǎng)度的數(shù)據(jù)
?該數(shù)據(jù)包將發(fā)送到地質(zhì)是address,端口是port的主機(jī)上
接收數(shù)據(jù)包,即使用DatagramSocket(int port)創(chuàng)建一個(gè)對(duì)象,port必須和待接收的數(shù)據(jù)包的端口相同
例如:
如果發(fā)送方的數(shù)據(jù)包端口是5566
DatagramSocket mail=new DatagramSocket(5566);
然后對(duì)象mail可以使用方法receive(Datagrampacket pack)接收數(shù)據(jù)包
在使用參數(shù)pack 接收數(shù)據(jù)包前,必須創(chuàng)建pack
byte data[]=new byte[100];
int length=90;
DatagramPacket pack=new DatagramPataet(data,length);
mail.receive(pack);
該數(shù)據(jù)包pack將接收長(zhǎng)度是length的數(shù)據(jù)放入data,注意數(shù)據(jù)長(zhǎng)度不要超過(guò)8192KB
pack還可以調(diào)用方法getPort()獲取所接受數(shù)據(jù)包是從什么端口發(fā)出的
調(diào)用方法InetAddress getAddress()可以獲知數(shù)據(jù)包來(lái)自哪個(gè)主機(jī)
Java與圖像
1、java支持的圖像類(lèi)型:GIF,JPEG,BMP
2、Image類(lèi)
首先申請(qǐng)一個(gè)Image對(duì)象
Image img =getImage(URL url,String name) url是圖像地址,name是圖片名稱(chēng)
通常使用:
Image img =getImage(getCodBase(),String name) getCodBase()獲取當(dāng)前小應(yīng)用程序的URL,也就是在同一目錄下
圖像被加載后,就可以在paint()中繪制了
drawImage(Image img,int x,int y,ImageObserver observer)
img是上面獲取的圖像, x,y是指定圖像左上角的位置,observer是加載圖像時(shí)的圖像觀(guān)察器
Applet類(lèi)已經(jīng)實(shí)現(xiàn)了ImageObserver接口,所以可以直接使用this作為最后一個(gè)參數(shù)
drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
width和height是要繪制的圖像的寬和高
可以使用img.getHeight(this)和img.getWidth(this)來(lái)獲取被加載的圖像的寬和高
3、設(shè)置Java窗口圖標(biāo)
Frame對(duì)象可以使用setIconImage(Image img)方法設(shè)置左上角圖標(biāo),默認(rèn)圖標(biāo)是咖啡杯
Java數(shù)據(jù)庫(kù)連接(JDBC)
1、JDBC-ODBC橋接器
建立JDBC-ODBC橋接器
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
連接到數(shù)據(jù)庫(kù)
try
{
Connection con=DriverManager.getConnection("jdbcdbc:數(shù)據(jù)源名稱(chēng)","數(shù)據(jù)源的login name",
"數(shù)據(jù)源的password");
}
catch(SQLException e){}
向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句
try
{
Statement sql=con.createStatement();
}
catch(SQLException e){}
處理查詢(xún)結(jié)果
ResultSet rs=sql.executeQuery("SQL語(yǔ)句");
第二十四章 Java與多媒體
1、在小程序中播放聲音
java可以播放au,aiff,wav,midi,rfm格式的音頻
可以調(diào)用Applet的一個(gè)靜態(tài)方法:
newAudioClip(URL url,String name) url是地址,name是音頻名稱(chēng)
也可以用Applet類(lèi)的實(shí)例方法:
getAudioClip(URL url,String name)
根據(jù)url地址和聲音文件name,獲得一個(gè)用于播放的音頻對(duì)象,這對(duì)象可以使用下面的方法來(lái)處理聲音:
play() 播放聲音文件name
loop() 循環(huán)播放name
stop() 停止播放name
2、Java媒體框架(JMF)
創(chuàng)建播放器
try
{
URL url=new URL(getDocumenBase(),視頻文件名稱(chēng));
player player=Manager.createPlayer(url);
}
catch(IOException e){}
向播放器注冊(cè)控制監(jiān)視器
player.addControllerListener(監(jiān)視器);
創(chuàng)建監(jiān)視器必須使用接口ControllerListener ,該接口中的方法是
public void controllerUpdate(ControllerEvent e)
讓播放器對(duì)媒體進(jìn)行預(yù)提取
player.prefetch()
啟動(dòng)播放器
player.start();
停止播放器
player.stop();
停止播放器后必須釋放內(nèi)存中的資源
player.deallocate();
Java Swing基礎(chǔ)
1、Jcomponent類(lèi)
Jcomponent類(lèi) 是所有輕量組件的父類(lèi),主要的子類(lèi)有:
JButton 創(chuàng)建按鈕對(duì)象,而且可以創(chuàng)建在圖標(biāo)的按鈕
JComboBox 創(chuàng)建組合框?qū)ο螅虲hoice相似
JCheckBox 創(chuàng)建復(fù)選框?qū)ο?
JFileChooser 創(chuàng)建文件選擇器
JInternalFrame 創(chuàng)建內(nèi)部窗體
JLabel 創(chuàng)建標(biāo)簽
JMenu 創(chuàng)建菜單對(duì)象
JMenuBar 創(chuàng)建菜單條對(duì)象
JMenuItem 創(chuàng)建菜單項(xiàng)對(duì)象
JPanel 創(chuàng)建面板對(duì)象
JPasswordField 創(chuàng)建口令文本對(duì)象
JPopupMenu 創(chuàng)建彈出式菜單
JProgressBar 創(chuàng)建進(jìn)程條
JRadioButton 創(chuàng)建單選按鈕
JScrollBar 創(chuàng)建滾動(dòng)條
JScrollPane 創(chuàng)建滾動(dòng)窗格
JSlider 創(chuàng)建滾動(dòng)條
JSplitPane 創(chuàng)建拆分窗格
JTable 創(chuàng)建表格
JTextArea 創(chuàng)建文本區(qū)
JTexPane 創(chuàng)建文本窗格
JToolBar 創(chuàng)建工具條
JToolTip 創(chuàng)建工具提示對(duì)象
JTree 創(chuàng)建樹(shù)對(duì)象
2、JFrame類(lèi)
JFrame類(lèi)及其子類(lèi)創(chuàng)建的對(duì)象是窗體
(1)JFrame類(lèi)及其子類(lèi)創(chuàng)建的窗體是swing窗體
(2)不可以把組件直接加到swing窗體中,應(yīng)該把組件加到內(nèi)容面板中
(3)不能為swing窗體設(shè)置布局,而應(yīng)當(dāng)為內(nèi)容面板設(shè)置布局
(4)swing窗體通過(guò)調(diào)用getContentPane()方法得到它的內(nèi)容面板
3、JApplet類(lèi)
(1)不可以把組件直接添加到小程序容器中,也應(yīng)該添加到內(nèi)容面板中
(2)不能為小程序設(shè)置布局
(3)小程序容器通過(guò)調(diào)用getContenPane()方法得到內(nèi)容面板
4、JDialog類(lèi)
(1)不可以把組件直接添加到對(duì)話(huà)框容器中,也應(yīng)該添加到內(nèi)容面板中
(2)不能為對(duì)話(huà)框設(shè)置布局
(3)對(duì)話(huà)框容器通過(guò)調(diào)用getContenPane()方法得到內(nèi)容面板
5、JPanel面板
JPanel()
JPanel(布局對(duì)象)
6、滾動(dòng)窗口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的取值決定拆分線(xiàn)移動(dòng)的時(shí)候組件是否連續(xù)變化
8、內(nèi)部窗體JInternalFrame
JInternalFrame(String title,boolean resizable,booleam closable,boolean max,boolean min)
參數(shù)的意義分別是窗口名稱(chēng),是否能調(diào)整大小,是否有關(guān)閉按鈕,最大化按鈕,最小化按鈕
(1)不能把組件直接加到窗體中,而是加到內(nèi)容面板中
(2)必須先把內(nèi)部窗體加到一個(gè)容器中(JDesktopPane),該容器是專(zhuān)門(mén)為內(nèi)部窗體服務(wù)的
9、按鈕(JButton)
JButton() 創(chuàng)建按鈕
JButton(String s) s是按鈕的名字
JButton(Icon icon) icon是按鈕上的圖標(biāo)
JButton(String s,Icon icon)
getText() 獲取按鈕名字
getIcon() 獲取按鈕圖標(biāo)
setIcon(Icon icon) 設(shè)置按鈕圖標(biāo)
setHorizontalTextposition(int a) a確定按鈕上圖標(biāo)的位置,取值:
AbstractButton_CENTR,AbstractButton_LEFT,AbstractButton_RIGHT
setVerticalTextposition(int a) a確定按鈕上名字相對(duì)圖標(biāo)的位置,取值:
AbstractButton.TOP,AbstractButton.BOTTOM,AbstractButton.CENTR
setMnemonic(char c) 設(shè)置按鈕的鍵盤(pán)操作方式是字符c(Alt+c)
setEnabled(boolean b) b決定按鈕是否可以被單擊
17.你需要學(xué)習(xí)企業(yè)級(jí)JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。
18.你需要學(xué)習(xí)如何管理與配置一個(gè)J2EE應(yīng)用程序服務(wù)器,如WebLogic,JBoss等,并且利用它的附加服務(wù),例如簇類(lèi),連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應(yīng)用程序并且能夠監(jiān)控、調(diào)整它的性能。
19.你需要熟悉面向方面的程序設(shè)計(jì)以及面向?qū)傩缘某绦蛟O(shè)計(jì)(這兩個(gè)都被很容易混淆的縮寫(xiě)為AOP),以及他們的主流JAVA規(guī)格和執(zhí)行。例如AspectJ和AspectWerkz。
20.你需要熟悉對(duì)不同有用的API和framework等來(lái)為你服務(wù)。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。
21.如果你將要對(duì)接或者正和舊的系統(tǒng)或者本地平臺(tái),你需要學(xué)習(xí)JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。
22.你需要熟悉JINI技術(shù)以及與它相關(guān)的分布式系統(tǒng),比如掌握CROBA。
23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。
24.你應(yīng)該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來(lái)編寫(xiě)文件。隨便你用什么了:)
25.JAVA(精確的說(shuō)是有些配置)是冗長(zhǎng)的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
26.你需要熟悉一種單元測(cè)試體系(JNunit),并且學(xué)習(xí)不同的生成、部署工具(Ant,Maven)。
27.你需要熟悉一些在JAVA開(kāi)發(fā)中經(jīng)常用到的軟件工程過(guò)程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。
28.你需要能夠深入了解加熟練操作和配置不同的操作系統(tǒng),比如GNU/linux,sunsolaris,macOS等,做為跨平臺(tái)軟件的開(kāi)發(fā)者。
29.你還需要緊跟java發(fā)展的步伐,比如現(xiàn)在可以深入的學(xué)習(xí)javaME,以及各種java新規(guī)范,技術(shù)的運(yùn)用,如新起的web富客戶(hù)端技術(shù)。
30.你必需要對(duì)opensource有所了解,因?yàn)橹辽賘ava的很多技術(shù)直接是靠開(kāi)源來(lái)驅(qū)動(dòng)發(fā)展的,如java3D技術(shù)。
17.你需要學(xué)習(xí)企業(yè)級(jí)JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。
18.你需要學(xué)習(xí)如何管理與配置一個(gè)J2EE應(yīng)用程序服務(wù)器,如WebLogic,JBoss等,并且利用它的附加服務(wù),例如簇類(lèi),連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應(yīng)用程序并且能夠監(jiān)控、調(diào)整它的性能。
19.你需要熟悉面向方面的程序設(shè)計(jì)以及面向?qū)傩缘某绦蛟O(shè)計(jì)(這兩個(gè)都被很容易混淆的縮寫(xiě)為AOP),以及他們的主流JAVA規(guī)格和執(zhí)行。例如AspectJ和AspectWerkz。
20.你需要熟悉對(duì)不同有用的API和framework等來(lái)為你服務(wù)。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。
21.如果你將要對(duì)接或者正和舊的系統(tǒng)或者本地平臺(tái),你需要學(xué)習(xí)JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。
22.你需要熟悉JINI技術(shù)以及與它相關(guān)的分布式系統(tǒng),比如掌握CROBA。
23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。
24.你應(yīng)該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來(lái)編寫(xiě)文件。隨便你用什么了:)
25.JAVA(精確的說(shuō)是有些配置)是冗長(zhǎng)的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
26.你需要熟悉一種單元測(cè)試體系(JNunit),并且學(xué)習(xí)不同的生成、部署工具(Ant,Maven)。
27.你需要熟悉一些在JAVA開(kāi)發(fā)中經(jīng)常用到的軟件工程過(guò)程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。
28.你需要能夠深入了解加熟練操作和配置不同的操作系統(tǒng),比如GNU/linux,sunsolaris,macOS等,做為跨平臺(tái)軟件的開(kāi)發(fā)者。
29.你還需要緊跟java發(fā)展的步伐,比如現(xiàn)在可以深入的學(xué)習(xí)javaME,以及各種java新規(guī)范,技術(shù)的運(yùn)用,如新起的web富客戶(hù)端技術(shù)。
30.你必需要對(duì)opensource有所了解,因?yàn)橹辽賘ava的很多技術(shù)直接是靠開(kāi)源來(lái)驅(qū)動(dòng)發(fā)展的,如java3D技術(shù)。
封裝數(shù)據(jù)庫(kù)操作,目的就是為了隱藏
java.sql包內(nèi)的類(lèi),在編碼中去掉核心的數(shù)據(jù)庫(kù)操作代碼。以杜絕直接數(shù)據(jù)庫(kù)操作容易帶來(lái)的資源未釋放問(wèn)題。同時(shí)也減少了數(shù)據(jù)庫(kù)操作的編碼量。
但是很多網(wǎng)友在封裝時(shí),卻喜歡返回結(jié)果集(ResultSet對(duì)象),那么這個(gè)封裝就沒(méi)有意義了。
1. 又是直接操作核心數(shù)據(jù)庫(kù)類(lèi),跟封裝前幾乎沒(méi)什么變化。
2. 結(jié)果集總是依賴(lài)于它使用的連接(Connection)對(duì)象。因此當(dāng)連接對(duì)象在方法內(nèi)被關(guān)閉后,你返回的ResultSet就沒(méi)有用了。
如果真的要獲得查詢(xún)數(shù)據(jù)庫(kù)的結(jié)果集,就把結(jié)果集對(duì)象內(nèi)的所有數(shù)據(jù),轉(zhuǎn)儲(chǔ)到以Map為元素的List對(duì)象內(nèi)。
當(dāng)然,這種方式,不能適應(yīng)大數(shù)據(jù)量的查詢(xún),不過(guò)如果真的碰到大數(shù)據(jù)量的查詢(xún),那用什么封裝都不好,還是得直接數(shù)據(jù)庫(kù)操作. :)))
下面是簡(jiǎn)單的數(shù)據(jù)庫(kù)操作Javabean的代碼
DbWrapper.java
import java.sql.*;
import java.util.*;
public class DbWrapper
{
// 定義連接池對(duì)象為靜態(tài)變量,將一直存在,直到工作目錄關(guān)閉。
private static DataSource ds = null;
// 1.用連接池的方式獲得連接
// 如果不是做多數(shù)據(jù)庫(kù)程序,推薦使用此方法
// 相關(guān)內(nèi)容:在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驅(qū)動(dòng)獲得連接
// 相關(guān)內(nèi)容:JSP數(shù)據(jù)庫(kù)連接大全
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.對(duì)于insert, update, delete語(yǔ)句int count = DbWrapper.executeUpdate(sql);
// 2.對(duì)于selete語(yǔ)句
java.util.List list = DbWrapper.executeQuery(sql);
// 方法一:按名字取值,注意大小寫(xiě)是嚴(yán)格區(qū)分的
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()); // 取值時(shí)注意null判斷
out.println(column_name + " = " + map.get(column_name) == null ? "" : map.get(column_name).toString());
}
}
封裝數(shù)據(jù)庫(kù)操作,目的就是為了隱藏
java.sql包內(nèi)的類(lèi),在編碼中去掉核心的數(shù)據(jù)庫(kù)操作代碼。以杜絕直接數(shù)據(jù)庫(kù)操作容易帶來(lái)的資源未釋放問(wèn)題。同時(shí)也減少了數(shù)據(jù)庫(kù)操作的編碼量。
但是很多網(wǎng)友在封裝時(shí),卻喜歡返回結(jié)果集(ResultSet對(duì)象),那么這個(gè)封裝就沒(méi)有意義了。
1. 又是直接操作核心數(shù)據(jù)庫(kù)類(lèi),跟封裝前幾乎沒(méi)什么變化。
2. 結(jié)果集總是依賴(lài)于它使用的連接(Connection)對(duì)象。因此當(dāng)連接對(duì)象在方法內(nèi)被關(guān)閉后,你返回的ResultSet就沒(méi)有用了。
如果真的要獲得查詢(xún)數(shù)據(jù)庫(kù)的結(jié)果集,就把結(jié)果集對(duì)象內(nèi)的所有數(shù)據(jù),轉(zhuǎn)儲(chǔ)到以Map為元素的List對(duì)象內(nèi)。
當(dāng)然,這種方式,不能適應(yīng)大數(shù)據(jù)量的查詢(xún),不過(guò)如果真的碰到大數(shù)據(jù)量的查詢(xún),那用什么封裝都不好,還是得直接數(shù)據(jù)庫(kù)操作. :)))
下面是簡(jiǎn)單的數(shù)據(jù)庫(kù)操作Javabean的代碼
DbWrapper.java
import java.sql.*;
import java.util.*;
public class DbWrapper
{
// 定義連接池對(duì)象為靜態(tài)變量,將一直存在,直到工作目錄關(guān)閉。
private static DataSource ds = null;
// 1.用連接池的方式獲得連接
// 如果不是做多數(shù)據(jù)庫(kù)程序,推薦使用此方法
// 相關(guān)內(nèi)容:在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驅(qū)動(dòng)獲得連接
// 相關(guān)內(nèi)容:JSP數(shù)據(jù)庫(kù)連接大全
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.對(duì)于insert, update, delete語(yǔ)句int count = DbWrapper.executeUpdate(sql);
// 2.對(duì)于selete語(yǔ)句
java.util.List list = DbWrapper.executeQuery(sql);
// 方法一:按名字取值,注意大小寫(xiě)是嚴(yán)格區(qū)分的
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()); // 取值時(shí)注意null判斷
out.println(column_name + " = " + map.get(column_name) == null ? "" : map.get(column_name).toString());
}
}
█
XML是eXtensible Markup Language的縮寫(xiě)。擴(kuò)展標(biāo)記語(yǔ)言XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語(yǔ)言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡(jiǎn)單易于掌握和使用。
XML與Access,Oracle和SQL Server等數(shù)據(jù)庫(kù)不同,數(shù)據(jù)庫(kù)提供了更強(qiáng)有力的數(shù)據(jù)存儲(chǔ)和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關(guān)一致性等,XML僅僅是展示數(shù)據(jù)。事實(shí)上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:他極其簡(jiǎn)單。這是一個(gè)看上去有點(diǎn)瑣細(xì)的優(yōu)點(diǎn),但正是這點(diǎn)使XML與眾不同。
XML的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫(xiě)數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語(yǔ)言,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺(tái)下產(chǎn)生的信息結(jié)合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果。
XML的前身是
SGML(The Standard Generalized Markup Language),是自IBM從60年代就開(kāi)始發(fā)展的
GML(Generalized Markup Language)
同
HTML一樣, XML (可擴(kuò)展標(biāo)識(shí)語(yǔ)言)是通用標(biāo)識(shí)語(yǔ)言標(biāo)準(zhǔn)(SGML)的一個(gè)子集,它是描述網(wǎng)絡(luò)上的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)的標(biāo)準(zhǔn)。盡管如此,XML不象HTML,HTML僅僅提供了在頁(yè)面上顯示信息的通用方法(沒(méi)有上下文相關(guān)和動(dòng)態(tài)功能) ,XML則對(duì)數(shù)據(jù)賦予上下文相關(guān)功能,它繼承了SGML的大部分功能,卻使用了不太復(fù)雜的技術(shù)。.
為了使得SGML顯得用戶(hù)友好,XML重新定義了SGML的一些內(nèi)部值和參數(shù),去掉了大量的很少用到的功能,這些繁雜的功能使得SGML在設(shè)計(jì)網(wǎng)站時(shí)顯得復(fù)雜化。XML保留了SGML的結(jié)構(gòu)化功能,這樣就使得網(wǎng)站設(shè)計(jì)者可以定義自己的文檔類(lèi)型,XML同時(shí)也推出一種新型文檔類(lèi)型,使得開(kāi)發(fā)者也可以不必定義文檔類(lèi)型。
因?yàn)閄ML是W3C制定的,XML的標(biāo)準(zhǔn)化工作由W3C的XML工作組負(fù)責(zé),該小組成員由來(lái)自各個(gè)地方和行業(yè)的專(zhuān)家組成,他們通過(guò)email交流對(duì)XML標(biāo)準(zhǔn)的意見(jiàn),并提出自己的看法 (
www.w3.org/TR/WD-xml)。因?yàn)閄ML 是個(gè)公共格式, (它不專(zhuān)屬于任何一家公司),你不必?fù)?dān)心XML技術(shù)會(huì)成為少數(shù)公司的盈利工具,XML不是一個(gè)依附于特定瀏覽器的語(yǔ)言
XML(可擴(kuò)展標(biāo)記語(yǔ)言)是從稱(chēng)為SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)的更加古老的語(yǔ)言派生出來(lái)的。SGML的主要目的是定義使用標(biāo)簽來(lái)表示數(shù)據(jù)的標(biāo)記語(yǔ)言的語(yǔ)法。
標(biāo)簽由包圍在一個(gè)小于號(hào)(<)和一個(gè)大于號(hào)(>)之間的文本組成,例如<tag>。起始標(biāo)簽(start tag)表示一個(gè)特定區(qū)域的開(kāi)始,例如<start>;結(jié)束標(biāo)簽(end tag)定義了一個(gè)區(qū)域的結(jié)束,除了在小于號(hào)之后緊跟著一個(gè)斜線(xiàn)(/)外,和起始標(biāo)簽基本一樣,例如</end>。SGML還定義了標(biāo)簽的特性(attribute),它們是定義在小于號(hào)和大于號(hào)之間的值,例如<img src="picture.jpg">中的src特性。如果你覺(jué)得它看起來(lái)很熟悉的話(huà),應(yīng)該知道,基于SGML的語(yǔ)言的最著名實(shí)現(xiàn)就是原始的HTML。
SGML常用來(lái)定義針對(duì)HTML的文檔類(lèi)型定義(DTD),同時(shí)它也常用于編寫(xiě)XML的DTD。SGML的問(wèn)題就在于,它允許出現(xiàn)一些奇怪的語(yǔ)法,這讓創(chuàng)建HTML的解析器成為一個(gè)大難題:
1 某些起始標(biāo)簽不允許出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<img>標(biāo)簽。包含了結(jié)束標(biāo)簽就會(huì)出現(xiàn)錯(cuò)誤。
2 某些起始標(biāo)簽可以選擇性出現(xiàn)結(jié)束標(biāo)簽或者隱含了結(jié)束標(biāo)簽,例如HTML中<p>標(biāo)簽,當(dāng)出現(xiàn)另一個(gè)<p>標(biāo)簽或者某些其他標(biāo)簽時(shí),便假設(shè)在這之前有一個(gè)結(jié)束標(biāo)簽。
3 某些起始標(biāo)簽要求必須出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<script>標(biāo)簽。
4 標(biāo)簽可以以任何順序嵌套。即使結(jié)束標(biāo)簽不按照起始標(biāo)簽的逆序出現(xiàn)也是允許的,例如,<b>This is a <i> sample </b> string</i>是正確的。
5 某些特性要求必須包含值,例如<img src="picture.jpg">中的src特性。
6 某些特性不要求一定有值,例如<td nowrap>中的nowrap特性。
7 定義特性的兩邊有沒(méi)有加上雙引號(hào)都是可以的,所以<img src="picture.jpg">和<img src=picture.jpg>都是允許的。
這些問(wèn)題使建立一個(gè)SGML語(yǔ)言的解析器變成了一項(xiàng)艱巨的任務(wù)。判斷何時(shí)應(yīng)用以上規(guī)則的困難導(dǎo)致了SGML語(yǔ)言的定義一直停滯不前。以這些問(wèn)題作為出發(fā)點(diǎn),XML逐漸步入我們的視野。
XML去掉了之前令許多開(kāi)發(fā)人員頭疼的SGML的隨意語(yǔ)法。在XML中,采用了如下的語(yǔ)法:
8 任何的起始標(biāo)簽都必須有一個(gè)結(jié)束標(biāo)簽。
9 可以采用另一種簡(jiǎn)化語(yǔ)法,可以在一個(gè)標(biāo)簽中同時(shí)表示起始和結(jié)束標(biāo)簽。這種語(yǔ)法是在大于符號(hào)之前緊跟一個(gè)斜線(xiàn)(/),例如<tag />。XML解析器會(huì)將其翻譯成<tag></tag>。
10 標(biāo)簽必須按合適的順序進(jìn)行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號(hào):在沒(méi)有關(guān)閉所有的內(nèi)部括號(hào)之前,是不能關(guān)閉外面的括號(hào)的。
11 所有的特性都必須有值。
12 所有的特性都必須在值的周?chē)由想p引號(hào)。
這些規(guī)則使得開(kāi)發(fā)一個(gè)XML解析器要簡(jiǎn)便得多,而且也除去了解析SGML中花在判斷何時(shí)何地應(yīng)用那些奇怪語(yǔ)法規(guī)則上的工作。僅僅在XML出現(xiàn)后的前六年就衍生出多種不同的語(yǔ)言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時(shí)也將HTML改進(jìn)為XHTML。
如果需要關(guān)于SGML和XML具體技術(shù)上的對(duì)比,請(qǐng)查看W3C的注解,位于:
http://www.w3. org/TR/NOTE-sgml-xml.html
如今,XML已經(jīng)是世界上發(fā)展最快的技術(shù)之一。它的主要目的是使用文本以結(jié)構(gòu)化的方式來(lái)表示數(shù)據(jù)。在某些方面,XML文件也類(lèi)似于數(shù)據(jù)庫(kù),提供數(shù)據(jù)的結(jié)構(gòu)化視圖。這里是一個(gè)XML文件的例子:
每個(gè)XML文檔都由XML序言開(kāi)始,在前面的代碼中的第一行便是XML序言,<?xml version="1.0"?>。這一行代碼會(huì)告訴解析器和瀏覽器,這個(gè)文件應(yīng)該按照前面討論過(guò)的XML規(guī)則進(jìn)行解析。第二行代碼,<books>,則是文檔元素(document element),它是文件中最外面的標(biāo)簽(我們認(rèn)為元素(element)是起始標(biāo)簽和結(jié)束標(biāo)簽之間的內(nèi)容)。所有其他的標(biāo)簽必須包含在這個(gè)標(biāo)簽之內(nèi)來(lái)組成一個(gè)有效的XML文件。XML文件的第二行并不一定要包含文檔元素;如果有注釋或者其他內(nèi)容,文檔元素可以遲些出現(xiàn)。
范例文件中的第三行代碼是注釋?zhuān)銜?huì)發(fā)現(xiàn)它與HTML中使用的注釋風(fēng)格是一樣的。這是XML從SGML中繼承的語(yǔ)法元素之一。
頁(yè)面再往下的一些地方,可以發(fā)現(xiàn)<desc>標(biāo)簽里有一些特殊的語(yǔ)法。<![CDATA[ ]]>代碼用于表示無(wú)需進(jìn)行解析的文本,允許諸如大于號(hào)和小于號(hào)之類(lèi)的特殊字符包含在文本中,而無(wú)需擔(dān)心破壞XML的語(yǔ)法。文本必須出現(xiàn)在<![CDATA[和]]>之間才能合適地避免被解析。這樣的文本稱(chēng)為Character Data Section,簡(jiǎn)稱(chēng)CData Section。
下面的一行就是在第二本書(shū)的定義之前的:
<?page render multiple authors ?>
雖然它看上去很像XML序言,但實(shí)際上是一種稱(chēng)為處理指令(processing instruction)的不同類(lèi)型的語(yǔ)法。處理指令(以下簡(jiǎn)稱(chēng)PI)的目的是為了給處理頁(yè)面的程序(例如XML解析器)提供額外的信息。PI通常情況下是沒(méi)有固定格式的,唯一的要求是緊隨第一個(gè)問(wèn)號(hào)必須至少有一個(gè)字母。在此之后,PI可以包含除了小于號(hào)和大于號(hào)之外的任何字符串序列。
最常見(jiàn)的PI是用來(lái)指定XML文件的樣式表:
這個(gè)PI一般會(huì)直接放在XML序言之后,通常由Web瀏覽器使用,來(lái)將XML數(shù)據(jù)以特殊的樣式顯示出來(lái)。
█
XML是eXtensible Markup Language的縮寫(xiě)。擴(kuò)展標(biāo)記語(yǔ)言XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語(yǔ)言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡(jiǎn)單易于掌握和使用。
XML與Access,Oracle和SQL Server等數(shù)據(jù)庫(kù)不同,數(shù)據(jù)庫(kù)提供了更強(qiáng)有力的數(shù)據(jù)存儲(chǔ)和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關(guān)一致性等,XML僅僅是展示數(shù)據(jù)。事實(shí)上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:他極其簡(jiǎn)單。這是一個(gè)看上去有點(diǎn)瑣細(xì)的優(yōu)點(diǎn),但正是這點(diǎn)使XML與眾不同。
XML的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫(xiě)數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語(yǔ)言,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺(tái)下產(chǎn)生的信息結(jié)合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果。
XML的前身是
SGML(The Standard Generalized Markup Language),是自IBM從60年代就開(kāi)始發(fā)展的
GML(Generalized Markup Language)
同
HTML一樣, XML (可擴(kuò)展標(biāo)識(shí)語(yǔ)言)是通用標(biāo)識(shí)語(yǔ)言標(biāo)準(zhǔn)(SGML)的一個(gè)子集,它是描述網(wǎng)絡(luò)上的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)的標(biāo)準(zhǔn)。盡管如此,XML不象HTML,HTML僅僅提供了在頁(yè)面上顯示信息的通用方法(沒(méi)有上下文相關(guān)和動(dòng)態(tài)功能) ,XML則對(duì)數(shù)據(jù)賦予上下文相關(guān)功能,它繼承了SGML的大部分功能,卻使用了不太復(fù)雜的技術(shù)。.
為了使得SGML顯得用戶(hù)友好,XML重新定義了SGML的一些內(nèi)部值和參數(shù),去掉了大量的很少用到的功能,這些繁雜的功能使得SGML在設(shè)計(jì)網(wǎng)站時(shí)顯得復(fù)雜化。XML保留了SGML的結(jié)構(gòu)化功能,這樣就使得網(wǎng)站設(shè)計(jì)者可以定義自己的文檔類(lèi)型,XML同時(shí)也推出一種新型文檔類(lèi)型,使得開(kāi)發(fā)者也可以不必定義文檔類(lèi)型。
因?yàn)閄ML是W3C制定的,XML的標(biāo)準(zhǔn)化工作由W3C的XML工作組負(fù)責(zé),該小組成員由來(lái)自各個(gè)地方和行業(yè)的專(zhuān)家組成,他們通過(guò)email交流對(duì)XML標(biāo)準(zhǔn)的意見(jiàn),并提出自己的看法 (
www.w3.org/TR/WD-xml)。因?yàn)閄ML 是個(gè)公共格式, (它不專(zhuān)屬于任何一家公司),你不必?fù)?dān)心XML技術(shù)會(huì)成為少數(shù)公司的盈利工具,XML不是一個(gè)依附于特定瀏覽器的語(yǔ)言
XML(可擴(kuò)展標(biāo)記語(yǔ)言)是從稱(chēng)為SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)的更加古老的語(yǔ)言派生出來(lái)的。SGML的主要目的是定義使用標(biāo)簽來(lái)表示數(shù)據(jù)的標(biāo)記語(yǔ)言的語(yǔ)法。
標(biāo)簽由包圍在一個(gè)小于號(hào)(<)和一個(gè)大于號(hào)(>)之間的文本組成,例如<tag>。起始標(biāo)簽(start tag)表示一個(gè)特定區(qū)域的開(kāi)始,例如<start>;結(jié)束標(biāo)簽(end tag)定義了一個(gè)區(qū)域的結(jié)束,除了在小于號(hào)之后緊跟著一個(gè)斜線(xiàn)(/)外,和起始標(biāo)簽基本一樣,例如</end>。SGML還定義了標(biāo)簽的特性(attribute),它們是定義在小于號(hào)和大于號(hào)之間的值,例如<img src="picture.jpg">中的src特性。如果你覺(jué)得它看起來(lái)很熟悉的話(huà),應(yīng)該知道,基于SGML的語(yǔ)言的最著名實(shí)現(xiàn)就是原始的HTML。
SGML常用來(lái)定義針對(duì)HTML的文檔類(lèi)型定義(DTD),同時(shí)它也常用于編寫(xiě)XML的DTD。SGML的問(wèn)題就在于,它允許出現(xiàn)一些奇怪的語(yǔ)法,這讓創(chuàng)建HTML的解析器成為一個(gè)大難題:
1 某些起始標(biāo)簽不允許出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<img>標(biāo)簽。包含了結(jié)束標(biāo)簽就會(huì)出現(xiàn)錯(cuò)誤。
2 某些起始標(biāo)簽可以選擇性出現(xiàn)結(jié)束標(biāo)簽或者隱含了結(jié)束標(biāo)簽,例如HTML中<p>標(biāo)簽,當(dāng)出現(xiàn)另一個(gè)<p>標(biāo)簽或者某些其他標(biāo)簽時(shí),便假設(shè)在這之前有一個(gè)結(jié)束標(biāo)簽。
3 某些起始標(biāo)簽要求必須出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<script>標(biāo)簽。
4 標(biāo)簽可以以任何順序嵌套。即使結(jié)束標(biāo)簽不按照起始標(biāo)簽的逆序出現(xiàn)也是允許的,例如,<b>This is a <i> sample </b> string</i>是正確的。
5 某些特性要求必須包含值,例如<img src="picture.jpg">中的src特性。
6 某些特性不要求一定有值,例如<td nowrap>中的nowrap特性。
7 定義特性的兩邊有沒(méi)有加上雙引號(hào)都是可以的,所以<img src="picture.jpg">和<img src=picture.jpg>都是允許的。
這些問(wèn)題使建立一個(gè)SGML語(yǔ)言的解析器變成了一項(xiàng)艱巨的任務(wù)。判斷何時(shí)應(yīng)用以上規(guī)則的困難導(dǎo)致了SGML語(yǔ)言的定義一直停滯不前。以這些問(wèn)題作為出發(fā)點(diǎn),XML逐漸步入我們的視野。
XML去掉了之前令許多開(kāi)發(fā)人員頭疼的SGML的隨意語(yǔ)法。在XML中,采用了如下的語(yǔ)法:
8 任何的起始標(biāo)簽都必須有一個(gè)結(jié)束標(biāo)簽。
9 可以采用另一種簡(jiǎn)化語(yǔ)法,可以在一個(gè)標(biāo)簽中同時(shí)表示起始和結(jié)束標(biāo)簽。這種語(yǔ)法是在大于符號(hào)之前緊跟一個(gè)斜線(xiàn)(/),例如<tag />。XML解析器會(huì)將其翻譯成<tag></tag>。
10 標(biāo)簽必須按合適的順序進(jìn)行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號(hào):在沒(méi)有關(guān)閉所有的內(nèi)部括號(hào)之前,是不能關(guān)閉外面的括號(hào)的。
11 所有的特性都必須有值。
12 所有的特性都必須在值的周?chē)由想p引號(hào)。
這些規(guī)則使得開(kāi)發(fā)一個(gè)XML解析器要簡(jiǎn)便得多,而且也除去了解析SGML中花在判斷何時(shí)何地應(yīng)用那些奇怪語(yǔ)法規(guī)則上的工作。僅僅在XML出現(xiàn)后的前六年就衍生出多種不同的語(yǔ)言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時(shí)也將HTML改進(jìn)為XHTML。
如果需要關(guān)于SGML和XML具體技術(shù)上的對(duì)比,請(qǐng)查看W3C的注解,位于:
http://www.w3. org/TR/NOTE-sgml-xml.html
如今,XML已經(jīng)是世界上發(fā)展最快的技術(shù)之一。它的主要目的是使用文本以結(jié)構(gòu)化的方式來(lái)表示數(shù)據(jù)。在某些方面,XML文件也類(lèi)似于數(shù)據(jù)庫(kù),提供數(shù)據(jù)的結(jié)構(gòu)化視圖。這里是一個(gè)XML文件的例子:
每個(gè)XML文檔都由XML序言開(kāi)始,在前面的代碼中的第一行便是XML序言,<?xml version="1.0"?>。這一行代碼會(huì)告訴解析器和瀏覽器,這個(gè)文件應(yīng)該按照前面討論過(guò)的XML規(guī)則進(jìn)行解析。第二行代碼,<books>,則是文檔元素(document element),它是文件中最外面的標(biāo)簽(我們認(rèn)為元素(element)是起始標(biāo)簽和結(jié)束標(biāo)簽之間的內(nèi)容)。所有其他的標(biāo)簽必須包含在這個(gè)標(biāo)簽之內(nèi)來(lái)組成一個(gè)有效的XML文件。XML文件的第二行并不一定要包含文檔元素;如果有注釋或者其他內(nèi)容,文檔元素可以遲些出現(xiàn)。
范例文件中的第三行代碼是注釋?zhuān)銜?huì)發(fā)現(xiàn)它與HTML中使用的注釋風(fēng)格是一樣的。這是XML從SGML中繼承的語(yǔ)法元素之一。
頁(yè)面再往下的一些地方,可以發(fā)現(xiàn)<desc>標(biāo)簽里有一些特殊的語(yǔ)法。<![CDATA[ ]]>代碼用于表示無(wú)需進(jìn)行解析的文本,允許諸如大于號(hào)和小于號(hào)之類(lèi)的特殊字符包含在文本中,而無(wú)需擔(dān)心破壞XML的語(yǔ)法。文本必須出現(xiàn)在<![CDATA[和]]>之間才能合適地避免被解析。這樣的文本稱(chēng)為Character Data Section,簡(jiǎn)稱(chēng)CData Section。
下面的一行就是在第二本書(shū)的定義之前的:
<?page render multiple authors ?>
雖然它看上去很像XML序言,但實(shí)際上是一種稱(chēng)為處理指令(processing instruction)的不同類(lèi)型的語(yǔ)法。處理指令(以下簡(jiǎn)稱(chēng)PI)的目的是為了給處理頁(yè)面的程序(例如XML解析器)提供額外的信息。PI通常情況下是沒(méi)有固定格式的,唯一的要求是緊隨第一個(gè)問(wèn)號(hào)必須至少有一個(gè)字母。在此之后,PI可以包含除了小于號(hào)和大于號(hào)之外的任何字符串序列。
最常見(jiàn)的PI是用來(lái)指定XML文件的樣式表:
這個(gè)PI一般會(huì)直接放在XML序言之后,通常由Web瀏覽器使用,來(lái)將XML數(shù)據(jù)以特殊的樣式顯示出來(lái)。