#
先來看一張簡單的文檔樹

很明顯樹的頂層節(jié)點(diǎn)是NodeA節(jié)點(diǎn),接下來可以通過指定的合適節(jié)點(diǎn)移動到樹中的任何點(diǎn),結(jié)合以下的代碼你可以更好的了解這棵樹節(jié)點(diǎn)間的相互關(guān)系:
NodeA.firstChild = NodeA1
NodeA.lastChild = NodeA3
NodeA.childNodes.length = 3
NodeA.childNodes[0] = NodeA1
NodeA.childNodes[1] = NodeA2
NodeA.childNodes[2] = NodeA3
NodeA1.parentNode = NodeA
NodeA1.nextSibling = NodeA2
NodeA3.prevSibling = NodeA2
NodeA3.nextSibling = null
NodeA.lastChild.firstChild = NodeA3a
NodeA3b.parentNode.parentNode = NodeA
DOM定義對操作一個(gè)文檔對象的節(jié)點(diǎn)結(jié)構(gòu)提供了實(shí)用的方法,它提供了像執(zhí)行對象插入,更新,刪除,克隆等這些常用的方法。
insertBefore()--在參考子節(jié)點(diǎn)之前插入一個(gè)新的子節(jié)點(diǎn).如果參考的子節(jié)點(diǎn)為null,則新的子節(jié)點(diǎn)將作為調(diào)用節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)插入。
replaceChild()--在childNodes集合種使用指定的newChild來代替oldChild;如果代替成功,則返回oldChild;如果newChild是null,則只需刪除oldChild即可。
removeChild()--從節(jié)點(diǎn)的ChildNodes集合中刪除removeChild指定的節(jié)點(diǎn),如果刪除成功,則返回刪除的子節(jié)點(diǎn)。
appendChild()--添加一個(gè)新節(jié)點(diǎn)到childNodes集合的末尾,如果成功,則返回新節(jié)點(diǎn)。
cloneNode()--創(chuàng)建一個(gè)新的、復(fù)制的節(jié)點(diǎn),并且如果傳入的參數(shù)是true時(shí),還將復(fù)制子節(jié)點(diǎn),如果節(jié)點(diǎn)是一個(gè)元素,那么還將復(fù)制相應(yīng)屬性,返回新的節(jié)點(diǎn)。
為了在一棵文檔樹中訪問或者建立一個(gè)新的節(jié)點(diǎn),可以用下面這些方法:
getElementById()
getElementsByTagName()
createElement()
createAttribute()
createTextNode()
注意:在一個(gè)頁面中只有一個(gè)文檔對象,除了getElementsByTagName()外,其它方法均只能通過document.methodName()調(diào)用。
再看一下下面這個(gè)例子:
<html>
<head>
<title></title>
</head>
<body>
<p>This is a sample paragraph.</p>
<SCRIPT LANGUAGE="JavaScript">
<!--
alert(document.documentElement.lastChild.firstChild.tagName);
//-->
</SCRIPT>
</body>
</html>
結(jié)果將會顯示"P",下面是一些解釋
document.documentElement - gives the page's HTML tag.
lastChild - gives the BODY tag.
firstChild - gives the first element in the BODY.
tagName - gives that element's tag name, "P" in this case.
另一個(gè):
<html>
<head>
<title></title>
</head>
<body>
<p>This is a sample paragraph.</p>
<SCRIPT LANGUAGE="JavaScript">
<!--
alert(document.documentElement.lastChild.firstChild.tagName);
//-->
</SCRIPT>
</body>
</html>
這個(gè)例子和上面并沒有什么大的區(qū)別,僅僅是多了一個(gè)空行,但是在NS中,會自動為空行加上一個(gè)節(jié)點(diǎn)所以返回值是"undefined",而在IE中將跳過空行仍然指向P標(biāo)簽。
更常用的方法:
<p id="myParagraph">This is a sample paragraph.</p>
...
alert(document.getElementById("myParagraph").tagName);
這種方法你不用關(guān)心節(jié)點(diǎn)在文檔樹的哪一個(gè)地方,而只要保證在頁面中它的ID號是唯一的就可以了。
接下來一種訪問元素節(jié)點(diǎn)的方法是document.getElementsByTagName(),它的返回值是一個(gè)數(shù)組,例如你可以通過下面的例子改變整個(gè)頁面的連接:
var nodeList = document.getElementsByTagName("A");
for (var i = 0; i < nodeList.length; i++)
nodeList[i].style.color = "#ff0000";
attribute和attributes
attribute對象和元素相關(guān),但是卻沒有被認(rèn)為是文檔樹的一部分,因此屬性不能作為子節(jié)點(diǎn)集合的一部分來使用。
有三種方法可以為元素建立新的屬性
1.
var attr = document.createAttribute("myAttribute");
attr.value = "myValue";
var el = document.getElementById("myParagraph");
el.setAttributeNode(attr);
2.
var el = document.getElementById("myParagraph");
el.setAttribute("myAttribute", "myValue");
3.
var el = document.getElementById("myParagraph");
el.myAttribute = "myValue";
你可以在html標(biāo)簽種定義自己的屬性:
<p id="myParagraph" myAttribute="myValue">This is a sample paragraph.</p>
...
alert(document.getElementById("myParagraph").getAttribute("myAttribute"));
返回值將是"myValue".但是請注意這里必須使用getAttribute,而不是AttributeName,因?yàn)橛幸恍g覽器并不支持自定義屬性。
attributes也可以被輕易的從一個(gè)元素中刪除,你可以使用removeAttribute()或者將element.attributeName指向一個(gè)null值。
通過attributes我們就可以產(chǎn)生一些動態(tài)效果:
<p id="sample1" align="left">Text in a paragraph element.</p>
... code for the links ...
document.getElementById('sample1').setAttribute('align', 'left');
document.getElementById('sample1').setAttribute('align', 'right');
另一種:
<p id="sample2" style="text-align:left;">Text in a paragraph
element.</p>
... code for the links ...
document.getElementById('sample2').style.textAlign = 'left';
document.getElementById('sample2').style.textAlign = 'right';
跟上面的例子一樣,展示了可用通過元素修改style中的屬性,甚至是class中的.唯一要提到的是textAlign是從style中的text-align中演變而來的,有一條基本規(guī)律,就是style中的屬性如果出現(xiàn)-則在dom中將會被去掉并且隨后的一個(gè)字母將改為大寫,還有一點(diǎn)就是如果即使元素中沒有style屬性,上述例子同樣可以使用。
text nodes:
先看一下例子:
<p id="sample1">This is the initial text.</p>
... code for the links ...
document.getElementById('sample1').firstChild.nodeValue =
'Once upon a time...';
document.getElementById('sample1').firstChild.nodeValue =
'...in a galaxy far, far away';
首先text nodes并沒有像elements那樣具有id屬性,所有它并不能直接通過document.getElementById()或者document.getElementsByTagName()訪問
看一下下面的結(jié)構(gòu)也許會更明白一些:

