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

很明顯樹的頂層節點是NodeA節點,接下來可以通過指定的合適節點移動到樹中的任何點,結合以下的代碼你可以更好的了解這棵樹節點間的相互關系:
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定義對操作一個文檔對象的節點結構提供了實用的方法,它提供了像執行對象插入,更新,刪除,克隆等這些常用的方法。
insertBefore()--在參考子節點之前插入一個新的子節點.如果參考的子節點為null,則新的子節點將作為調用節點的最后一個子節點插入。
replaceChild()--在childNodes集合種使用指定的newChild來代替oldChild;如果代替成功,則返回oldChild;如果newChild是null,則只需刪除oldChild即可。
removeChild()--從節點的ChildNodes集合中刪除removeChild指定的節點,如果刪除成功,則返回刪除的子節點。
appendChild()--添加一個新節點到childNodes集合的末尾,如果成功,則返回新節點。
cloneNode()--創建一個新的、復制的節點,并且如果傳入的參數是true時,還將復制子節點,如果節點是一個元素,那么還將復制相應屬性,返回新的節點。
為了在一棵文檔樹中訪問或者建立一個新的節點,可以用下面這些方法:
getElementById()
getElementsByTagName()
createElement()
createAttribute()
createTextNode()
注意:在一個頁面中只有一個文檔對象,除了getElementsByTagName()外,其它方法均只能通過document.methodName()調用。
再看一下下面這個例子:
<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>
結果將會顯示"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.
另一個:
<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>
這個例子和上面并沒有什么大的區別,僅僅是多了一個空行,但是在NS中,會自動為空行加上一個節點所以返回值是"undefined",而在IE中將跳過空行仍然指向P標簽。
更常用的方法:
<p id="myParagraph">This is a sample paragraph.</p>
...
alert(document.getElementById("myParagraph").tagName);
這種方法你不用關心節點在文檔樹的哪一個地方,而只要保證在頁面中它的ID號是唯一的就可以了。
接下來一種訪問元素節點的方法是document.getElementsByTagName(),它的返回值是一個數組,例如你可以通過下面的例子改變整個頁面的連接:
var nodeList = document.getElementsByTagName("A");
for (var i = 0; i < nodeList.length; i++)
nodeList[i].style.color = "#ff0000";
attribute和attributes
attribute對象和元素相關,但是卻沒有被認為是文檔樹的一部分,因此屬性不能作為子節點集合的一部分來使用。
有三種方法可以為元素建立新的屬性
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標簽種定義自己的屬性:
<p id="myParagraph" myAttribute="myValue">This is a sample paragraph.</p>
...
alert(document.getElementById("myParagraph").getAttribute("myAttribute"));
返回值將是"myValue".但是請注意這里必須使用getAttribute,而不是AttributeName,因為有一些瀏覽器并不支持自定義屬性。
attributes也可以被輕易的從一個元素中刪除,你可以使用removeAttribute()或者將element.attributeName指向一個null值。
通過attributes我們就可以產生一些動態效果:
<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中演變而來的,有一條基本規律,就是style中的屬性如果出現-則在dom中將會被去掉并且隨后的一個字母將改為大寫,還有一點就是如果即使元素中沒有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()訪問
看一下下面的結構也許會更明白一些:

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

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

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

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

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

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

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


