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

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

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

    隨筆-3  評論-1  文章-0  trackbacks-0
      2006年10月8日
    引用:http://leo-faith.iteye.com/blog/177779
    不久前用到了同步,現在回過頭來對JAVA中的同步做個總結,以對前段時間工作的總結和自我技術的條理話。JAVA中synchronized關鍵字能夠作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊。假如再細的分類,synchronized可作用于instance變量、object reference(對象引用)、static函數和class literals(類名稱字面常量)身上。 
    在進一步闡述之前,我們需要明確幾點: 
    A.無論synchronized關鍵字加在方法上還是對象上,他取得的鎖都是對象,而不是把一段代碼或函數當作鎖――而且同步方法很可能還會被其他線程的對象訪問。 
    B.每個對象只有一個鎖(lock)和之相關聯。 
    C.實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。 
    接著來討論synchronized用到不同地方對代碼產生的影響: 

    假設P1、P2是同一個類的不同對象,這個類中定義了以下幾種情況的同步塊或同步方法,P1、P2就都能夠調用他們。 

    1.  把synchronized當作函數修飾符時,示例代碼如下: 
    Public synchronized void method(){ 
    //…. 

    這也就是同步方法,那這時synchronized鎖定的是哪個對象呢?他鎖定的是調用這個同步方法對象。也就是說,當一個對象P1在不同的線程中執行這個同步方法時,他們之間會形成互斥,達到同步的效果。但是這個對象所屬的Class所產生的另一對象P2卻能夠任意調用這個被加了synchronized關鍵字的方法。 
    上邊的示例代碼等同于如下代碼: 
    public void method() 

    synchronized (this)      //  (1) 

           //….. 


    (1)處的this指的是什么呢?他指的就是調用這個方法的對象,如P1。可見同步方法實質是將synchronized作用于object reference。――那個拿到了P1對象鎖的線程,才能夠調用P1的同步方法,而對P2而言,P1這個鎖和他毫不相干,程式也可能在這種情形下擺脫同步機制的控制,造成數據混亂:( 
    2.同步塊,示例代碼如下: 
    public void method(SomeObject so) { 
    synchronized(so) 

           //….. 


    這時,鎖就是so這個對象,誰拿到這個鎖誰就能夠運行他所控制的那段代碼。當有一個明確的對象作為鎖時,就能夠這樣寫程式,但當沒有明確的對象作為鎖,只是想讓一段代碼同步時,能夠創建一個特別的instance變量(他得是個對象)來充當鎖: 
    class Foo implements Runnable 

           private byte[] lock = new byte[0];  // 特別的instance變量 
        Public void method() 

           synchronized(lock) { //… } 

    //….. 

    注:零長度的byte數組對象創建起來將比任何對象都經濟――查看編譯后的字節碼:生成零長度的byte[]對象只需3條操作碼,而Object lock = new Object()則需要7行操作碼。 
    3.將synchronized作用于static 函數,示例代碼如下: 
          Class Foo 

    public synchronized static void method1()   // 同步的static 函數 

    //…. 

    public void method2() 

           synchronized(Foo.class)   //  class literal(類名稱字面常量) 

           } 
       代碼中的method2()方法是把class literal作為鎖的情況,他和同步的static函數產生的效果是相同的,取得的鎖很特別,是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。 
    記得在《Effective Java》一書中看到過將 Foo.class和 P1.getClass()用于作同步鎖還不相同,不能用P1.getClass()來達到鎖這個Class的目的。P1指的是由Foo類產生的對象。 
    能夠推斷:假如一個類中定義了一個synchronized的static函數A,也定義了一個synchronized 的instance函數B,那么這個類的同一對象Obj在多線程中分別訪問A和B兩個方法時,不會構成同步,因為他們的鎖都不相同。A方法的鎖是Obj所屬的那個Class,而B的鎖是Obj所屬的這個對象。 

    小結如下: 
    搞清楚synchronized鎖定的是哪個對象,就能幫助我們設計更安全的多線程程式。 


    更有一些技巧能夠讓我們對共享資源的同步訪問更加安全: 
    1.  定義private 的instance變量+他的 get方法,而不要定義public/protected的instance變量。假如將變量定義為public,對象在外界能夠繞過同步方法的控制而直接取得他,并改變他。這也是JavaBean的標準實現方式之一。 
    2.  假如instance變量是個對象,如數組或ArrayList什么的,那上述方法仍然不安全,因為當外界對象通過get方法拿到這個instance對象的引用后,又將其指向另一個對象,那么這個private變量也就變了,豈不是很危險。 這個時候就需要將get方法也加上synchronized同步,并且,只返回這個private對象的clone()――這樣,調用端得到的就是對象副本的引用了。
    posted @ 2014-04-09 15:27 xzc0202 閱讀(77) | 評論 (0)編輯 收藏

    摘要:

    XFire是一個免費的開源SOAP框架,它不僅可以極大方便地實現這樣一個環境,并且可以提供許多Web Services規范中高級特征,這些特征在多數的商業或者開源工具都沒有提供。你要恰當的理解這些單詞:great ease and simplicity(非常輕松和簡單)。你將會看到使用XFire創建Web Services是多么的簡單。
    將你的POJO方法發布為Web Services

    摘要

    問一下.Net的開發者,開發Web Services有多困難?他們會被你的問題逗樂,他們會告訴你所有步驟花費的時間不會超過一分鐘。再問一下Java開發者,運氣好的話你會碰到上面的回答,一般情況下,你會得到一個完全不同的答案。從Web Services引入到Java中至今已經5年了,然而它仍然被認為是一門較新的技術,一個主要的原因就是使用Java實現Web Services太困難了。現在,隨著新一代Web Services引擎XFire的發布,這種情況將會發生明顯的變化。使用XFire,你可以把Java類方法發布為Web Services而不需要編寫額外的代碼。在這篇文章中,你將會看到XFire使Web Services開發變得多么容易和簡單。

    Web Services使我們能夠在網絡上建立分布式系統,應用程序組件可以通過任何平臺、任何語言和任何方式訪問。無論應用程序如何開發,使用了什么語言,以及運行在什么操作系統平臺上,只要它作為Web Service,并且為協同解決問題而設計,那么你的應用程序,以任何語言開發或在任何平臺上,都可以利用它的服務。這是Web Service的主要概念。

    為了實現Web Services的平臺無關性和實現訪問獨立性,軟件行業需要遵循一些作為標準的技術。其中一些包括:
    ---XML:在Web Services環境中各層之間進行傳遞的默認數據格式。
    ---SOAP:封裝和交換信息的默認協議。第一次被提出時,它是只取Simple Object Access Protocol(簡單對象訪問協議)的首字母。但是現在SOAP更多被認為是一個特定的名詞,以它自己而命名,同樣很多人認為這是用詞不當:SOAP實際上不是用來訪問對象的。另外,它也不再簡單。
    ---WSDL(Web Services Description Language,Web Services描述語言):描述Web Services的語言。盡管基于XML并且可以被人理解,WSDL主要是由機器處理,由客戶端程序讀取和理解。

    下面的高級層次圖表,基于WWW協會發布的“Web Services Architecture”(Web Services架構)文檔,顯示了這些技術在實際的工作環境中是如何發揮作用:

    image
    這個流程圖顯示了Web Services中的核心技術是如何工作的。

    這里,Provider是提供服務的應用程序組件,Requester是使用服務的客戶端程序。很多其他技術也會參與到交互中,但是這個圖只顯示了在Web Services環境中必需的核心技術組件。

    XFire是一個免費的開源SOAP框架,它不僅可以極大方便地實現這樣一個環境,并且可以提供許多Web Services規范中高級特征,這些特征在多數的商業或者開源工具都沒有提供。你要恰當的理解這些單詞:great ease and simplicity(非常輕松和簡單)。你將會看到使用XFire創建Web Services是多么的簡單。

    假如你的Web應用有一個Java類,并且你想把它的一個方法發布為Web Services,當使用XFire時,你不需要編寫一行額外的Java代碼。只需要編輯發布描述符,然后你就會得到一個Web Services。是的,它相當地簡單。我們來看一個例子。

    版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接
    作者:Shahid Ahmed ;mydeman
    原文:http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-xfire.html
    Matrix:http://www.matrix.org.cn/resource/article/2006-09-24/XFire_6bd1061c-4bc6-11db-978f-43b3336b7e51.html
    關鍵字:XFire;Web Services

    一個簡單的Java類

    我們的例子是一個銀行業應用程序,服務器是運行在J2SE1.4.2_07下的Apache Tomcat5.5.7。假定你已經了解如何使用Java編寫Web應用程序,并知道應該如何把它部署到Apache Tomcat服務器上。我們的Web應用程序非常簡單;它只做一件事——將資金從一個賬戶轉到另外一個賬戶上。一個普通的Java類BankingService包含了一個叫做transferFunds()的方法來為我們完成這項工作。它需要四個輸入參數:
    1、????????String fromAccount
    2、????????String toAccount
    3、????????double amount
    4、????????String currency

    代碼如下:
    package com.mybank.xfire.example;

    import java.text.NumberFormat;
    import java.text.DecimalFormat;

    /** XFire WebServices sample implementation class.
    */
    public class BankingService implements IBankingService {
    ????
    ????//Default constructor.
    ????public BankingService(){????
    ????}
    ????
    ????/** Transfers fund from one account to another.
    ????*/
    ????public String transferFunds(
    ????????String fromAccount, String toAccount, double amount, String currency){
    ????????
    ????????String statusMessage = "";
    ??????????????????????
    ????????//Call business objects and other components to get the job done.
    ????????//Then create a status message and return.
    ????????try {
    ????????????NumberFormat formatter = new DecimalFormat("###,###,###,###.00");??????
    ????????????statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+
    ????????????" was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;
    ????????} catch (Exception e){
    ????????????statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString();
    ????????}
    ????????return statusMessage;
    ????}
    ????
    }


    在這里你看到了什么異常的東西了嗎?或許沒有,除了默認的構造函數,類型是public。這是必須的。否則,XFire不能夠初始化這個類。

    因為使用接口的設計是一個好的實踐,所以我們的Java類也實現了一個稱為IBankingService的接口。代碼十分簡單:
    package com.mybank.xfire.example;

    public interface IBankingService {??

    ????public String transferFunds(
    ????????String fromAccount, String toAccount, double amount, String currency);
    ????????
    }


    在實際實現中,這樣一個方法可能包括各種類型的復雜調用、查詢和處理操作。但是我們的示例代碼已經最小化了,以至于我們可以集中精力在主要目標上:把這個方法發布為Web Services。

    你可以看到BankingService是一個普通的Java類,沒有任何代碼告訴我們它將會在Web Services中使用。好的,這里我們不需要增加任何東西。我們所有的工作都在部署描述符里完成。

    Web應用的部署描述符

    在Java中,Web應用程序通常需要至少一個部署描述符(叫做web.xml)對其進行配置。XFire本身是一個基于servlet的應用程序。因此,我們需要增加必要的引用到描述符文件中。然后我們還必須配置將要創建的Web Services。我們使用一個稱為services.xml的新文件來完成這件事。

    web.xml
    首先,修改web.xml。我們需要增加下面的XFire servlet相關的條目:
    <servlet>
    ????????<servlet-name>XFireServlet</servlet-name>
    ????????<display-name>XFire Servlet</display-name>
    ????????<servlet-class>org.codehaus.xfire.transport.http.XfireConfigurableServlet
    ???????? </servlet-class>
    ????</servlet>

    ????<servlet-mapping>
    ????????<servlet-name>XFireServlet</servlet-name>
    ????????<url-pattern>/servlet/XFireServlet/*</url-pattern>
    ????</servlet-mapping>
    ????
    ????<servlet-mapping>
    ????????<servlet-name>XFireServlet</servlet-name>
    ????????<url-pattern>/services/*</url-pattern>
    ????</servlet-mapping>


    services.xml
    現在我們不得不說一下我們的Web Services的由什么組成的了。這由一個叫做services.xml的文件完成,它存放在META-INF/xfire目錄下,而這整個目錄放在WEB-INF/classes文件夾中,它在Web應用程序的標準類路徑中。這里是services.xml中的基本配置條目:
    <beans xmlns="http://xfire.codehaus.org/config/1.0">
    ??
    ??<service>
    ????<name>Banking</name>
    ????<namespace>mybank</namespace>
    ????<serviceClass>com.mybank.xfire.example.IBankingService</serviceClass>
    ????<implementationClass>com.mybank.xfire.example.BankingService</implementationClass>
    ??</service>??
    ??
    </beans>


    讓我們看看這里都包含了什么內容。Web Services的定義包含在<service>元素中,它還含有一些子元素。第一個子元素是<name>,它可以是你提供任何的合法名字。這將會被客戶端程序和其它需要定位你的服務的組件用到。例如,在服務準備好以后,你將在瀏覽器上使用這個名字來查看WSDL。

    下一個子元素是<namespace>。任何合法的XML名字都是可以的。<namespace>用來唯一標識你的服務的各個參數。
    <serviceClass>元素包含了Java類的名字,它指定了方法簽名。在我們的例子中,它是接口IBankingService。如果Java類沒有實現任何接口,你就需要把類的名字放在這里。在你的Java類或者接口中可能有幾個方法。只需要一個入口把它們全部發布為Web Services。

    <implementationClass>保存了實現方法的Java類名。這是一個可選元素。如果上一個元素<serviceClass>包含了一個接口,那么相應的實現類必須在這里指定。

    就是這樣。我們的Web Services配置完成了。

    XFire和其它類庫

    現在是最后一步了,需要得到所有必需的類庫。我們怎樣得到它們呢?去XFire網站,下載xfire-distribution-1.0.zip,然后解壓到一個本地文件夾。復制下面的jar文件和它的庫文件夾到WEB-INF/lib中:
    ?????????activation-1.0.2.jar
    ?????????commons-codec-1.3.jar
    ?????????commons-httpclient-3.0.jar
    ?????????commons-logging-1.0.4.jar
    ?????????jaxen-1.1-beta-8.jar
    ?????????jdom-1.0.jar
    ?????????log4j-1.2.x.jar
    ?????????mail-1.3.3_01.jar
    ?????????spring-1.2.x.jar
    ?????????stax-api-1.0.jar
    ?????????wsdl4j-1.5.2.jar
    ?????????wstx-asl-2.9.jar
    ?????????xbean-2.1.0.jar
    ?????????xbean-spring-2.2.jar
    ?????????xfire-all-1.0.jar
    ?????????XmlSchema-1.0.jar

    一切妥當。我們來部署和啟動應用程序。為了部署示例應用,只需要復制websvc.war到Apache Tomcat的webapps文件夾中,再等待幾秒鐘。它將會自動啟動。這個應用的全部源代碼也包含在這個war文件中。我們的程序已經準備作為一個Web Service了。

    我們如何知道Web Service正在工作呢?

    為了了解Web Service是否正在工作,我們需要測試。首先,我們測試來看WSDL是否可用。我們在瀏覽器中輸入URL。哪個URL?因為我們的應用程序的war文件是websvc.war,并且在services.xml中給出的服務名是Banking,WSDL的URL應該是:http://localhost:8080/websvc/services/Banking?wsdl。

    請注意:URL的第一部分,例如,http://localhost:8080,可能會根據你的應用服務器不同而不同。無論怎樣,當你輸入URL后,將會看到一個XML文檔,它的根元素是<wsdl:definitions>。這個文檔叫做服務的WSDL。如果你看到了,這就是你的應用作為Web Service已經可用的第一個證明。

    但是這個測試是不夠的。可能會發生這種情況,可以看到WSDL,但是從客戶端程序可能會訪問不到服務。因此為了核實服務是否可以訪問了,我們必須使用一個客戶端進行服務的實際調用來進行一個真正的測試。

    開發一個客戶端

    你可以使用任何的SOAP工具創建客戶端,例如,.Net或者Apache Axis,有很多種方法:使用從WSDL產生的stubs,使用動態代理,等等。在例子中,我們使用一個動態代理,以一個簡單的Servlet形式,叫做WsClient.java。為了保持代碼兩最小,所有在屏幕顯示的元素都放在了doGet()方法中。對Web Service的實際調用由callWebService()方法完成,它相當地簡單。和下面的類似:
    /* Call the Web service
    ????*
    ????*/
    ????public String callWebService(
    ????????String fromAccount, String toAccount, double amount, String currency)
    ????????throws MalformedURLException, Exception {
    ????????
    ????????//Create a metadata of the service??????
    ????????Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);????????
    ????????log.debug("callSoapServiceLocal(): got service model." );
    ??
    ????????//Create a proxy for the deployed service
    ????????XFire xfire = XFireFactory.newInstance().getXFire();
    ????????XFireProxyFactory factory = new XFireProxyFactory(xfire);??????
    ????
    ????????String serviceUrl = "http://localhost:8080/websvc/services/Banking";
    ????????
    ????????IBankingService client = null;
    ????????try {
    ????????????client = (IBankingService) factory.create(serviceModel, serviceUrl);
    ????????} catch (MalformedURLException e) {
    ????????????log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());
    ????????}????
    ??????????????
    ????????//Invoke the service
    ????????String serviceResponse = "";
    ????????try {
    ????????????serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);
    ?????? } catch (Exception e){
    ????????????log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());????????????????
    ????????????serviceResponse = e.toString();
    ????????}????????
    ????????log.debug("WsClient.callWebService(): status=" + serviceResponse);??????????????

    ????????//Return the response
    ????????return serviceResponse;
    ????}??


    這個代碼是如何工作的呢?我來解釋一下:首先,我們創建一個服務模型,它包含服務的說明——換句話說,就是服務的元數據。我們使用XFire的ObjectServiceFactory從IBankingService.class接口創建這個模型。

    接著,為XFire獲得一個代理工廠對象,它包含了常規的代碼,也相當地簡單和易懂。這一步中沒有任何特定應用的東西。從這個proxyFactory,使用服務模型和服務端點URL(用來獲得WSDL),我們可以得到一個服務的本地代理。

    就是它了。這個代理就是實際的客戶端。現在,我們可以調用它的transferFunds()方法來得到我們需要的Web Service。
    一旦示例應用發布并啟動,就可以嘗試servlet URL:
    http://localhost:8080/websvc/ws。

    這個Servlet使用默認參數來調用Web Service和顯示接收到的響應。頁面的最后兩行應該讀取:
    Response Received
    COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678

    現在你可以確定Web Service已經發布并且在運行中了。

    為了嘗試不同的輸入值,你可以使用完整的URL,例如:
    http://localhost:8080/websvc/ws?from=11-2345&to=77-9876&amt=250.00&cur=EUR。

    基本的Web Services開發步驟清單

    這個清單總結了將一個Java方法發布為Web Service所必須的步驟:
    1、????????檢查Java類的方法和默認構造函數確保為public
    2、????????增加XFire servlet相關條目到web.xml中
    3、????????創建services.xml,把它放到WEB-INF/classes/META-INF/xfire目錄下
    4、????????增加XFire和第三方包到你的Web應用的WEB-INF/lib文件夾中

    這就是所有需要的步驟,是的,相當簡單。

    XFire的其他高級特性

    XFire的使用可能比較簡單,但是在特性和功能性上,它卻占據著領導者的位置。下面是它的高級特性:
    ---本地數據綁定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。數據綁定說明了Web Services的XML請求和映射到Java對象的XML響應。
    ---使用StAX(Streaming API for XML)處理XML文檔。同DOM的基于樹和SAX的事件驅動的處理方式相比,StAX使用了拉(pull)機制,它使處理更快速,內存效率更高。
    ---支持多種傳輸協議,如HTTP、JMS(Java Message Service)和JVM內部傳輸。
    ---嵌入式,這是XFire的核心功能之一。你可以把這個SOAP引擎嵌入到你的應用中,完全隱藏所有XFire特定引用,同樣所有配置都是程序驅動。
    ---豐富的API,它使XFire可高度自定義,允許開發者在不同的階段截獲請求,并且對他們進行處理。
    ---兼容最新的標準例如SOAP1.1(沒有加密遠程工程調用,或者RPC)和1.2、WSDL1.1、the Web Services Interoperability Organization’s Basic Profile 1.0、Web Services Addressing和WS-Security。

    最重要的是,XFire屬于新一代Web Services引擎。不僅僅是營銷用語,“新一代”有一些重要的意義。Apache Axis是第一代Java語言的Web Services引擎,已經成為了所有后來工具的參考標準。在過去的幾年里,Axis以及這些其它的工具已經在很多生產環境中進行了實地測試。從中得出的一個關鍵的問題就是Web Services并不最適合RPC類型的通信。對于性能和效率,面向文檔的消息形式是最好的方式。但是Apache Axis和很多其他的Web Services引擎都被設計成了面向RPC的(盡管它們支持文檔形式)。現在,整個行業正在開發新一代的SOAP引擎,設計為面向文檔的。Apache已經宣布結束舊版本的Axis引擎開發,現在專注于Axis2,現在它的預發布版本是0.95。XFire在今年的2月份發布了它的第一個產品版本(1.0)。它的下一個版本(1.1)僅僅在幾個星期之后就進行了發布。

    性能

    Web Services需要消耗很多資源,但是性能方面它們不是那么引人注目。XFire打破了這種趨勢。它消耗更少的內存(部分因為 StAX的使用),但是表現卻比多數可比較的SOAP引擎出色。你可以在資源中提供的鏈接中看到比較的結果。
    此外,XFire還提供了各種方法來進一步優化性能。一個方法是使用JVM內置傳輸(in-JVM transport)。如果你知道Web Services和客戶端運行在同一個JVM上,你可以選擇使用本地傳輸,它可以大幅提升性能。在示例中的客戶端代碼,看以下指定服務端點URL的這行:
    String serviceUrl = "http://localhost:8080/websvc/services/Banking";
    替換為
    String serviceUrl = "xfire.local://Banking";

    你會看到性能上的明顯提高,因為它繞過了整個網絡層。

    局限性

    XFire有些重要的局限性你應該清楚:
    ---開發Web Services的好的實踐是從WSDL開始。大部分的SOAP引擎提供了從WSDL生成服務stub的工具。XFire也提供了這樣一個工具。但是它是基于注釋(annotations-based)的,因此需要J2SE5.0。對于仍堅持使用J2SE1.4.x的人來說,它不是一個令人拍手叫好的工具,因為我們有很多其他方式來編寫客戶端,一個就是文章中演示的方式。
    ---附件支持,它將會包含在未來發行的版本中。
    ---易于學習的用戶向導。XFire團隊在這個方面還有很多工作需要做。

    結論

    Java當前的趨勢是簡化技術的使用。因此,我們正看到一波基于POJO的開發成就。同時,面向服務架構(SOA,Services-oriented architecture)和Web Services已經變成了當前行業的熱點話題。XFire正是在這種情況下產生的。它能夠使POJO發布為最少的Web Services,而只需要付出最小化的努力。從而,它使希望使用這項技術的初級開發者的學習曲線變得平緩。同時,由于它兼容最新標準和提供了豐富的API,XFire為高級用戶提供了更多的大好機會。

    關于作者
    Shahid Ahmed是一個軟件架構師,如今在美國一家主要的無線運行商作咨詢工作。他在22年前開始開發軟件,當時Kaypro、Osborne、Apple II和TRS-80s統治著整個地球。在過去的7年里,他更多的精力集中于Java。他現在的工作包括SOA、Web Services、消息、POJO、Spring、Ajax等等。Shahid是一個軟件熱衷者,每天都在奮斗以求在技術的迷戀和社會生活的熱愛之間尋找平衡點。

    資源:
    Matrix Java社區:http://www.matrix.org.cn
    下載本文中的示例應用:http://www.javaworld.com/javaworld/jw-05-2006/xfire/jw-0501-xfire.zip
    Web Services架構:http://www.w3.org/TR/ws-arch/
    WSDL2.0(原來提議為WSDL1.2,現在重新命名了):第一部分:核心語言(W3C Candidate Recommendation 27 March 2006)
    posted @ 2006-10-08 15:40 xzc0202 閱讀(298) | 評論 (1)編輯 收藏
    <%@ page contentType="text/html; charset=gb2312" %>
    <%@ page language="java" %>
    <%@ page import="com.mysql.jdbc.Driver" %>
    <%@ page import="java.sql.*" %>

    <%
    ?Connection sqlCon; //數據庫連接對象

    ?Statement sqlStmt; //SQL語句對象

    ?ResultSet sqlRst; //結果集對象

    ?String strCon; //數據庫連接字符串

    ?String strSQL; //SQL語句

    ?int intPageSize; //一頁顯示的記錄數

    ?int intRowCount; //記錄總數

    ?int intPageCount; //總頁數

    ?int intPage; //待顯示頁碼

    ?String strPage;

    ?int i;

    ?intPageSize = 2; //設置一頁顯示的記錄數

    ?strPage = request.getParameter("page"); //取得待顯示頁碼

    ?if(strPage==null)
    ?{

    ??//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據

    ??intPage = 1;

    ?}
    ?else
    ?{

    ??//將字符串轉換成整型

    ??intPage = java.lang.Integer.parseInt(strPage);

    ??if(intPage<1) intPage = 1;

    ?}

    ?//裝載JDBC驅動程序

    ?? //驅動程序名

    ?? String driverName="com.mysql.jdbc.Driver";

    ?? //數據庫用戶名

    ?? String userName="test";

    ?? //密碼

    ?? String userPasswd="123456";

    ?? //數據庫名
    ?
    ?? String dbName="shujuku";

    ?? //表名

    ?? String tableName="biao";

    ?? //聯結字符串

    ?? String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;

    ?? Class.forName("com.mysql.jdbc.Driver").newInstance();

    ?? sqlCon=DriverManager.getConnection(url);

    ?? //創建語句對象
    ?
    ?sqlStmt = sqlCon.createStatement(); //執行SQL語句

    ??? strSQL = "select name from " + tableName;

    ??? //執行SQL語句并獲取結果集

    ??? sqlRst = sqlStmt.executeQuery(strSQL);

    ??? //獲取記錄總數

    ?sqlRst.last();

    ?intRowCount = sqlRst.getRow();

    ?//記算總頁數

    ?intPageCount = (intRowCount+intPageSize-1) / intPageSize;

    ?//調整待顯示的頁碼

    ?if(intPage>intPageCount) intPage = intPageCount;

    %>

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <title>JSP數據庫操作例程 - 數據分頁顯示 - JDBC 2.0 - mysql</title>

    </head>

    <body>

    <table border="1" cellspacing="0" cellpadding="0">

    <tr>

    <th>姓名</th>

    </tr>

    <% if(intPageCount>0)

    {

    ?//將記錄指針定位到待顯示頁的第一條記錄上

    ?sqlRst.absolute((intPage-1) * intPageSize + 1);

    ?//顯示數據

    ?i = 0;

    ?while(i<intPageSize && !sqlRst.isAfterLast()){ %>

    <tr>

    <td>

    <%=sqlRst.getString(1)%>

    </td>

    </tr>

    <% sqlRst.next();

    i++;

    }

    }

    %>

    </table>

    第<%=intPage%>頁 共<%=intPageCount%>頁

    <%if(intPage<intPageCount){%><a href="test1.jsp?page=<%=intPage+1%>">下一頁</a><%}%>

    <%if(intPage>1){%><a href="test1.jsp?page=<%=intPage-1%>">上一頁</a><%}%>

    </body>

    </html>

    <%

    //關閉結果集

    sqlRst.close();

    //關閉SQL語句對象

    sqlStmt.close();

    //關閉數據庫

    sqlCon.close();

    %>
    ?
    ?
    ?

    posted @ 2006-10-08 15:22 xzc0202 閱讀(215) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲AV美女一区二区三区| 亚洲美女大bbbbbbbbb| 日本亚洲国产一区二区三区| 久久精品国产亚洲AV网站| 33333在线亚洲| 国产特黄一级一片免费 | 久久不见久久见免费影院www日本| 在线免费观看毛片网站| 亚洲AV无码久久精品蜜桃| 中文成人久久久久影院免费观看| 成人网站免费观看| 亚洲AV日韩AV天堂一区二区三区 | 久久99国产乱子伦精品免费| 国产免费人成视频在线观看| 亚洲欧洲日产v特级毛片| 999zyz**站免费毛片| 亚洲av日韩av激情亚洲| 亚洲免费观看在线视频| 亚洲av永久无码精品古装片| 久久成人免费大片| 在线亚洲午夜理论AV大片| 中文字幕在线免费看线人| 4444亚洲国产成人精品| 欧美a级成人网站免费| 欧洲亚洲综合一区二区三区| 女人被男人桶得好爽免费视频| 亚洲欧美日韩中文无线码| 57pao一国产成永久免费| 精品亚洲综合久久中文字幕| 人碰人碰人成人免费视频| 四虎永久免费地址在线观看| 永久免费精品影视网站| 亚洲国产综合精品中文第一区| 中国黄色免费网站| 亚洲午夜久久久久久久久电影网| 黄色a三级免费看| 啊v在线免费观看| 国产精品久久久久久亚洲影视| 国产亚洲精品久久久久秋霞| 久久精品毛片免费观看| 亚洲欧美国产国产综合一区|