可以看出通過document.getElementById('sample1').firstChild.nodeValue就可以讀取或者設(shè)置text nodes的值了。
另一個(gè)更加復(fù)雜一點(diǎn)的例子:
<p id="sample2">This is the <b>initial</b> text.</p>
它的文檔結(jié)構(gòu)

在這里通過document.getElementById('sample1').firstChild.nodeValue講僅僅改變"This is the"
而initial text.將不會改變.在這里大家應(yīng)該看到了它和innerHTML的不同了.當(dāng)然你也可以這樣用:
document.getElementById('sample3').firstChild.nodeValue =
'<b>Once</b> upon a time...';
document.getElementById('sample3').firstChild.nodeValue =
'...in a galaxy <i>far, far</i> away';
其中的html代碼將不會被解釋,瀏覽器將把他們當(dāng)成普通的文本來顯示。
創(chuàng)建和刪除text nodes:
var myTextNode = document.createTextNode("my text");
通過上面的代碼你可以創(chuàng)建一個(gè)新的text node,但是它并不是文檔樹的一部分,要讓它顯示在頁面上就必須讓它成為文檔樹中某一個(gè)節(jié)點(diǎn)的child,因?yàn)?br />
text nodes不能有兒子,所以你不能將它加入到一個(gè)text nodes中,attribute也不屬于文檔樹的一部分,這條路也不行,現(xiàn)在只剩下elements nodes
了,以下的例子展示了如何添加和刪除一個(gè)text node:
<p id="sample1">Initial text within a paragraph element.</p>
... code to add a text node ...
var text = document.createTextNode(" new text " + (++counter1));
var el = document.getElementById("sample1");
el.appendChild(text);
... code to remove the last child node ...
var el = document.getElementById("sample1");
if (el.hasChildNodes())
el.removeChild(el.lastChild);
增加文本是很容易的,上面的代碼建立了一個(gè)新的text node并且通過appendChild()方法將其加入到childNodes數(shù)組的末尾,并設(shè)置了一個(gè)counter1的全局變量,利于觀察
hasChildNodes()的返回值是true or false;用來判斷當(dāng)前節(jié)點(diǎn)是否還有child,以阻止當(dāng)其沒有child的時(shí)候調(diào)用removeChild()產(chǎn)生的錯(cuò)誤。
創(chuàng)建element nodes
有了上面的基礎(chǔ),應(yīng)該更容易理解了,先看一下下面的代碼
<div id="sample1">This text is in a DIV element.</div>
... code for the link ...
var paraEl, boldEl;
paraEl = document.createElement("p");
boldEl = document.createElement("b");
paraEl.appendChild(document.createTextNode("This is a new paragraph with "));
boldEl.appendChild(document.createTextNode("bold"));
paraEl.appendChild(boldEl);
paraEl.appendChild(document.createTextNode(" text added to the DIV"));
document.getElementById("sample1").appendChild(paraEl);
你還可以直接為新加的element nodes設(shè)置attribute,以下兩種都可以:
boldEl.style.color = "#ffff00";
paraEl.appendChild(boldEl);
或者:
paraEl.appendChild(boldEl);
boldEl.style.color = "#ffff00";
|
、幀標(biāo)志
1.<frameset></frameset>
2.<frame>
3.<noframes></noframes>
幀是由英文Frame翻譯過來的,它可以用來向?yàn)g覽器窗口中裝載多個(gè)Html文件。即每個(gè)Html文件占據(jù)一個(gè)幀,而多個(gè)幀可以同時(shí)顯示在同一個(gè)瀏覽器窗口中,它們組成了一個(gè)最大的幀,也即是一個(gè)包含多個(gè)Html文檔的Html文件(我稱它為
主文檔)。幀通常的使用方法是在一個(gè)幀中放置目錄(即可供選擇的鏈接),然后將Html文件顯示在另一個(gè)幀中。
1.<frameset></frameset>
<frameset></frameset>標(biāo)志對放在幀的
主文檔的<body></body>標(biāo)志對的
外邊,也可以嵌在其他幀文檔中,并且可以
嵌套使用。此標(biāo)志對用來定義主文檔中有幾個(gè)幀并且各個(gè)幀是如何排列的。它具有
rows和
cols屬性,使用<frameset>標(biāo)志時(shí)這兩個(gè)屬性
至少必須選擇一個(gè),否則瀏覽器只顯示第一個(gè)定義的幀,剩下的一概不管,<frameset></frameset>標(biāo)志對也就沒有起到任何作用了。rows用來規(guī)定主文檔中各個(gè)幀的
行定位,而cols用來規(guī)定主文檔中各個(gè)幀的
列定位。這兩個(gè)屬性的取值可以是百分?jǐn)?shù)、絕對像素值或
星號(“*”),其中星號代表那些未被說明的空間,如果同一個(gè)屬性中出現(xiàn)多個(gè)星號則將
剩下的未被說明的空間平均分配。同時(shí),所有的幀按照rows和cols的值
從左到右,然后
從上到下排列。示例如下:
<frameset rows="*,*,*"> |
總共有三個(gè)按列排列的幀,每個(gè)幀占整個(gè)瀏覽器窗口的1/3 |
<frameset cols="40%,*,*"> |
總共有三個(gè)按行排列的幀,第一個(gè)幀占整個(gè)瀏覽器窗口的40%,剩下的空間平均分配給另外兩個(gè)幀 |
<frameset rows="40%,*" cols="50%,*,200"> |
總共有六個(gè)幀,先是在第一行中從左到右排列三個(gè)幀,然后在第二行中從左到右再排列三個(gè)幀,即兩行三列,所占空間依據(jù)rows和cols屬性的值,其中200的單位是像素 |
2.<frame>
<frame>標(biāo)志放在<frameset></frameset>之間,用來定義某一個(gè)具體的幀。<frame>標(biāo)志具有src和name屬性,這兩個(gè)屬性都是必須賦值的。src是此幀的源Html文件名(包括網(wǎng)絡(luò)路徑,即相對路徑或網(wǎng)址),瀏覽器將會在此幀中顯示src指定的Html文件;name是此幀的名字,這個(gè)名字是用來供超文本鏈接標(biāo)志<a
href=""
target="">中的target屬性用來指定鏈接的Html文件將顯示在哪一個(gè)幀中。例如定義了一個(gè)幀,名字是main,在幀中顯示的Html文件名是jc.htm,則代碼是<frame
src="jc.htm" name="main">,當(dāng)您有一個(gè)鏈接,在點(diǎn)擊了這個(gè)鏈接后,文件new.htm將要顯示在名為main的幀中,則代碼為<a
href="new.htm"
target="main">需要鏈接的文本</a>。這樣一來,就可以在一個(gè)幀中建立網(wǎng)站的目錄,加入一系列鏈接,當(dāng)點(diǎn)擊鏈接以后在另一個(gè)幀中顯示被鏈接的Html文件。
此外,<frame>標(biāo)志還有scrolling和noresize屬性,scrolling用來指定是否顯示滾動軸,取值可以是“yes”(顯示)、“no”(不顯示)或“auto”(若需要?jiǎng)t會自動顯示,不需要?jiǎng)t自動不顯示)。noresize屬性直接加入標(biāo)志中即可使用,不需賦值,它用來禁止用戶調(diào)整一個(gè)幀的大小。
3.<noframes></noframes>
<noframes></noframes>標(biāo)志對也是放在<frameset></frameset>標(biāo)志對之間,用來在那些不支持幀的瀏覽器中顯示文本或圖像信息。在此標(biāo)志對之間先緊跟<body></body>標(biāo)志對,然后才可以使用我們在教程七以前講過的任何標(biāo)志。
下邊是一個(gè)綜合示例:
例8 幀標(biāo)志的綜合示例
主文檔:
<html>
<head>
<title>幀標(biāo)志的綜合示例</title>
</head>
<frameset cols="25%,*">
<frame src="menu.htm" scrolling="no" name="Left">
<frame src="page1.htm" scrolling="auto" name="Main">
<noframes>
<body>
<p>對不起,您的瀏覽器不支持“幀”!</p>
</body>
</noframes>
</frameset>
</html>
menu.htm
<html>
<head>
<title>目錄</title>
</head>
<body>
<p><font color="#FF0000">目錄</font></p>
<p><a href="page1.htm" target="Main">鏈接到第一頁</a></p>
<p><a href="page2.htm" target="Main">鏈接到第二頁</a></p>
</body>
</html>
page1.htm
<html>
<head>
<title>第一頁</title>
</head>
<body>
<p align="center"><font color="#8000FF">這是第一頁!</font></p>
</body>
</html>
page2.htm
<html>
<head>
<title>第二頁</title>
</head>
<body>
<p align="center"><font color="#FF0080">這是第二頁!</font></p>
</body>
</html>
現(xiàn)在在Java開發(fā)中,使用的開發(fā)工具大部分都是Eclipse,并且和Eclipse關(guān)系緊密的要數(shù)MyEclipse了,但是MyEclipse是一個(gè)EXE可執(zhí)行程序,對于沒有安裝Eclipse與MyEclilpse的電腦來說,首先得先解壓Eclipse,然后再安裝MyEclipse,這不光很麻煩,而且還很費(fèi)時(shí),對于已經(jīng)安裝好的電腦來說,如果哪天電腦出了問題或是Eclipse崩潰了,導(dǎo)致工具不能用,這時(shí)又不得不重新安裝時(shí),那可真夠郁悶滴~~~,因此,大象本著我為人人,人人為我的奉獻(xiàn)精神,在此,將Eclipse+MyEclipse的完全綠色版制作方法寫出來,和大家一起分享,讓大家都能享受到這種方便。
在這里,大象采用Eclipse3.3.1與MyEclipse_6.0.1GA_E3.3.1_Installer版來舉例說明,其它的版本做法與此相同。
第1步:下載Eclipse3.3.1和MyEclipse_6.0.1GA
這里我要提醒大家注意一下:下載Eclipse時(shí)不要選擇3.2的版本,因?yàn)?/span>MyEclipse6.0需要3.3版本以上的支持,另外就是下載MyEclipse時(shí)不要下完全版,而應(yīng)該只下插件版,我的這個(gè)MyEclipse6.0.1的插件版是176M。