其實所有的插件都可以按這個方式來做,這樣做的好處就是,想用就放進去,不想用就刪掉,如果放到eclipse的features和plugins里面,會很不好管理。
第5步:配置參數
雖然插件已經安裝好了,但是,此時我們還不能啟動它,應該對eclipse的啟動參數設置一下,提高它的啟動速度和運行時的穩定性。在eclipse.exe上點右鍵,選擇"創建快捷方式",在快捷方式上點右鍵,選擇"屬性",在"D:\eclipse\eclipse.exe后面加上空格,將這些參數加在后面:
-vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxPermSize=128M -Xms256M -Xmx512M
-Xms256M -Xmx512M:這是堆,根據內存大小來設置,比如大象的內存是1G,我就設成256和512,這樣一般都夠用了。
當然了,你也可以什么都不設置,不過大象還是建議設置這些參數,可以很大程度上提升eclipse的啟動速度。在安裝完MyEclipse時,還會生成一個eclipse.ini的備份文件,這個不需要,刪掉。我們可以修改下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
其實這個文件為空都沒關系,大象試過,全部刪除,沒有錯誤,不過我還是建議大家里面至少保留這些東東
-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
最下面一行是啟動時,顯示MyEclipse的圖片,如果沒有這句話運行"MyEclipse 6.0.1"快捷方式,則會顯示eclipse的啟動畫面,其實"MyEclipse 6.0.1"快捷方式還是連接著eclipse.exe這個執行程序,在"MyEclipse 6.0.1"上點右鍵,選擇屬性,在目標里就可以看到。
第6步:注冊MyEclipse
MyEclipse6.0的注冊一定要斷開網絡,否則肯定不成功!
6.0.1GA注冊碼
Subscriber: administrator
Subscription Code: nLR7ZL-655342-54657656405281154
這里有一點大象要提醒大家注意,如果你電腦上現在正有使用的MyEclipse,就是說已經注冊了,那么在C:\Documents and Settings\"自己的用戶名" 目錄下,會有一個".myeclipse.properties"文件,這時請先備份此文件,然后刪除它,斷開網絡,再來注冊MyEclipse6.0.1,成功后如下:


第7步:打包eclipse
到現在所有的工作都已經完成,啟動eclipse的速度快不快?好了,該做最后一步操作了,將"configuration"文件夾下的內容除"config.ini"文件外全部刪除,另外再把workspace文件夾刪除,大象一般會把workspace放在eclipse根目錄下,方法是在第一次啟動選擇路徑時把前面的目錄都刪除,只保留workspace(前面什么都不要保留)。這樣方便管理,你要放在其它的地方隨便,這個看各人喜好。做完這兩步之后,最好還是在eclipse目錄下建一個txt文本文件,把上面的注冊碼放到里面,另外加上一句話:"注冊時一定要斷開網絡,否則肯定注冊不成功!"這樣以后用時,可以提醒自己一下。里面有注冊碼,要用時很方便。
在eclipse文件夾上點右鍵,選擇"添加到eclipse.rar",等到壓縮完成,至此,終于大功告成!
大家盡管放心按著我的方法試,大象前前后后做了不下十遍,今天又在公司的電腦上做了一遍,圖片都是剛剛截取的,嘿嘿,今天老板不在,大象小小的放松一下,寫寫博客。有了這個壓縮包,以后大家在使用時就會方便很多,特別是保存到移動硬盤里,想在哪用就在哪用。哇哈哈哈哈~~~~~~~~祝大家好運,都成功做出來!
此帖為菠蘿大象原創,如要轉載請注明出處。
存款準備金是指金融機構為保證客戶提取存款和資金清算需要而準備的在
中央銀行的存款,中央銀行要求的存款準備金占其存款總額的比例就是
存款準備金率。
存款準備金,是限制金融機構信貸擴張和保證客戶提取存款和資金清算需要而準備的資金。法定存款準備金率,是金融機構按規定向中央銀行繳納的存款準備金占其存款的總額的比率。這一部分是一個風險準備金,是不能夠用于發放貸款的。這個比例越高,執行的緊縮政策力度越大。存款準備金率變動對商業銀行的作用過程如下:
當中央銀行提高法定準備金率時,
商業銀行可提供放款及創造信用的能力就下降。因為準備金率提高,貨幣乘數就變小,從而降低了整個商業銀行體系創造信用、擴大信用規模的能力,其結果是社會的
銀根偏緊,貨幣供應量減少,
利息率提高,投資及社會支出都相應縮減。反之,亦然。
打比方說,如果存款準備金率為7%,就意味著金融機構每吸收100萬元存款,要向央行繳存7萬元的存款準備金,用于發放貸款的資金為93萬元。倘若將存款準備金率提高到7.5%,那么金融機構的可貸資金將減少到92.5萬元。
在存款準備金制度下,金融機構不能將其吸收的存款全部用于發放貸款,必須保留一定的資金即存款準備金,以備客戶提款的需要,因此存款準備金制度有利于保證金融機構對客戶的正常支付。隨著金融制度的發展,存款準備金逐步演變為重要的
貨幣政策工具。當中央銀行降低存款準備金率時,金融機構可用于貸款的資金增加,社會的貸款總量和
貨幣供應量也相應增加;反之,社會的貸款總量和貨幣供應量將相應減少。
中央銀行通過調整存款準備金率,可以影響金融機構的
信貸擴張能力,從而間接調控貨幣供應量。超額存款準備金率是指商業銀行超過法定存款準備金而保留的準備金占全部
活期存款的比率。從形態上看,
超額準備金可以是現金,也可以是具有高流動性的
金融資產,如在中央銀行賬戶上的準備存款等。
2006年以來,中國經濟快速增長,但經濟運行中的矛盾也進一步凸顯,投資增長過快的勢頭不減。而投資增長過快的主要原因之一就是貨幣信貸增長過快。提高存款準備金率可以相應地減緩貨幣信貸增長,保持國民經濟健康、協調發展。
一般地,存款準備金率上升,利率會有上升壓力,這是實行緊縮的貨幣政策的信號。存款準備金率是針對銀行等金融機構的,對最終客戶的影響是間接的;利率是針對最終客戶的,比如你存款的利息,影響是直接的。
1、因為
流動性過剩造成的
通貨膨脹,上調準備金率可以有效降低流動性 。
2、因為現在美國的信貸危機,上調準備金率可以保證金融系統的支付能力,增加銀行的抗風險能力,防止金融風險的產生。
7月19日,中國經濟半年報發布。2007年上半年,中國經濟增長率達11.5%,消費物價指數(CPI)則創下了33個月來的新高。一些投行當天即預測,緊縮政策已近在眼前。
我國貨幣供應量多、貸款增長快、超額存款準備金率較高、市場利率走低。這一“多”、一“快”、一“高”、一“低”,表明流動性過剩問題確實比較突出。
始自2003年下半年的這一輪宏觀調控,一直試圖用“點剎”的辦法讓經濟減速,而今看來,這列快車的“剎車”效率似乎有問題。11.9%的增速,偏離8%的預期目標近4個百分點。中國經濟不僅沒有軟著陸,反而有一發難收之勢。
次數 時間 調整前 調整后 調整幅度
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年 央行將法定存款準備金率統一調整為10%
1 84年 央行按存款種類規定法定存款準備金率,企業存款20%,農村存款25%,儲蓄存款40%
今天在學習的過程中遇到了一篇關于java中使用oracle導入導出的文章,感覺還不錯,為了學習和以后工作的需要,我整理如下:
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("錯誤")!=-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;
}
兩者可以比較的看看
注意:在執行oracle的exp時,出現了一個很怪的現象,就是exp在console輸出的信息沒有被放入InputStream,反而是放到了ErrorStream中(即使正確的情況也是),這就導致了按照正常的情況去寫這段代碼的話反而會出問題。---這是在jdk1.4環境下實現的。
還有中建議是在jdk1.5環境下:可以如下實現
1,把對InputStream的處理放到一個單獨Thread里面。
2,用ProcessBuilder的redirectErrorStream來合并OutputStream和ErrorStream。注意子進程的InputStream對應父進程的OutStream。如果不合并這兩個流的話則必須并行排空它們,順序的排空會導致思索。
Java數據庫連接(JDBC)API是一系列能夠讓Java編程人員訪問數據庫的接口,各個開發商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我積累了許多技巧,這些技巧能夠使我們更好地發揮系統的性能和實現更多的功能。
1、在客戶端軟件開發中使用Thin驅動程序
在開發Java軟件方面,Oracle的數據庫提供了四種類型的驅動程序,二種用于應用軟件、applets、servlets等客戶端軟件,另外二種用于數據庫中的Java存儲過程等服務器端軟件。在客戶機端軟件的開發中,我們可以選擇OCI驅動程序或Thin驅動程序。OCI驅動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數據庫進行通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發中使用OCI驅動程序,這似乎是正確的。但我建議使用Thin驅動程序,因為通過多次測試發現,在通常情況下,Thin驅動程序的性能都超過了OCI驅動程序。
2、關閉自動提交功能,提高系統性能
在第一次建立與數據庫的連接時,在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦關閉了自動提交功能,我們就需要通過調用Connection類的commit()和rollback()方法來人工的方式對事務進行管理。
3、在動態SQL或有時間限制的命令中使用Statement對象
在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。
此外,使用Statement對象也使得編寫動態SQL命令更加簡單,因為我們可以將字符串連接在一起,建立一個有效的SQL命令。因此,我認為,Statement對象可以使動態SQL命令的創建和執行變得更加簡單。
4、利用helper函數對動態SQL命令進行格式化
在創建使用Statement對象執行的動態SQL命令時,我們需要處理一些格式化方面的問題。例如,如果我們想創建一個將名字O'Reilly插入表中的SQL命令,則必須使用二個相連的“''”號替換O'Reilly中的“'”號。完成這些工作的最好的方法是創建一個完成替換操作的helper方法,然后在連接字符串心服用公式表達一個SQL命令時,使用創建的helper方法。與此類似的是,我們可以讓helper方法接受一個Date型的值,然后讓它輸出基于Oracle的to_date()函數的字符串表達式。
5、利用PreparedStatement對象提高數據庫的總體效率
在使用PreparedStatement對象執行SQL命令時,命令被數據庫進行解析和編譯,然后被放到命令緩沖區。然后,每當執行同一個PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩沖區中可以發現預編譯的命令,并且可以重新使用。在有大量用戶的企業級應用軟件中,經常會重復執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高數據庫的總體性能。如果不是在客戶端創建、預備、執行PreparedStatement任務需要的時間長于Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象。
6、在成批處理重復的插入或更新操作中使用PreparedStatement對象
如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標準的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標準的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機制,可以以如下所示的方式調用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
調用setExecuteBatch()時指定的值是一個上限,當達到該值時,就會自動地引發SQL命令執行,標準的executeUpdate()方法就會被作為批處理送到數據庫中。我們可以通過調用PreparedStatement類的sendBatch()方法隨時傳輸批處理任務。
7、使用Oracle locator方法插入、更新大對象(LOB)
Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對象的處理,尤其是Thin驅動程序不支持利用PreparedStatement對象的setObject()和setBinaryStream()方法設置BLOB的值,也不支持利用setCharacterStream()方法設置CLOB的值。只有locator本身中的方法才能夠從數據庫中獲取LOB類型的值。可以使用PreparedStatement對象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個問題,因此,我建議使用locator的方法來插入、更新或獲取LOB的值。
8、使用SQL92語法調用存儲過程
在調用存儲過程時,我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒有什么實際的好處,而且會給以后維護你的應用程序的開發人員帶來麻煩,因此,我建議在調用存儲過程時使用SQL92。
9、使用Object SQL將對象模式轉移到數據庫中
既然可以將Oracle的數據庫作為一種面向對象的數據庫來使用,就可以考慮將應用程序中的面向對象模式轉到數據庫中。目前的方法是創建Java bean作為偽裝的數據庫對象,將它們的屬性映射到關系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數據庫之外進行的,因此其他訪問數據庫的應用軟件無法利用對象模式。如果利用Oracle的面向對象的技術,可以通過創建一個新的數據庫對象類型在數據庫中模仿其數據和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應用程序可以使用應用軟件的對象模式,其他需要共享你的應用中的數據和操作的應用軟件也可以使用應用軟件中的對象模式。
10、利用SQL完成數據庫內的操作
我要向大家介紹的最重要的經驗是充分利用SQL的面向集合的方法來解決數據庫處理需求,而不是使用Java等過程化的編程語言。
如果編程人員要在一個表中查找許多行,結果中的每個行都會查找其他表中的數據,最后,編程人員創建了獨立的UPDATE命令來成批地更新第一個表中的數據。與此類似的任務可以通過在set子句中使用多列子查詢而在一個UPDATE命令中完成。當能夠在單一的SQL命令中完成任務,何必要讓數據在網上流來流去的?我建議用戶認真學習如何最大限度地發揮SQL的功能。
轉帖:
最近做的一個項目中運用到了連接池技術,可能我們大家比較熟悉的開源連接池有dbcp,c3p0,proxool。對這三種連接池來說,從性能和出錯率來說,proxool稍微比前兩種好些。今天我主要簡單的講述一下,我在項目中成功的配置和源碼。
第一步:首先去http://proxool.sourceforge.net/下載一個proxool.jar文件了,我用的是proxool-0.8.3.jar,現在最新版本是proxool-0.9.3.jar.除了他們的查看監控臺的頁面有變化,其他的變化不是太大。
第二步:就是寫一個單獨的proxool.xml文件放到WEB-INF文件夾下。我用的數據庫是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> :為該連接池起一個別名,在其他文件中引用。引用是:(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>
這些配置大家應該比較熟悉吧。配置數據庫的驅動和連接。
3.<house-keeping-sleep-time> :proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀。
4.<maximum-new-connections>: 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受。
5.<prototype-count>:最少保持的空閑連接數。
6.<maximum-connection-count>: 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定
7.<minimum-connection-count>:最小連接數
第三步:加載并初始化proxool.xml文件。因為它是連接數據庫的,其他很多模塊都用到數據,所以你必須首先加載它,在web.xml中進行如下配置:如果你以前加載applicationContext.xml用的是:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
這時你必須換成如下配置:
<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
要不然你就會遇見這樣的錯誤:
Problem
org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its
alias 'db'
如果用過proxool與spring整合時,不少就遇到過這樣的問題,其實這個問題很明顯就是你的proxool.xml沒有被先加載初始化,我們應該讓它先加載,應該這樣配置:
<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>的值設為1,值越小級別就越高,就先被加載初始化。一定要先于applicationContext.xml的加載。
這一步很關鍵,一定要注意,不然你就會遇到上面的問題。網上有很大人都遇見過這樣的問題,只要你用了你才會體會到那樣的錯誤。如果是第一次,你會很迷茫的,我第一次配置就出現了上面的問題,讓我調試了好處時間才找出問題所在。希望你們不要再犯這樣的錯誤。
如果你想監控數據庫連接池的連接情況,可以簡單的配置一下就可以了,因為大部分功能源碼中都已寫好,我們用是只需簡單的配置。
<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>
如果訪問的話,可能有點問題,會報ISO-8859-1的問題。我們一般用的是utf-8,gbk2312.最好的解決辦法就是重寫源碼中的AdminServlet
.java。我就是重寫了這個源碼。才解決了這個亂碼問題。可能還有其他辦法:只需簡單的該一個方法就可以了。
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>換成你改寫的那個類。
最后一步:整合spring和proxool。在applicationContext.xml文件中把原來數據源的配置成這樣:
<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>
這個 <property name="url">要配置成proxool.xml中的別名。其他地方不用該了。也可以與hibernate整合。與spring整合比較簡單。我采用的就是上面的配置方式。
這樣就配置完了,很清晰,很簡單。如果查看監控情況的話:
http://www.××××.com/admin 就可以查看了,如果你是本地測試:改一下路徑就可以了。
上面所講述的是一個成功的配置,并在項目中成功的運用了。希望對連接池有愛好的朋友有所幫助。
Static變量的總結
1.不可從一個static方法內部發出對非static方法的調用,盡管反過來說是可以的。如果要在static方法中訪問所在類的成員變量或方法,就必須首先創建相應的實例變量。
2.static變量可以通過類名直接訪問,
3.static方法不能被覆蓋,但是在子類中可以聲明與父類驚天方法相同的方法,從而將父類的靜態方法隱藏,另外自樂不能把父類的非靜態方法重寫為靜態的:并且static方法也不能夠重載(因為他們是前期綁定的,所以不能重載;不能重載的方的還有final、private)
而普通方法能被覆蓋,覆蓋的結果是產生多態;
例子:
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");
}
}
結果是:
hello,A
hello,B
1.根據Java Language Specification (Version 3) 8.4.8 的描述,子類在繼承父類時,對于方法而言,存在兩種關系:
A. override 即覆蓋,這是對實例方法(instance method)而言的;子類與父類中形構相同的方法(原文中是 subsignature,它的范圍比“形構相同”要大,請參考原文)會override 父類中的那個方法。
B. hide 即隱藏,這是對類方法(class method)即static 方法而言的。如果子類中定義了靜態方法,則它會隱藏父類中形構相同的(原文中是 subsignature,它的范圍比“形構相同要”大,請參考原文)所有方法,但如果隱藏了父類中的實例方法,則會編譯報錯。
2.根據上面的規范:
“override 覆蓋”的前提是實例方法,只有實例方法在繼承時才會出現override情況。
如果是static方法,在繼承時出現的現象根本就不能用“override”這個詞描述,如果static方法在父類和子類中形構一致,則被成為 hide(隱藏)。
3.因為static方法是類方法,實現時是靜態綁定的(引用“JAVA 核心技術 卷1 第六版”中149頁內容“private、static、final”修飾的方法是靜態綁定的。其他的方法在運行時動態綁定。“interhanchi”所說的“static和final方法外都是后期綁定”并不精確),只與類相關,不會有多態性。 從編程的角度看,效果好像是“static方法不能被覆蓋”;
4.從術語上看,“static方法能否被覆蓋”這種說法本身就是錯誤的,因為“覆蓋”定義的前提和基礎是實例方法。
5.結論: 子類中的static方法會隱藏父類中形構相同的static方法。
final變量的總結:
Final不想做改變的理由是:設計和效率
在java中除了static方法、final方法、(private方法屬于final方法)之外,其他所有的方法都是后期綁定
Final可以修飾基本類型,也可以修飾引用類型,但是當final修飾引用類型的時候,不能夠改變引用指向另一個對象, 但這個對象本身的狀態是可以改變的...
final String string=“final”;
是開辟了2個內存空間,在棧中的string引用在堆中的final,其中string是始終指向堆中的final這個地址的引用,不能改變。但是堆中的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.首先正確的認識一下final, 一個final修飾的叫"終態", 而這種終態很特殊, 它指的是:"當這個變量被賦值之后成為終態". 那么,當一個被賦值之后的final修飾變量, 將不可再被賦新值. (先理解)
2.而static表示靜態變量, 說穿了,你需要知道JAVA如何為一個類創建內存空間--我們知道類有空間,類產生的實例(對象)有空間,方法有空間,變量有空間, 當static修飾時, 這個變量會在類分配內存時就被分配內存了, 所以你知道,你可以不用產生對象就使用靜態變量.
3.好了,有了以上兩點,我們來看看, 你可以根據我的敘述試試. 首先,你只使用final修飾你的string, 你會發現不會報錯, 因為這是一個"還沒有被賦值的非靜態的終態變量(在類分配內存時不會分配內存).好,接下來你改一下,寫:private final String string = "sss"; 你會發現報錯了,原因自己想.
接下來, 看你發出來的代碼, 又被static修飾,又被final修飾,首先它是一個靜態變量, 那么在類分配時就會分配內存, 實際上這個String就被初始化了,既然初始化了, 那么也就有值了, 而一個終態被賦值變量將不能再被賦值, 那么自然就報錯了
學過Java基礎的人都能很容易理解上面的代碼和多態的原理,但是仍有一些關鍵的地方需要注意的,算是自己對多態的一個小結:
1. Java中除了static和final方法外,其他所有的方法都是運行時綁定的。private方法都被隱式指定為final的,因此final的方法不會在運行時綁定。當在派生類中重寫基類中static、final、或private方法時,實質上是創建了一個新的方法。
2.在派生類中,對于基類中的private方法,最好采用不同的名字。
3.包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。
4.對象清理的順序和創建的順序相反,當然前提是自己想手動清理對象,因為大家都知道Java垃圾回收器。
5.在基類的構造方法中小心調用基類中被重寫的方法,這里涉及到對象初始化順序。
6.構造方法是被隱式聲明為static方法。
7.用繼承表達行為間的差異,用字段表達狀態上的變化。