JNDI是J2EE中一個很重要的標(biāo)準(zhǔn),通常我們是在EJB編程中用到,
Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面談一下在Tomcat4.0中配置和使用JNDI的方法
(以通過JNDI連接數(shù)據(jù)庫為例)
假設(shè)使用的數(shù)據(jù)庫是mysql,實驗例子在TOMCAT_HOME/webapps/DBTest目錄中
A.將mysql的JDBC連接庫mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中
B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一個Context:
<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true">
</Context>
這是DBTest的根路徑,這是為了在DBTest中使用做準(zhǔn)備.
C.在上面加入的<Context>;段加入
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/TestDB">
<parameter>
<name>;factory</name>
<value>;org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<parameter>
<name>;maxActive</name>
<value>;100</value>
</parameter>
<!-- Maximum number of idle dB connections to retain in pool.
Set to 0 for no limit.
-->
<parameter>
<name>;maxIdle</name>
<value>;30</value>
</parameter>
<!-- Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<parameter>
<name>;maxWait</name>
<value>;10000</value>
</parameter>
<!-- MySQL dB username and password for dB connections -->
<parameter>
<name>;username</name>;
<value>;test</value>
</parameter>
<parameter>
<name>;password</name>
<value>;test</value>
</parameter>
<!-- Class name for mm.mysql JDBC driver -->;
<parameter>;
<name>;driverClassName</name>;
<value>;org.gjt.mm.mysql.Driver</value>
</parameter>
<!-- The JDBC connection url for connecting to your MySQL dB.-->
<parameter>
<name>;url</name>
<value>;jdbc:mysql://localhost:3306/test</value>
</parameter>
</ResourceParams>
這里每一個小段都有英文注解,是Tomcat提供的,我們可以將按照Sample加入,主要修改的是driverClassName,
url,和用戶帳號;需要強調(diào)的是"jdbc/TestDB"就是JDNI要查找的Name.
在web.xml中加入
<resource-ref>
<description>;DB Connection</description>
<res-ref-name>;jdbc/TestDB</res-ref-name>
<res-type>;javax.sql.DataSource</res-type>
<res-auth>;Container</res-auth>
</resource-ref>
這里的jdbc/TestDb要和C中Resource段的name匹配
JDBC1.0是原來是用DriverManager類來產(chǎn)生一個對數(shù)據(jù)源的連接。JDBC2.0用一種替代的方法,使用DataSource的實現(xiàn),代碼變的更小巧精致,也更容易控制。
一個DataSource對象代表了一個真正的數(shù)據(jù)源。根據(jù)DataSource的實現(xiàn)方法,數(shù)據(jù)源既可以是從關(guān)系數(shù)據(jù)庫,也電子表格,還可以是一個表格形式的文件。當(dāng)一個DataSource對象注冊到名字服務(wù)中,應(yīng)用程序就可以通過名字服務(wù)獲得DataSource對象,并用它來產(chǎn)生一個與DataSource代表的數(shù)據(jù)源之間的連接。
關(guān)于數(shù)據(jù)源的信息和如何來定位數(shù)據(jù)源,例如數(shù)據(jù)庫服務(wù)器的名字,在哪臺機器上,端口號等等,都包含在DataSource對象的屬性里面去了。這樣,對應(yīng)用程序的設(shè)計來說是更方便了,因為并不需要硬性的把驅(qū)動的名字寫死到程序里面去。通常驅(qū)動名字中都包含了驅(qū)動提供商的名字,而在DriverManager類中通常是這么做的。如果數(shù)據(jù)源要移植到另一個數(shù)據(jù)庫驅(qū)動中,代碼也很容易做修改。所需要做的修改只是更改DataSource的相關(guān)的屬性。而使用DataSource對象的代碼不需要做任何改動。
由系統(tǒng)管理員或者有相應(yīng)權(quán)限的人來配置DataSource對象。配置DataSource,包括設(shè)定DataSource的屬性,然后將它注冊到JNDI名字服務(wù)中去。在注冊DataSource對象的的過程中,系統(tǒng)管理員需要把DataSource對象和一個邏輯名字關(guān)聯(lián)起來。名字可以是任意的,通常取成能代表數(shù)據(jù)源并且容易記住的名字。在下面的例子中,名字起為:InventoryDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/ InventoryDB。
一旦配置好了數(shù)據(jù)源對象,應(yīng)用程序設(shè)計者就可以用它來產(chǎn)生一個與數(shù)據(jù)源的連接。下面的代碼片段示例了如何用JNDI上下文獲得一個一個數(shù)據(jù)源對象,然后如何用數(shù)據(jù)源對象產(chǎn)生一個與數(shù)據(jù)源的連接。開始的兩行用的是JNDI API,第三行用的才是JDBC的API:
Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
在一個基本的DataSource實現(xiàn)中,DataSource.getConnection方法返回的Connection對象和用DriverManager.getConnection方法返回的Connection對象是一樣的。因為DataSource提供的方便性,我們推薦使用DataSource對象來得到一個Connection對象。我們希望所以的基于JDBC2.0技術(shù)的數(shù)據(jù)庫驅(qū)動都包含一個基本的DataSource的實現(xiàn),這樣就可以在應(yīng)用程序中很容易的使用它。
對于普通的應(yīng)用程序設(shè)計者,是否使用DataSource對象只是一個選擇問題。但是,對于那些需要用的連接池或者分布式的事務(wù)的應(yīng)用程序設(shè)計者來說,就必須使用DataSource對象來獲得Connection,原因在下面我們會提到。
二、Connection pooling(連接池):
連接池是這么一種機制,當(dāng)應(yīng)用程序關(guān)閉一個Connection的時候,這個連接被回收,而不是被destroy,因為建立一個連接是一個很費資源的操作。如果能把回收的連接重新利用,會減少新創(chuàng)建連接的數(shù)目,顯著的提高運行的性能。
假設(shè)應(yīng)用程序需要建立到一個名字為EmpolyeeDB的DataSource的連接。使用連接池得到連接的代碼如下:
Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了邏輯名字以外,我們發(fā)現(xiàn)其代碼和上面舉的例子的代碼是一樣的。邏輯名字不同,就可以連接到不同的數(shù)據(jù)庫。DataSource對象的getConnection方法返回的Connection是否是一個連接池中的連接完全取決于DataSource對象的實現(xiàn)方法。如果DataSource對象實現(xiàn)與一個支持連接池的中間層的服務(wù)器一起工作,DataSource對象就會自動的返回連接池中的連接,這個連接也是可以重復(fù)利用的。
是否使用連接池獲得一個連接,在應(yīng)用程序的代碼上是看不出不同的。在使用這個Connection連接上也沒有什么不一樣的地方,唯一的不同是在java的finally語句塊中來關(guān)閉一個連接。在finally中關(guān)閉連接是一個好的編程習(xí)慣。這樣,即使方法拋出異常,Connection也會被關(guān)閉并回收到連接池中去。代碼應(yīng)該如下所示:
try{…
}catch(){…
}finally{ if(con!=null)con.close();}
三、分布式事務(wù):
獲得一個用來支持分布式事務(wù)的連接與獲得連接池中的連接是很相似的。同樣,不同之處在于DataSource的實現(xiàn)上的不同,而不是在應(yīng)用程序中獲得連接的方式上有什么不同。假設(shè)DataSource的實現(xiàn)可以與支持分布式事務(wù)中間層服務(wù)器一起工作,得到連接的代碼還是如下所示:
Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一個DataSource能夠支持分布式的事務(wù),它同樣也可以支持連接池管理。
從應(yīng)用程序設(shè)計者的觀點來看。是否支持分布式的事務(wù)的連接對它來說沒什么不同,唯一的不同是在事務(wù)的邊界上(開始一個事務(wù)的地方和結(jié)束一個事務(wù)的地方),開始一個事務(wù)或者結(jié)束一個事務(wù)都是由事務(wù)服務(wù)器來控制的。應(yīng)用程序不應(yīng)該做任何可能妨礙服務(wù)的事情。應(yīng)用程序不能夠直接調(diào)用事務(wù)提交commit或者回滾rollback操作,也不能夠使用事務(wù)的自動提交模式auto-commit mode(在數(shù)據(jù)庫操作完成的時候自動的調(diào)用commit或者rollback)。
在一個連接參與了分布式事務(wù)的時候,下面的代碼是你不能做的(con表示支持分布式事務(wù)的連接Connection)。
con.commit();或者con.rollback();或者con.setAutoCommit(true);對于通常的Connection來說,缺省的是auto-commit模式。而對于支持分布式事務(wù)的Connection來說,缺省不是auto-commit模式。注意,即使Connection是支持事務(wù)的,它也可以用于沒有事務(wù)的情況。關(guān)于事務(wù)邊界的限制只是是對分布式事務(wù)的情況下才成立的。
配置支持連接池的DataSource的時候,涉及到配置ConnectionPoolDataSource對象,這個對象是三層體系結(jié)構(gòu)中的中間層來管理連接池的。同樣的,在配置支持分布式事務(wù)的時候,需要配置XADataSource,XADataSource是中間層用來管理分布式事物的對象。ConnectionPoolDataSource和XADataSource是由驅(qū)動提供商提供的,對應(yīng)用程序的設(shè)計者來說是透明的。和基本的DataSource一樣,系統(tǒng)管理員來配置ConnectionPoolDataSource和XADataSource對象。
四、結(jié)果集(RowSet接口):
結(jié)果集對象是一行行數(shù)據(jù)的容器。根據(jù)其目的,可以通過多種方法實現(xiàn)。RowSet及其相關(guān)的接口與JDBC2.0的標(biāo)準(zhǔn)擴展API有點不同,他們并不是驅(qū)動的一部分,RowSet是在驅(qū)動的上層實現(xiàn)的,可以由其它的任何人來實現(xiàn)他們。
任何類型的rowset都實現(xiàn)了RowSet接口,RowSet接口擴展了ResultSet接口。這樣RowSet對象就有了ResultSet對象所有的功能。能夠通過getXXX方法得到數(shù)據(jù)庫中的某列值,通過updateXXX方法可以修改某列值,可以移動光標(biāo),是當(dāng)前行變?yōu)榱硪恍小?
當(dāng)然,我們更感興趣的是RowSet接口提供的新的功能。作為一個JavaBean組件,RowSet對象可以增加或者刪除一個listener(監(jiān)聽者),可以get或者set其屬性值,這些屬性中,有一個是字符串,表示一個對數(shù)據(jù)庫Query請求,RowSet接口定義了設(shè)定參數(shù)的方法,也提供了執(zhí)行這個請求的方法。這意味著RowSet對象能夠執(zhí)行查詢請求,可以根據(jù)它產(chǎn)生的結(jié)果集進行計算。同樣,RowSet也可以根據(jù)任何表格數(shù)據(jù)源進行計算,所以,它不局限于關(guān)系數(shù)據(jù)庫。
從數(shù)據(jù)源得到數(shù)據(jù)之后,RowSet對象可以和數(shù)據(jù)源斷開連接,rowset也可以被序列化。這樣,RowSet就可以通過網(wǎng)絡(luò)傳遞給瘦客戶端。
RowSet可以被重新連接到數(shù)據(jù)源,這樣,做的修改就可以存回到數(shù)據(jù)源中去。如果產(chǎn)生了一個listener,當(dāng)RowSet的當(dāng)前行移動,或者數(shù)據(jù)被修改的時候,監(jiān)聽者就會收到通知。例如,圖形用戶界面組件可以注冊成為監(jiān)聽者,當(dāng)RowSet更改的時候,圖形用戶界面接到通知,就可以修改界面,來符合它所表示的RowSet。
根據(jù)不同的需要,RowSet接口可以通過多種方法來實現(xiàn)。Java software已經(jīng)寫了一個CachedRowSet實現(xiàn),從http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到這個實現(xiàn)。
與CachedRowSet類不樣的是,JDBCRowSet類總是保持一個和數(shù)據(jù)源的連接。這樣,在ResultSet外圍簡單到加了一層,是基于JDBC技術(shù)的驅(qū)動看起來象是一個簡單的JavaBean組件一樣。
總結(jié):JDBC2.0標(biāo)準(zhǔn)擴展API通過見DataSource注冊到JNDI名字服務(wù)上,將JDBC技術(shù)擴展為一個全新的概念。使應(yīng)用程序的代碼更加精巧,易于控制。新的API支持了連接池,支持分布式的事務(wù)。最后,還使java應(yīng)用程序可以在網(wǎng)絡(luò)上傳播結(jié)果集,是不可以滾動的ResultSet變成了可以滾動的RowSet。
JDBC2.0的擴展API增加了一些數(shù)據(jù)訪問和數(shù)據(jù)源訪問的重大的功能。這中間有一些是主要用來做企業(yè)計算的。用JDBC2.0的新的擴展包,JDBC提供了一個從JAVA2平臺的通用的數(shù)據(jù)訪問的方法。
首先,我們來看看JDBC標(biāo)準(zhǔn)擴展的API怎樣來和JDBC2.0結(jié)合在一起的。JDBC2.0包括兩個包:
1、 java.sql包,個包里面是JDBC2.0的核心API。它包括了原來的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。這個包在Java 2 Platform SDK里面有。
2、 javax.sql包,這里面是JDBC2.0的標(biāo)準(zhǔn)擴展API。這個包是一個全新的,在Java 2 Platform SDK, Enterprise Edition里面單獨提供。
JDBC2.0的核心API包括了JDBC1.0的API,并在此基礎(chǔ)上增加了一些功能,對某些性能做了增強。使java語言在數(shù)據(jù)庫計算的前端提供了統(tǒng)一的數(shù)據(jù)訪問方法,效率也得到了提高。
JDBC是向后兼容的,JDBC1.0的程序可以不加修改的運行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必須要運行在JDBC2.0版本上。
概括的來說,JDBC核心API的新特性在兩個方面做了工作。一個是支持一些新的功能,另一個就是支持SQL3的數(shù)據(jù)類型。
1、 在支持新功能方面:包括結(jié)果集可以向后滾動,批量的更新數(shù)據(jù)。另外,還提供了UNICODE字符集的字符流操作。
2、 在支持SQL3的數(shù)據(jù)類型方面:包括新的SQL3數(shù)據(jù)類型,增加了對持久性對象的存貯。
為了對數(shù)據(jù)的存取,操作更加方便,JDBC的新特性是應(yīng)用程序的設(shè)計更容易了。例如:數(shù)據(jù)塊的操作能夠顯著的提高數(shù)據(jù)庫訪問的性能。新增加的BLOB, CLOB,和數(shù)組接口能夠是應(yīng)用程序操作大塊的數(shù)據(jù)類型,而不必客戶端在存貯之前進行其它的處理。這樣,就顯著的提高了內(nèi)存的使用效率。
下面我們來介紹JDBC2.0的標(biāo)準(zhǔn)擴展API。標(biāo)準(zhǔn)擴展API分為如下幾個方面:
1、 DataSource接口:和Java名字目錄服務(wù)(JNDI)一起工作的數(shù)據(jù)源接口。它提供了對數(shù) 吹囊恢指玫牧臃椒ā?br>; 2、 Connection pooling(連接池):可以重復(fù)使用連接,而不是對每個請求都使用一個新的連接。
3、 Distrubute transaction(分布式的事務(wù)):在一個事務(wù)中涉及到了多個數(shù)據(jù)庫服務(wù)器。
4、 Rowsets:JavaBean組件包含了結(jié)果集,主要用來將數(shù)據(jù)傳給瘦客戶,或者提供一個可以滾動的結(jié)果集。
獲取元素id為idName的元素
如:html
<a id="myLinck" href="#"></a>
$("#myLinck") 會返回<a id="myLinck"></a>元素
-----------------------------------
2.$(".className")
獲取元素class屬性為className的元素集合
如:html
<a class="a1" href="#">1</a>
<a class="a1" href="#">2</a>
<a class="a2" href="#">3</a>
$(".a1")返回[<a class="a1" href="#">1</a>,<a class="a1" href="#">2</a>]
---------------------------------------
3.$("input[@type='text']")
獲取所有type=text的input元素
如:html
<input type='text'/>
<input type='text/>
<input type='checkbox'/>
$("input[@type='text']")返回[<input type='text'/><input type='text/>]
普通的dom對象一般可以通過$()轉(zhuǎn)換成jquery對象。
如:$(document.getElementById("msg"))則為jquery對象,可以使用jquery的方法。
由于jquery對象本身是一個集合。所以如果jquery對象要轉(zhuǎn)換為dom對象則必須取出其中的某一項,一般可通過索引取出。
如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這些都是dom對象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下幾種寫法都是正確的: 字串8
$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;
為了支持 AJAX 功能。這個包定義了 Ajax.Request 類。
假如你有一個應(yīng)用程序可以通過url http://yoursever/app/get_sales?empID=1234&year=1998與服務(wù)器通信。它返回下面這樣的XML 響應(yīng)。


















用 Ajax.Request對象和服務(wù)器通信并且得到這段XML是非常簡單的。下面的例子演示了它是如何完成的。

































你看到傳入 Ajax.Request構(gòu)造方法的第二個對象了嗎? 參數(shù){method: 'get', parameters: pars, onComplete: showResponse} 表示一個匿名對象的真實寫法。他表示你傳入的這個對象有一個名為 method 值為 'get'的屬性,另一個屬性名為 parameters 包含HTTP請求的查詢字符串,和一個onComplete 屬性/方法包含函數(shù)showResponse。
還有一些其它的屬性可以在這個對象里面定義和設(shè)置,如 asynchronous,可以為true 或 false 來決定AJAX對服務(wù)器的調(diào)用是否是異步的(默認值是 true)。
這個參數(shù)定義AJAX調(diào)用的選項。在我們的例子中,在第一個參數(shù)通過HTTP GET命令請求那個url,傳入了變量 pars包含的查詢字符串, Ajax.Request 對象在它完成接收響應(yīng)的時候?qū)⒄{(diào)用showResponse 方法。
也許你知道, XMLHttpRequest在HTTP請求期間將報告進度情況。這個進度被描述為四個不同階段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 對象在任何階段調(diào)用自定義方法 ,Complete 是最常用的一個。想調(diào)用自定義的方法只需要簡單的在請求的選項參數(shù)中的名為 onXXXXX 屬性/方法中提供自定義的方法對象。 就像我們例子中的 onComplete 。你傳入的方法將會被用一個參數(shù)調(diào)用,這個參數(shù)是 XMLHttpRequest 對象自己。你將會用這個對象去得到返回的數(shù)據(jù)并且或許檢查包含有在這次調(diào)用中的HTTP結(jié)果代碼的 status 屬性。
還有另外兩個有用的選項用來處理結(jié)果。我們可以在onSuccess 選項處傳入一個方法,當(dāng)AJAX無誤的執(zhí)行完后調(diào)用, 相反的,也可以在onFailure選項處傳入一個方法,當(dāng)服務(wù)器端出現(xiàn)錯誤時調(diào)用。正如onXXXXX 選項傳入的方法一樣,這兩個在被調(diào)用的時候也傳入一個帶有AJAX請求的XMLHttpRequest對象。
我們的例子沒有用任何有趣的方式處理這個 XML響應(yīng), 我們只是把這段XML放進了一個文本域里面。對這個響應(yīng)的一個典型的應(yīng)用很可能就是找到其中的想要的信息,然后更新頁面中的某些元素, 或者甚至可能做某些XSLT轉(zhuǎn)換而在頁面中產(chǎn)生一些HTML。
完。
摘自:https://compdoc2cn.dev.java.net
在援救完貝爾斯登公司(Bear Stearns Cos.)后,美國聯(lián)邦儲備委員會(Fed)主席貝南克(Ben Bernanke)今晚可能會再次送出減息良藥。(編者:最新消息,F(xiàn)ed周二已宣布將關(guān)鍵利率下調(diào)75個基點。)而這對于香港和中國大陸市場來說又意味著什么呢?對正面臨著十幾年來最高通貨膨脹率的中國貨幣政策制定者而言,F(xiàn)ed的“靈丹”卻可能產(chǎn)生副作用。但是,只要中國繼續(xù)堅持現(xiàn)行的匯率制度,就不得不生生吞下這顆藥丸,而且還必須硬著頭皮去應(yīng)對。中國央行(People's Bank of China)加息而Fed大幅降息,產(chǎn)生的直接影響就是中美利差進一步擴大,使得熱錢問題再次成為眾矢之的。上周公布的數(shù)據(jù)顯示,F(xiàn)ed 1月份的緊急降息造成中美貨幣市場利差達到了50個基點,并使得流入中國大陸的外商直接投資規(guī)模進一步增大。今年前兩個月流入中國大陸的外商直接投資較上年同期增長了75%。這些外資到底是進行商業(yè)投資還是純粹出于投機目的不得而知,不過可以肯定的一點是,中美利差的擴大勢必會增強人民幣升值預(yù)期。上周五人民幣升至匯改以來最高水平,達到1美元兌人民幣7.0844元。
.... ...
? Fed救市之舉令中國控制通脹難度加大
struts響應(yīng)用戶請求的工作流程:
Request
| ActionServlet
| 如果不存在相應(yīng)的Action則否則返回error,流程結(jié)束
| 創(chuàng)建ActionForm
| 進行validatge校驗,如果沒有通過校驗則返回error
| 創(chuàng)建Action
| 執(zhí)行Action的execute方法,并返回ActionForword對象
| return respose
結(jié)束
|
基于城鎮(zhèn)居民和農(nóng)村居民的人均純收入實現(xiàn)較大躍升的現(xiàn)實,國務(wù)院總理溫家寶在今年的政府工作報告中特別強調(diào)了收入分配的問題,“逐步提高居民收入在國民收入分配中的比重,提高勞動報酬在初次分配中比重”。
個中關(guān)鍵就是要“調(diào)整國民收入分配格局,深化收入分配制度改革。”并多渠道增加農(nóng)民收入,確保農(nóng)民工工資按時足額發(fā)放。還要“提高企業(yè)職工工資的水平,建立企業(yè)職工工資正常增長和支付保障機制,……健全并落實最低工資制度。”
同時,改革國有企業(yè)工資總額管理辦法,加強對壟斷行業(yè)企業(yè)工資監(jiān)管。對此,勞動和社會保障部勞動工資司司長邱小平表示,既要通過采取措施,促進非壟斷行業(yè)的企業(yè)職工工資收入逐步提高;又要對壟斷行業(yè)的高收入采取措施,加以有效調(diào)控。
閱讀全文