第2步:解壓Eclipse3.3.1
將Eclipse3.3.1的壓縮包解壓到D盤根目錄下。

做這個(gè)綠色版,把它放在根目錄下是因?yàn)檫@樣做很方便,在這里,大象以D盤為例,來說明制作方法。
第3步:安裝MyEclipse6.0.1GA
雙擊"MyEclipse_6.0.1GA_E3.3.1_Installer.exe"開始安裝MyEclipse,在第3步:"Choose Eclipse Folder"時(shí),注意 "Please Choose Existing Eclipse Installation Folder",點(diǎn)擊"Choose...",請選擇你解壓的Eclipse文件夾,選擇好之后如下圖:

點(diǎn)擊"Next",出現(xiàn)"Where Would You Like to Install MyEclipse 6.0.1?",點(diǎn)擊"Choose...",選擇上面的eclipse文件夾,這時(shí)記得在eclipse后面加一個(gè)目錄名,否則,MyEclipse的安裝文件就會全部放在eclipse的根目錄下,這可不是我們希望看到滴,設(shè)置好之后如下圖:

下面的安裝沒什么好說的,就是一路Next了。安裝結(jié)束后,可以在eclipse目錄下看到有一個(gè)"MyEclipse 6.0.1GA"這個(gè)文件夾,進(jìn)去看看,是不是有兩個(gè)文件夾,兩個(gè)文件?

OK,到此MyEclipse插件已經(jīng)安裝完成了,下面來進(jìn)行我們的綠色插件制作。
第4步:插件制作
在eclipse目錄下,新建一個(gè)文件夾,命名為"ThirdPlugins"(你要取別的名字也可以,不過一定要和links目錄里面的配置文件中的路徑一致,后面會有說明),將"MyEclipse 6.0.1GA"這個(gè)文件夾復(fù)制到"ThirdPlugins"目錄下,別用剪切喔,這可是剛才安裝MyEclipse的目錄,等會還要缷載MyEclipse,如果這個(gè)目錄沒有了,到時(shí)缷載不了,出了什么問題可不要怪大象喔!
MyEclipse安裝好之后,會在eclipse目錄下生成一個(gè)links文件夾,里面有一個(gè)"com.genuitec.eclipse.MyEclipse.link"文件,我們刪除它,另外新建一個(gè)"MyEclipse 6.0.1GA.ini"文件,內(nèi)容為:path=ThirdPlugins/MyEclipse 6.0.1GA
保存完之后,我們的插件制作也結(jié)束了,然后就是缷載MyEclipse,千萬不要直接把那個(gè)文件夾刪掉,而應(yīng)該缷載它。


其實(shí)所有的插件都可以按這個(gè)方式來做,這樣做的好處就是,想用就放進(jìn)去,不想用就刪掉,如果放到eclipse的features和plugins里面,會很不好管理。
第5步:配置參數(shù)
雖然插件已經(jīng)安裝好了,但是,此時(shí)我們還不能啟動它,應(yīng)該對eclipse的啟動參數(shù)設(shè)置一下,提高它的啟動速度和運(yùn)行時(shí)的穩(wěn)定性。在eclipse.exe上點(diǎn)右鍵,選擇"創(chuàng)建快捷方式",在快捷方式上點(diǎn)右鍵,選擇"屬性",在"D:\eclipse\eclipse.exe后面加上空格,將這些參數(shù)加在后面:
-vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxPermSize=128M -Xms256M -Xmx512M
-Xms256M -Xmx512M:這是堆,根據(jù)內(nèi)存大小來設(shè)置,比如大象的內(nèi)存是1G,我就設(shè)成256和512,這樣一般都夠用了。
當(dāng)然了,你也可以什么都不設(shè)置,不過大象還是建議設(shè)置這些參數(shù),可以很大程度上提升eclipse的啟動速度。在安裝完MyEclipse時(shí),還會生成一個(gè)eclipse.ini的備份文件,這個(gè)不需要,刪掉。我們可以修改下eclipse.ini文件,原始的如下:
-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Dosgi.splashLocation=D:\eclipse\MyEclipse 6.0.1GA\eclipse\MyEclipseSplash.bmp
-Duser.language=en
-XX:PermSize=128M
-XX:MaxPermSize=256M
其實(shí)這個(gè)文件為空都沒關(guān)系,大象試過,全部刪除,沒有錯(cuò)誤,不過我還是建議大家里面至少保留這些東東
-vmargs
-Xms256m
-Xmx512m
我將128改成了256,如果你想在MyEclipse插件中用"MyEclipse 6.0.1"快捷方式來啟動的話,可以寫成這樣
-vmargs
-Xms256m
-Xmx512m
-Dosgi.splashLocation=D:\Eclipse-3.3.1\ThirdPlugins\MyEclipse 6.0.1GA\eclipse\MyEclipseSplash.bmp
最下面一行是啟動時(shí),顯示MyEclipse的圖片,如果沒有這句話運(yùn)行"MyEclipse 6.0.1"快捷方式,則會顯示eclipse的啟動畫面,其實(shí)"MyEclipse 6.0.1"快捷方式還是連接著eclipse.exe這個(gè)執(zhí)行程序,在"MyEclipse 6.0.1"上點(diǎn)右鍵,選擇屬性,在目標(biāo)里就可以看到。
第6步:注冊MyEclipse
MyEclipse6.0的注冊一定要斷開網(wǎng)絡(luò),否則肯定不成功!
6.0.1GA注冊碼
Subscriber: administrator
Subscription Code: nLR7ZL-655342-54657656405281154
這里有一點(diǎn)大象要提醒大家注意,如果你電腦上現(xiàn)在正有使用的MyEclipse,就是說已經(jīng)注冊了,那么在C:\Documents and Settings\"自己的用戶名" 目錄下,會有一個(gè)".myeclipse.properties"文件,這時(shí)請先備份此文件,然后刪除它,斷開網(wǎng)絡(luò),再來注冊MyEclipse6.0.1,成功后如下:


第7步:打包eclipse
到現(xiàn)在所有的工作都已經(jīng)完成,啟動eclipse的速度快不快?好了,該做最后一步操作了,將"configuration"文件夾下的內(nèi)容除"config.ini"文件外全部刪除,另外再把workspace文件夾刪除,大象一般會把workspace放在eclipse根目錄下,方法是在第一次啟動選擇路徑時(shí)把前面的目錄都刪除,只保留workspace(前面什么都不要保留)。這樣方便管理,你要放在其它的地方隨便,這個(gè)看各人喜好。做完這兩步之后,最好還是在eclipse目錄下建一個(gè)txt文本文件,把上面的注冊碼放到里面,另外加上一句話:"注冊時(shí)一定要斷開網(wǎng)絡(luò),否則肯定注冊不成功!"這樣以后用時(shí),可以提醒自己一下。里面有注冊碼,要用時(shí)很方便。
在eclipse文件夾上點(diǎn)右鍵,選擇"添加到eclipse.rar",等到壓縮完成,至此,終于大功告成!
大家盡管放心按著我的方法試,大象前前后后做了不下十遍,今天又在公司的電腦上做了一遍,圖片都是剛剛截取的,嘿嘿,今天老板不在,大象小小的放松一下,寫寫博客。有了這個(gè)壓縮包,以后大家在使用時(shí)就會方便很多,特別是保存到移動硬盤里,想在哪用就在哪用。哇哈哈哈哈~~~~~~~~祝大家好運(yùn),都成功做出來!
此帖為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請注明出處。
存款準(zhǔn)備金是指金融機(jī)構(gòu)為保證客戶提取存款和資金清算需要而準(zhǔn)備的在
中央銀行的存款,中央銀行要求的存款準(zhǔn)備金占其存款總額的比例就是
存款準(zhǔn)備金率。
存款準(zhǔn)備金,是限制金融機(jī)構(gòu)信貸擴(kuò)張和保證客戶提取存款和資金清算需要而準(zhǔn)備的資金。法定存款準(zhǔn)備金率,是金融機(jī)構(gòu)按規(guī)定向中央銀行繳納的存款準(zhǔn)備金占其存款的總額的比率。這一部分是一個(gè)風(fēng)險(xiǎn)準(zhǔn)備金,是不能夠用于發(fā)放貸款的。這個(gè)比例越高,執(zhí)行的緊縮政策力度越大。存款準(zhǔn)備金率變動對商業(yè)銀行的作用過程如下:
當(dāng)中央銀行提高法定準(zhǔn)備金率時(shí),
商業(yè)銀行可提供放款及創(chuàng)造信用的能力就下降。因?yàn)闇?zhǔn)備金率提高,貨幣乘數(shù)就變小,從而降低了整個(gè)商業(yè)銀行體系創(chuàng)造信用、擴(kuò)大信用規(guī)模的能力,其結(jié)果是社會的
銀根偏緊,貨幣供應(yīng)量減少,
利息率提高,投資及社會支出都相應(yīng)縮減。反之,亦然。
打比方說,如果存款準(zhǔn)備金率為7%,就意味著金融機(jī)構(gòu)每吸收100萬元存款,要向央行繳存7萬元的存款準(zhǔn)備金,用于發(fā)放貸款的資金為93萬元。倘若將存款準(zhǔn)備金率提高到7.5%,那么金融機(jī)構(gòu)的可貸資金將減少到92.5萬元。
在存款準(zhǔn)備金制度下,金融機(jī)構(gòu)不能將其吸收的存款全部用于發(fā)放貸款,必須保留一定的資金即存款準(zhǔn)備金,以備客戶提款的需要,因此存款準(zhǔn)備金制度有利于保證金融機(jī)構(gòu)對客戶的正常支付。隨著金融制度的發(fā)展,存款準(zhǔn)備金逐步演變?yōu)橹匾?a target="_blank">貨幣政策工具。當(dāng)中央銀行降低存款準(zhǔn)備金率時(shí),金融機(jī)構(gòu)可用于貸款的資金增加,社會的貸款總量和
貨幣供應(yīng)量也相應(yīng)增加;反之,社會的貸款總量和貨幣供應(yīng)量將相應(yīng)減少。
中央銀行通過調(diào)整存款準(zhǔn)備金率,可以影響金融機(jī)構(gòu)的
信貸擴(kuò)張能力,從而間接調(diào)控貨幣供應(yīng)量。超額存款準(zhǔn)備金率是指商業(yè)銀行超過法定存款準(zhǔn)備金而保留的準(zhǔn)備金占全部
活期存款的比率。從形態(tài)上看,
超額準(zhǔn)備金可以是現(xiàn)金,也可以是具有高流動性的
金融資產(chǎn),如在中央銀行賬戶上的準(zhǔn)備存款等。
2006年以來,中國經(jīng)濟(jì)快速增長,但經(jīng)濟(jì)運(yùn)行中的矛盾也進(jìn)一步凸顯,投資增長過快的勢頭不減。而投資增長過快的主要原因之一就是貨幣信貸增長過快。提高存款準(zhǔn)備金率可以相應(yīng)地減緩貨幣信貸增長,保持國民經(jīng)濟(jì)健康、協(xié)調(diào)發(fā)展。
一般地,存款準(zhǔn)備金率上升,利率會有上升壓力,這是實(shí)行緊縮的貨幣政策的信號。存款準(zhǔn)備金率是針對銀行等金融機(jī)構(gòu)的,對最終客戶的影響是間接的;利率是針對最終客戶的,比如你存款的利息,影響是直接的。
現(xiàn)階段上調(diào)存款準(zhǔn)備金率的背景
1、因?yàn)?a target="_blank">流動性過剩造成的
通貨膨脹,上調(diào)準(zhǔn)備金率可以有效降低流動性 。
2、因?yàn)楝F(xiàn)在美國的信貸危機(jī),上調(diào)準(zhǔn)備金率可以保證金融系統(tǒng)的支付能力,增加銀行的抗風(fēng)險(xiǎn)能力,防止金融風(fēng)險(xiǎn)的產(chǎn)生。
7月19日,中國經(jīng)濟(jì)半年報(bào)發(fā)布。2007年上半年,中國經(jīng)濟(jì)增長率達(dá)11.5%,消費(fèi)物價(jià)指數(shù)(CPI)則創(chuàng)下了33個(gè)月來的新高。一些投行當(dāng)天即預(yù)測,緊縮政策已近在眼前。
我國貨幣供應(yīng)量多、貸款增長快、超額存款準(zhǔn)備金率較高、市場利率走低。這一“多”、一“快”、一“高”、一“低”,表明流動性過剩問題確實(shí)比較突出。
始自2003年下半年的這一輪宏觀調(diào)控,一直試圖用“點(diǎn)剎”的辦法讓經(jīng)濟(jì)減速,而今看來,這列快車的“剎車”效率似乎有問題。11.9%的增速,偏離8%的預(yù)期目標(biāo)近4個(gè)百分點(diǎn)。中國經(jīng)濟(jì)不僅沒有軟著陸,反而有一發(fā)難收之勢。
次數(shù) 時(shí)間 調(diào)整前 調(diào)整后 調(diào)整幅度
26 08年06月25日 17% 17.5% 1%
26 08年06月15日 16.5% 17%
25 08年05月20日 16% 16.5% 0.5%
24 08年04月25日 15.5% 16% 0.5%
23 08年03月25日 15% 15.5% 0.5%
22 08年01月25日 14.5% 15% 0.5%
21 07年12月25日 13.5% 14.5% 1%
20 07年11月26日 13% 13.5% 0.5%
19 07年10月13日 12.5% 13% 0.5%
18 07年09月25日 12% 12.5% 0.5%
17 07年08月15日 11.5% 12% 0.5%
16 07年06月5日 11% 11.5% 0.5%
15 07年05月15日 10.5% 11% 0.5%
14 07年04月16日 10% 10.5% 0.5%
13 07年02月25日 9.5% 10% 0.5%
12 07年01月15日 9% 9.5% 0.5%
11 06年11月15日 8.5% 9% 0.5%
10 06年08月15日 8% 8.5% 0.5%
9 06年07月05日 7.5% 8% 0.5%
8 04年04月25日 7% 7.5% 0.5%
7 03年09月21日 6% 7% 1%
6 99年11月21日 8% 6% -2%
5 98年03月21日 13% 8% -5%
4 88年9月 12% 13% 1%
3 87年 10% 12% 2%
2 85年 央行將法定存款準(zhǔn)備金率統(tǒng)一調(diào)整為10%
1 84年 央行按存款種類規(guī)定法定存款準(zhǔn)備金率,企業(yè)存款20%,農(nóng)村存款25%,儲蓄存款40%
今天在學(xué)習(xí)的過程中遇到了一篇關(guān)于java中使用oracle導(dǎo)入導(dǎo)出的文章,感覺還不錯(cuò),為了學(xué)習(xí)和以后工作的需要,我整理如下:
String[] cmds = new String[3];
cmds[0] = "cmd";
cmds[1] = "/C";
cmds[2]=commandBuf.toString();
Process process=Runtime.getRuntime().exec(cmds);
boolean shouldClose=false;

try
{
InputStreamReader isr = new InputStreamReader(process.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String line = null;

while ((line = br.readLine()) != null)
{

if(line.indexOf("錯(cuò)誤")!=-1)
{
shouldClose=true;
break;
}
}
}

catch (IOException ioe)
{
shouldClose=true;
}
if(shouldClose)
process.destroy();
int exitVal = process.waitFor();
下面還有一種形式:
exp和imp的輸出是要從ErrorStream中獲取,這是我以前寫的
Process proc = null;
try
{
proc = Runtime.getRuntime().exec(cmd.toString());
InputStream istr = proc.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(istr));
String str;
while ((str=br.readLine()) != null)
{
errorInfo.append(str + "\n");
}
proc.waitFor();
}
catch (Exception e)
{
...
}
if (proc.exitValue() == 0)
{
proc.destroy();
return true;
}
else
{
if(logger.isDebugEnabled())
logger.debug(errorInfo);
proc.destroy();
return false;
}
兩者可以比較的看看
注意:在執(zhí)行oracle的exp時(shí),出現(xiàn)了一個(gè)很怪的現(xiàn)象,就是exp在console輸出的信息沒有被放入InputStream,反而是放到了ErrorStream中(即使正確的情況也是),這就導(dǎo)致了按照正常的情況去寫這段代碼的話反而會出問題。---這是在jdk1.4環(huán)境下實(shí)現(xiàn)的。
還有中建議是在jdk1.5環(huán)境下:可以如下實(shí)現(xiàn)
1,把對InputStream的處理放到一個(gè)單獨(dú)Thread里面。
2,用ProcessBuilder的redirectErrorStream來合并OutputStream和ErrorStream。注意子進(jìn)程的InputStream對應(yīng)父進(jìn)程的OutStream。如果不合并這兩個(gè)流的話則必須并行排空它們,順序的排空會導(dǎo)致思索。
Java數(shù)據(jù)庫連接(JDBC)API是一系列能夠讓Java編程人員訪問數(shù)據(jù)庫的接口,各個(gè)開發(fā)商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我積累了許多技巧,這些技巧能夠使我們更好地發(fā)揮系統(tǒng)的性能和實(shí)現(xiàn)更多的功能。
1、在客戶端軟件開發(fā)中使用Thin驅(qū)動程序
在開發(fā)Java軟件方面,Oracle的數(shù)據(jù)庫提供了四種類型的驅(qū)動程序,二種用于應(yīng)用軟件、applets、servlets等客戶端軟件,另外二種用于數(shù)據(jù)庫中的Java存儲過程等服務(wù)器端軟件。在客戶機(jī)端軟件的開發(fā)中,我們可以選擇OCI驅(qū)動程序或Thin驅(qū)動程序。OCI驅(qū)動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數(shù)據(jù)庫進(jìn)行通訊。Thin驅(qū)動程序是純Java驅(qū)動程序,它直接與數(shù)據(jù)庫進(jìn)行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發(fā)中使用OCI驅(qū)動程序,這似乎是正確的。但我建議使用Thin驅(qū)動程序,因?yàn)橥ㄟ^多次測試發(fā)現(xiàn),在通常情況下,Thin驅(qū)動程序的性能都超過了OCI驅(qū)動程序。
2、關(guān)閉自動提交功能,提高系統(tǒng)性能
在第一次建立與數(shù)據(jù)庫的連接時(shí),在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調(diào)用帶布爾值false參數(shù)的Connection類的setAutoCommit()方法關(guān)閉自動提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦關(guān)閉了自動提交功能,我們就需要通過調(diào)用Connection類的commit()和rollback()方法來人工的方式對事務(wù)進(jìn)行管理。
3、在動態(tài)SQL或有時(shí)間限制的命令中使用Statement對象
在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個(gè)SQL命令,PreparedStatement都只對它解析和編譯一次。當(dāng)使用Statement對象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會對它進(jìn)行解析和編譯。這可能會使你認(rèn)為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進(jìn)行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對象。
此外,使用Statement對象也使得編寫動態(tài)SQL命令更加簡單,因?yàn)槲覀兛梢詫⒆址B接在一起,建立一個(gè)有效的SQL命令。因此,我認(rèn)為,Statement對象可以使動態(tài)SQL命令的創(chuàng)建和執(zhí)行變得更加簡單。
4、利用helper函數(shù)對動態(tài)SQL命令進(jìn)行格式化
在創(chuàng)建使用Statement對象執(zhí)行的動態(tài)SQL命令時(shí),我們需要處理一些格式化方面的問題。例如,如果我們想創(chuàng)建一個(gè)將名字O'Reilly插入表中的SQL命令,則必須使用二個(gè)相連的“''”號替換O'Reilly中的“'”號。完成這些工作的最好的方法是創(chuàng)建一個(gè)完成替換操作的helper方法,然后在連接字符串心服用公式表達(dá)一個(gè)SQL命令時(shí),使用創(chuàng)建的helper方法。與此類似的是,我們可以讓helper方法接受一個(gè)Date型的值,然后讓它輸出基于Oracle的to_date()函數(shù)的字符串表達(dá)式。
5、利用PreparedStatement對象提高數(shù)據(jù)庫的總體效率
在使用PreparedStatement對象執(zhí)行SQL命令時(shí),命令被數(shù)據(jù)庫進(jìn)行解析和編譯,然后被放到命令緩沖區(qū)。然后,每當(dāng)執(zhí)行同一個(gè)PreparedStatement對象時(shí),它就會被再解析一次,但不會被再次編譯。在緩沖區(qū)中可以發(fā)現(xiàn)預(yù)編譯的命令,并且可以重新使用。在有大量用戶的企業(yè)級應(yīng)用軟件中,經(jīng)常會重復(fù)執(zhí)行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數(shù)的減少能夠提高數(shù)據(jù)庫的總體性能。如果不是在客戶端創(chuàng)建、預(yù)備、執(zhí)行PreparedStatement任務(wù)需要的時(shí)間長于Statement任務(wù),我會建議在除動態(tài)SQL命令之外的所有情況下使用PreparedStatement對象。
6、在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對象
如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會自動地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會被作為批處理送到數(shù)據(jù)庫中。我們可以通過調(diào)用PreparedStatement類的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。
7、使用Oracle locator方法插入、更新大對象(LOB)
Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對象的處理,尤其是Thin驅(qū)動程序不支持利用PreparedStatement對象的setObject()和setBinaryStream()方法設(shè)置BLOB的值,也不支持利用setCharacterStream()方法設(shè)置CLOB的值。只有l(wèi)ocator本身中的方法才能夠從數(shù)據(jù)庫中獲取LOB類型的值。可以使用PreparedStatement對象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個(gè)問題,因此,我建議使用locator的方法來插入、更新或獲取LOB的值。
8、使用SQL92語法調(diào)用存儲過程
在調(diào)用存儲過程時(shí),我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒有什么實(shí)際的好處,而且會給以后維護(hù)你的應(yīng)用程序的開發(fā)人員帶來麻煩,因此,我建議在調(diào)用存儲過程時(shí)使用SQL92。
9、使用Object SQL將對象模式轉(zhuǎn)移到數(shù)據(jù)庫中
既然可以將Oracle的數(shù)據(jù)庫作為一種面向?qū)ο蟮臄?shù)據(jù)庫來使用,就可以考慮將應(yīng)用程序中的面向?qū)ο竽J睫D(zhuǎn)到數(shù)據(jù)庫中。目前的方法是創(chuàng)建Java bean作為偽裝的數(shù)據(jù)庫對象,將它們的屬性映射到關(guān)系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數(shù)據(jù)庫之外進(jìn)行的,因此其他訪問數(shù)據(jù)庫的應(yīng)用軟件無法利用對象模式。如果利用Oracle的面向?qū)ο蟮募夹g(shù),可以通過創(chuàng)建一個(gè)新的數(shù)據(jù)庫對象類型在數(shù)據(jù)庫中模仿其數(shù)據(jù)和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應(yīng)用程序可以使用應(yīng)用軟件的對象模式,其他需要共享你的應(yīng)用中的數(shù)據(jù)和操作的應(yīng)用軟件也可以使用應(yīng)用軟件中的對象模式。
10、利用SQL完成數(shù)據(jù)庫內(nèi)的操作
我要向大家介紹的最重要的經(jīng)驗(yàn)是充分利用SQL的面向集合的方法來解決數(shù)據(jù)庫處理需求,而不是使用Java等過程化的編程語言。
如果編程人員要在一個(gè)表中查找許多行,結(jié)果中的每個(gè)行都會查找其他表中的數(shù)據(jù),最后,編程人員創(chuàng)建了獨(dú)立的UPDATE命令來成批地更新第一個(gè)表中的數(shù)據(jù)。與此類似的任務(wù)可以通過在set子句中使用多列子查詢而在一個(gè)UPDATE命令中完成。當(dāng)能夠在單一的SQL命令中完成任務(wù),何必要讓數(shù)據(jù)在網(wǎng)上流來流去的?我建議用戶認(rèn)真學(xué)習(xí)如何最大限度地發(fā)揮SQL的功能。
轉(zhuǎn)帖:
最近做的一個(gè)項(xiàng)目中運(yùn)用到了連接池技術(shù),可能我們大家比較熟悉的開源連接池有dbcp,c3p0,proxool。對這三種連接池來說,從性能和出錯(cuò)率來說,proxool稍微比前兩種好些。今天我主要簡單的講述一下,我在項(xiàng)目中成功的配置和源碼。
第一步:首先去http://proxool.sourceforge.net/下載一個(gè)proxool.jar文件了,我用的是proxool-0.8.3.jar,現(xiàn)在最新版本是proxool-0.9.3.jar.除了他們的查看監(jiān)控臺的頁面有變化,其他的變化不是太大。
第二步:就是寫一個(gè)單獨(dú)的proxool.xml文件放到WEB-INF文件夾下。我用的數(shù)據(jù)庫是MySQL.
peoxool.xml的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<proxool-config>
<proxool>
<alias>db</alias>
<driver-url>jdbc:mysql://×××.×××.××.×××:3303/mydb<driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root" />
<property name="password" value="*******" />
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>20</maximum-new-connections>
<prototype-count>5</prototype-count>
<maximum-connection-count>1000</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
</proxool>
</proxool-config>
對以上配置簡單的解釋:
1.<alias> :為該連接池起一個(gè)別名,在其他文件中引用。引用是:(proxool.db);
2. <driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root" />
<property name="password" value="root" />
</driver-properties>
這些配置大家應(yīng)該比較熟悉吧。配置數(shù)據(jù)庫的驅(qū)動和連接。
3.<house-keeping-sleep-time> :proxool自動偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀。
4.<maximum-new-connections>: 指因未有空閑連接可以分配而在隊(duì)列中等候的最大請求數(shù),超過這個(gè)請求數(shù)的用戶連接就不會被接受。
5.<prototype-count>:最少保持的空閑連接數(shù)。
6.<maximum-connection-count>: 允許最大連接數(shù),超過了這個(gè)連接,再有請求時(shí),就排在隊(duì)列中等候,最大的等待請求數(shù)由maximum-new-connections決定
7.<minimum-connection-count>:最小連接數(shù)
第三步:加載并初始化proxool.xml文件。因?yàn)樗沁B接數(shù)據(jù)庫的,其他很多模塊都用到數(shù)據(jù),所以你必須首先加載它,在web.xml中進(jìn)行如下配置:如果你以前加載applicationContext.xml用的是:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
這時(shí)你必須換成如下配置:
<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
要不然你就會遇見這樣的錯(cuò)誤:
Problem
org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its
alias 'db'
如果用過proxool與spring整合時(shí),不少就遇到過這樣的問題,其實(shí)這個(gè)問題很明顯就是你的proxool.xml沒有被先加載初始化,我們應(yīng)該讓它先加載,應(yīng)該這樣配置:
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
把<load-on-startup>的值設(shè)為1,值越小級別就越高,就先被加載初始化。一定要先于applicationContext.xml的加載。
這一步很關(guān)鍵,一定要注意,不然你就會遇到上面的問題。網(wǎng)上有很大人都遇見過這樣的問題,只要你用了你才會體會到那樣的錯(cuò)誤。如果是第一次,你會很迷茫的,我第一次配置就出現(xiàn)了上面的問題,讓我調(diào)試了好處時(shí)間才找出問題所在。希望你們不要再犯這樣的錯(cuò)誤。
如果你想監(jiān)控?cái)?shù)據(jù)庫連接池的連接情況,可以簡單的配置一下就可以了,因?yàn)榇蟛糠止δ茉创a中都已寫好,我們用是只需簡單的配置。
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
如果訪問的話,可能有點(diǎn)問題,會報(bào)ISO-8859-1的問題。我們一般用的是utf-8,gbk2312.最好的解決辦法就是重寫源碼中的AdminServlet
.java。我就是重寫了這個(gè)源碼。才解決了這個(gè)亂碼問題。可能還有其他辦法:只需簡單的該一個(gè)方法就可以了。
private void printDefinitionEntry(ServletOutputStream out, String name, String value) throws IOException {
out.println(" <tr>");
out.print(" <td width=\"200\" valign=\"top\" style=\"" + STYLE_CAPTION + "\">");
out.print(name);
out.println("</td>");
if (value != null) {
out.print(" <td style=\"" + STYLE_DATA + "\">");
out.print(new String(value.getBytes("ISO-8859-1"),"utf-8"));
} else {
out.print(" <td style=\"" + STYLE_NO_DATA + "\">off");
}
out.print("</td>");
out.println(" </tr>");
}
上面紅色的部分就是我改的部分,然后把web.xml中的
<servlet-class>
com.jack.servlet.AdminServlet
</servlet-class>
中<servlet-class>換成你改寫的那個(gè)類。
最后一步:整合spring和proxool。在applicationContext.xml文件中把原來數(shù)據(jù)源的配置成這樣:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.db</value>
</property>
</bean>
這個(gè) <property name="url">要配置成proxool.xml中的別名。其他地方不用該了。也可以與hibernate整合。與spring整合比較簡單。我采用的就是上面的配置方式。
這樣就配置完了,很清晰,很簡單。如果查看監(jiān)控情況的話:
http://www.××××.com/admin 就可以查看了,如果你是本地測試:改一下路徑就可以了。
上面所講述的是一個(gè)成功的配置,并在項(xiàng)目中成功的運(yùn)用了。希望對連接池有愛好的朋友有所幫助。
Static變量的總結(jié)
1.不可從一個(gè)static方法內(nèi)部發(fā)出對非static方法的調(diào)用,盡管反過來說是可以的。如果要在static方法中訪問所在類的成員變量或方法,就必須首先創(chuàng)建相應(yīng)的實(shí)例變量。
2.static變量可以通過類名直接訪問,
3.static方法不能被覆蓋,但是在子類中可以聲明與父類驚天方法相同的方法,從而將父類的靜態(tài)方法隱藏,另外自樂不能把父類的非靜態(tài)方法重寫為靜態(tài)的:并且static方法也不能夠重載(因?yàn)樗麄兪乔捌诮壎ǖ模圆荒苤剌d;不能重載的方的還有final、private)
而普通方法能被覆蓋,覆蓋的結(jié)果是產(chǎn)生多態(tài);
例子:
package test;
class Test {
public static void main(String[] args) {
A a = new B();
a.f();
a.m();
}
}
class A {
public static void f() {
System.out.println("hello,A");
}
public void m() {
System.out.println("hello,A");
}
}
class B extends A {
public static void f() {
System.out.println("hello,B");
}
public void m() {
System.out.println("hello,B");
}
}
結(jié)果是:
hello,A
hello,B
1.根據(jù)Java Language Specification (Version 3) 8.4.8 的描述,子類在繼承父類時(shí),對于方法而言,存在兩種關(guān)系:
A. override 即覆蓋,這是對實(shí)例方法(instance method)而言的;子類與父類中形構(gòu)相同的方法(原文中是 subsignature,它的范圍比“形構(gòu)相同”要大,請參考原文)會override 父類中的那個(gè)方法。
B. hide 即隱藏,這是對類方法(class method)即static 方法而言的。如果子類中定義了靜態(tài)方法,則它會隱藏父類中形構(gòu)相同的(原文中是 subsignature,它的范圍比“形構(gòu)相同要”大,請參考原文)所有方法,但如果隱藏了父類中的實(shí)例方法,則會編譯報(bào)錯(cuò)。
2.根據(jù)上面的規(guī)范:
“override 覆蓋”的前提是實(shí)例方法,只有實(shí)例方法在繼承時(shí)才會出現(xiàn)override情況。
如果是static方法,在繼承時(shí)出現(xiàn)的現(xiàn)象根本就不能用“override”這個(gè)詞描述,如果static方法在父類和子類中形構(gòu)一致,則被成為 hide(隱藏)。
3.因?yàn)?/span>static方法是類方法,實(shí)現(xiàn)時(shí)是靜態(tài)綁定的(引用“JAVA 核心技術(shù) 卷1 第六版”中149頁內(nèi)容“private、static、final”修飾的方法是靜態(tài)綁定的。其他的方法在運(yùn)行時(shí)動態(tài)綁定。“interhanchi”所說的“static和final方法外都是后期綁定”并不精確),只與類相關(guān),不會有多態(tài)性。 從編程的角度看,效果好像是“static方法不能被覆蓋”;
4.從術(shù)語上看,“static方法能否被覆蓋”這種說法本身就是錯(cuò)誤的,因?yàn)?/span>“覆蓋”定義的前提和基礎(chǔ)是實(shí)例方法。
5.結(jié)論: 子類中的static方法會隱藏父類中形構(gòu)相同的static方法。
final變量的總結(jié):
Final不想做改變的理由是:設(shè)計(jì)和效率
在java中除了static方法、final方法、(private方法屬于final方法)之外,其他所有的方法都是后期綁定
Final可以修飾基本類型,也可以修飾引用類型,但是當(dāng)final修飾引用類型的時(shí)候,不能夠改變引用指向另一個(gè)對象, 但這個(gè)對象本身的狀態(tài)是可以改變的...
final String string=“final”;
是開辟了2個(gè)內(nèi)存空間,在棧中的string引用在堆中的final,其中string是始終指向堆中的final這個(gè)地址的引用,不能改變。但是堆中的final卻可以改變。
可以通過下面的例子來說明static final的作用:
public class Test0
{
private static final String string;
public Test0(String str)
{
string=str;
System.out.println(string);
}
public static void main(String[] args)
{
Test0 t=new Test0("hello world");
Test0 tt=new Test0("world hello");
}
}
解釋說明:
1.首先正確的認(rèn)識一下final, 一個(gè)final修飾的叫"終態(tài)", 而這種終態(tài)很特殊, 它指的是:"當(dāng)這個(gè)變量被賦值之后成為終態(tài)". 那么,當(dāng)一個(gè)被賦值之后的final修飾變量, 將不可再被賦新值. (先理解)
2.而static表示靜態(tài)變量, 說穿了,你需要知道JAVA如何為一個(gè)類創(chuàng)建內(nèi)存空間--我們知道類有空間,類產(chǎn)生的實(shí)例(對象)有空間,方法有空間,變量有空間, 當(dāng)static修飾時(shí), 這個(gè)變量會在類分配內(nèi)存時(shí)就被分配內(nèi)存了, 所以你知道,你可以不用產(chǎn)生對象就使用靜態(tài)變量.
3.好了,有了以上兩點(diǎn),我們來看看, 你可以根據(jù)我的敘述試試. 首先,你只使用final修飾你的string, 你會發(fā)現(xiàn)不會報(bào)錯(cuò), 因?yàn)檫@是一個(gè)"還沒有被賦值的非靜態(tài)的終態(tài)變量(在類分配內(nèi)存時(shí)不會分配內(nèi)存).好,接下來你改一下,寫:private final String string = "sss"; 你會發(fā)現(xiàn)報(bào)錯(cuò)了,原因自己想.
接下來, 看你發(fā)出來的代碼, 又被static修飾,又被final修飾,首先它是一個(gè)靜態(tài)變量, 那么在類分配時(shí)就會分配內(nèi)存, 實(shí)際上這個(gè)String就被初始化了,既然初始化了, 那么也就有值了, 而一個(gè)終態(tài)被賦值變量將不能再被賦值, 那么自然就報(bào)錯(cuò)了
學(xué)過Java基礎(chǔ)的人都能很容易理解上面的代碼和多態(tài)的原理,但是仍有一些關(guān)鍵的地方需要注意的,算是自己對多態(tài)的一個(gè)小結(jié):
1. Java中除了static和final方法外,其他所有的方法都是運(yùn)行時(shí)綁定的。private方法都被隱式指定為final的,因此final的方法不會在運(yùn)行時(shí)綁定。當(dāng)在派生類中重寫基類中static、final、或private方法時(shí),實(shí)質(zhì)上是創(chuàng)建了一個(gè)新的方法。
2.在派生類中,對于基類中的private方法,最好采用不同的名字。
3.包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個(gè)抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。
4.對象清理的順序和創(chuàng)建的順序相反,當(dāng)然前提是自己想手動清理對象,因?yàn)榇蠹叶贾繨ava垃圾回收器。
5.在基類的構(gòu)造方法中小心調(diào)用基類中被重寫的方法,這里涉及到對象初始化順序。
6.構(gòu)造方法是被隱式聲明為static方法。
7.用繼承表達(dá)行為間的差異,用字段表達(dá)狀態(tài)上的變化。