摘è¦:XFire是一个å…费的开æºSOAP框架åQŒå®ƒä¸ä»…å¯ä»¥æžå¤§æ–¹ä¾¿åœ°å®žçŽ°è¿™æ ·ä¸€ä¸ªçŽ¯å¢ƒï¼Œòq¶ä¸”å¯ä»¥æä¾›è®¸å¤šWeb Services规范ä¸é«˜¾U§ç‰¹å¾ï¼Œ˜q™äº›ç‰¹å¾åœ¨å¤šæ•°çš„商业或者开æºå·¥å…·éƒ½æ²¡æœ‰æä¾›ã€‚ä½ è¦æ°å½“çš„ç†è§£˜q™äº›å•è¯åQšgreat ease and simplicityåQˆéžå¸¸è½»æ‘Ö’Œ½Ž€å•ï¼‰ã€‚ä½ ž®†ä¼š(x¨¬)看到使用XFire创å¾Web Services是多么的½Ž€å•ã€?br />
ž®†ä½ çš„POJOæ–ÒŽ(gu¨©)³•å‘布为Web Services
摘è¦
问一ä¸?Net的开å‘者,开å‘Web Services有多困难åQŸä»–们会(x¨¬)è¢«ä½ çš„é—®é¢˜é€—ä¹åQŒä»–们会(x¨¬)å‘Šè¯‰ä½ æ‰€æœ‰æ¥éª¤èŠ±è´¹çš„æ—‰™—´ä¸ä¼š(x¨¬)‘…过一分钟。å†é—®ä¸€ä¸‹Javaå¼€å‘者,˜q气好的è¯ä½ ä¼?x¨¬)碰åˆîC¸Šé¢çš„回ç”åQŒä¸€èˆ¬æƒ…况下åQŒä½ ä¼?x¨¬)å¾—åˆîC¸€ä¸ªå®Œå…¨ä¸åŒçš„½{”案。从Web Services引入到Javaä¸è‡³ä»Šå·²¾l?òq´äº†åQŒç„¶è€Œå®ƒä»ç„¶è¢«è®¤ä¸ºæ˜¯ä¸€é—¨è¾ƒæ–°çš„æŠ€æœ¯ï¼Œä¸€ä¸ªä¸»è¦çš„åŽŸå› ž®±æ˜¯ä½¿ç”¨Java实现Web Services太困难了。现在,éšç€æ–îC¸€ä»£Web Services引擎XFireçš„å‘布,˜q™ç§æƒ…况ž®†ä¼š(x¨¬)å‘生明显的å˜åŒ–。ä‹É用XFireåQŒä½ å¯ä»¥æŠŠJava¾cÀL–¹æ³•å‘å¸ƒäØ“(f¨´)Web Services而ä¸éœ€è¦ç¼–写é¢å¤–的代ç 。在˜q™ç¯‡æ–‡ç« ä¸ï¼Œä½ å°†ä¼?x¨¬)看到XFire使Web Serviceså¼€å‘å˜å¾—多么容易和½Ž€å•ã€?br />
Web Services使我们能够在¾|‘络上å¾ç«‹åˆ†å¸ƒå¼¾pÈ»ŸåQŒåº”用程åºç»„ä»¶å¯ä»¥é€šè¿‡ä»ÖM½•òq›_°ã€ä“Q何è¯a€å’Œä“Q何方å¼è®¿é—®ã€‚æ— è®ºåº”ç”¨ç¨‹åºå¦‚何开å‘,使用了什么è¯a€åQŒä»¥å?qi¨¢ng)è¿è¡Œåœ¨ä»€ä¹ˆæ“作系¾lŸåã^åîC¸ŠåQŒåªè¦å®ƒä½œäØ“(f¨´)Web ServiceåQŒåÆˆä¸”äØ“(f¨´)ååŒè§£å†³é—®é¢˜è€Œè®¾è®¡ï¼Œé‚£ä¹ˆä½ 的应用½E‹åºåQŒä»¥ä»ÖM½•è¯è¨€å¼€å‘或在ä“Q何åã^åîC¸ŠåQŒéƒ½å¯ä»¥åˆ©ç”¨å®ƒçš„æœåŠ¡ã€‚è¿™æ˜¯Web Serviceçš„ä¸»è¦æ¦‚å¿üc(di¨£n)€?br />
ä¸ÞZº†å®žçްWeb Servicesçš„åã^å°æ— å…Ïx€§å’Œå®žçŽ°è®‰K—®ç‹¬ç«‹æ€§ï¼Œè½¯äšg行业需è¦éµå¾ªä¸€äº›ä½œä¸ºæ ‡å‡†çš„æŠ€æœ¯ã€‚å…¶ä¸ä¸€äº›åŒ…括:(x¨¬)
---XMLåQšåœ¨Web Services环境ä¸å„å±‚ä¹‹é—´è¿›è¡Œä¼ é€’çš„é»˜è®¤æ•°æ®æ ¼å¼ã€?br />-- -SOAPåQšå°è£…和交æ¢ä¿¡æ¯çš„默认å议。第一‹Æ¡è¢«æå‡ºæ—Óž¼Œå®ƒæ˜¯åªå–Simple Object Access ProtocolåQˆç®€å•对象访问åè®®ï¼‰çš„é¦–å—æ¯ã€‚但是现在SOAP更多被认为是一个特定的åè¯åQŒä»¥å®ƒè‡ªå·Þp€Œå‘½åï¼ŒåŒæ ·å¾ˆå¤šäºø™®¤ä¸ø™¿™æ˜¯ç”¨è¯ä¸å½“:(x¨¬)SOAPå®žé™…ä¸Šä¸æ˜¯ç”¨æ¥è®¿é—®å¯¹è±¡çš„。å¦å¤–,它也ä¸å†½Ž€å•ã€?br />---WSDLåQˆWeb Services Description LanguageåQŒW(xu¨¦)eb Servicesæè¿°è¯è¨€åQ‰ï¼š(x¨¬)æè¿°Web Servicesçš„è¯a€ã€‚å°½½Ž¡åŸºäºŽXMLòq¶ä¸”å¯ä»¥è¢«ähç†è§£åQŒW(xu¨¦)SDLä¸»è¦æ˜¯ç”±æœºå™¨å¤„ç†åQŒç”±å®¢æˆ·ç«¯ç¨‹åºè¯»å–å’Œç†è§£ã€?br />
下é¢çš„高¾U§å±‚‹Æ¡å›¾è¡¨ï¼ŒåŸÞZºŽWWWå会(x¨¬)å‘布的“Web Services Architectureâ€ï¼ˆWeb Servicesæž¶æž„åQ‰æ–‡æ¡£ï¼Œæ˜„¡¤ºäº†è¿™äº›æŠ€æœ¯åœ¨å®žé™…çš„å·¥ä½œçŽ¯å¢ƒä¸æ˜¯å¦‚何呿Œ¥ä½œç”¨ï¼š(x¨¬)

˜q™ä¸ª‹¹ç¨‹å›¾æ˜¾½CÞZº†Web Servicesä¸çš„æ ¸å¿ƒæŠ€æœ¯æ˜¯å¦‚何工作的ã€?br />
˜q™é‡ŒåQŒProvider是æä¾›æœåŠ¡çš„åº”ç”¨½E‹åº¾l„äšgåQŒRequester是ä‹É用æœåŠ¡çš„å®¢æˆ·ç«¯ç¨‹åºã€‚很多其他技术也ä¼?x¨¬)å‚与到交互ä¸ï¼Œä½†æ˜¯˜q™ä¸ªå›‘֪昄¡¤ºäº†åœ¨Web Services环境ä¸å¿…éœ€çš„æ ¸å¿ƒæŠ€æœ¯ç»„ä»¶ã€?br />
XFire 是一个å…费的开æºSOAP框架åQŒå®ƒä¸ä»…å¯ä»¥æžå¤§æ–¹ä¾¿åœ°å®žçŽ°è¿™æ ·ä¸€ä¸ªçŽ¯å¢ƒï¼Œòq¶ä¸”å¯ä»¥æä¾›è®¸å¤šWeb Services规范ä¸é«˜¾U§ç‰¹å¾ï¼Œ˜q™äº›ç‰¹å¾åœ¨å¤šæ•°çš„商业或者开æºå·¥å…·éƒ½æ²¡æœ‰æä¾›ã€‚ä½ è¦æ°å½“çš„ç†è§£˜q™äº›å•è¯åQšgreat ease and simplicityåQˆéžå¸¸è½»æ‘Ö’Œ½Ž€å•ï¼‰ã€‚ä½ ž®†ä¼š(x¨¬)看到使用XFire创å¾Web Services是多么的½Ž€å•ã€?br />
å‡å¦‚ä½ çš„Web应用有一个Java¾c»ï¼Œòq¶ä¸”ä½ æƒ³æŠŠå®ƒçš„ä¸€ä¸ªæ–¹æ³•å‘å¸ƒäØ“(f¨´)Web ServicesåQŒå½“使用XFireæ—Óž¼Œä½ ä¸éœ€è¦ç¼–写一行é¢å¤–çš„Java代ç 。åªéœ€è¦ç¼–辑å‘布æ˜q°ç¬¦åQŒç„¶åŽä½ ž®×ƒ¼š(x¨¬)得到一个Web Services。是的,它相当地½Ž€å•。我们æ¥çœ‹ä¸€ä¸ªä¾‹åã€?br />
一个简å•çš„Java¾c?/span>
æˆ‘ä»¬çš„ä¾‹åæ˜¯ä¸€ä¸ªé“¶è¡Œä¸šåº”用½E‹åºåQŒæœåŠ¡å™¨æ˜¯è¿è¡Œåœ¨J2SE1.4.2_07下的Apache Tomcat5.5.7。å‡å®šä½ å·²ç»äº†è§£å¦‚何使用Java¾~–写Web应用½E‹åºåQŒåƈ知é“应该如何把它部çÖv到Apache TomcatæœåŠ¡å™¨ä¸Šã€‚æˆ‘ä»¬çš„Web应用½E‹åºéžå¸¸½Ž€å•;它åªåšä¸€ä»¶äº‹â€”—将资金从一个è̎戯‚{到å¦å¤–一个è̎户上。一个普通的Java¾c?BankingService包å«äº†ä¸€ä¸ªå«åštransferFunds()的方法æ¥ä¸ºæˆ‘们完æˆè¿™™å¹å·¥ä½œã€‚它需è¦å››ä¸ªè¾“入傿•ŽÍ¼š(x¨¬)
1ã€Â        String fromAccount
2ã€Â        String toAccount
3ã€Â        double amount
4ã€Â        String currency
代ç 如下åQ?br />
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;
    }
   Â
}
åœ¨è¿™é‡Œä½ çœ‹åˆ°äº†ä»€ä¹ˆå¼‚å¸¸çš„ä¸œè¥¿äº†å—åQŸæˆ–è®¸æ²¡æœ‰ï¼Œé™¤äº†é»˜è®¤çš„æž„é€ å‡½æ•ŽÍ¼Œ¾cÕdž‹æ˜¯public。这是必™åÈš„。å¦åˆ™ï¼ŒXFireä¸èƒ½å¤Ÿåˆå§‹åŒ–˜q™ä¸ª¾c…R€?br />
å› äØ“(f¨´)使用接å£çš„设计是一个好的实践,所以我们的Java¾cÖM¹Ÿå®žçŽ°äº†ä¸€ä¸ªç§°ä¸ºIBankingService的接å£ã€‚代ç å分简å•:(x¨¬)
Â
package com.mybank.xfire.example;


public interface IBankingServiceÂ
{Â Â

    public String transferFunds(
        String fromAccount, String toAccount, double amount, String currency);
       Â
}
在实际实çŽîC¸åQŒè¿™æ ·ä¸€ä¸ªæ–¹æ³•å¯èƒ½åŒ…括儿Uç±»åž‹çš„å¤æ‚è°ƒç”¨ã€æŸ¥è¯¢å’Œå¤„ç†æ“作。但是我们的½CÞZ¾‹ä»£ç å·²ç»æœ€ž®åŒ–了,以至于我们å¯ä»¥é›†ä¸ç²¾åŠ›åœ¨ä¸»è¦ç›®æ ‡ä¸Šï¼š(x¨¬)把这个方法å‘å¸ƒäØ“(f¨´)Web Servicesã€?br />
ä½ å¯ä»¥çœ‹åˆ°BankingService是一个普通的Java¾c»ï¼Œæ²¡æœ‰ä»ÖM½•代ç 告诉我们它将ä¼?x¨¬)在Web Servicesä¸ä‹É用。好的,˜q™é‡Œæˆ‘们ä¸éœ€è¦å¢žåŠ ä“Q何东è¥Ñ€‚我们所有的工作都在部çÖvæè¿°½W¦é‡Œå®Œæˆã€?br />
Web应用的部¾|²æ˜q°ç¬¦
在Java ä¸ï¼ŒW(xu¨¦)eb应用½E‹åºé€šå¸¸éœ€è¦è‡³ž®‘一个部¾|²æ˜q°ç¬¦åQˆå«åšweb.xmlåQ‰å¯¹å…¶è¿›è¡Œé…¾|®ã€‚XFire本èín是一个基于servlet的应用程åºã€‚å› æ¤ï¼Œæˆ‘们需è¦å¢žåŠ å¿…è¦çš„引用到æ˜q°ç¬¦æ–‡äšgä¸ã€‚ç„¶åŽæˆ‘们还必须é…ç½®ž®†è¦åˆ›å¾çš„Web Services。我们ä‹É用一个称为services.xml的新文äšgæ¥å®Œæˆè¿™ä»¶äº‹ã€?br />
web.xml
首先åQŒä¿®æ”¹web.xml。我们需è¦å¢žåР䏋é¢çš„XFire servlet相关的æ¡ç›®ï¼š(x¨¬)
   <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æ–‡äšg夹ä¸åQŒå®ƒåœ¨Web应用½E‹åºçš„æ ‡å‡†ç±»è·¯å¾„ä¸ã€‚这里是services.xmlä¸çš„基本é…ç½®æ¡ç›®åQ?br />
<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>
让我们看看这里都包å«äº†ä»€ä¹ˆå†…å®V€‚Web Services的定义包å«åœ¨<service>å…ƒç´ ä¸ï¼Œå®ƒè¿˜å«æœ‰ä¸€äº›åå…ƒç´ ã€‚ç¬¬ä¸€ä¸ªåå…ƒç´ æ˜?lt;name>åQŒå®ƒå¯ä»¥æ˜¯ä½ æä¾›ä»ÖM½•çš„åˆæ³•åå—。这ž®†ä¼š(x¨¬)被客æˆïL(f¨¥ng)«¯½E‹åºå’Œå…¶å®ƒéœ€è¦å®šä½ä½ çš„æœåŠ¡çš„¾l„äšg用到。例如,在æœåС准备好以åŽåQŒä½ ž®†åœ¨‹¹è§ˆå™¨ä¸Šä½¿ç”¨˜q™ä¸ªåå—æ¥æŸ¥çœ‹WSDLã€?br />
下一个åå…ƒç´ æ˜?lt;namespace>。ä“Qä½•åˆæ³•çš„XMLåå—都是å¯ä»¥çš„ã€?lt;namespace>用æ¥å”¯ä¸€æ ‡è¯†ä½ çš„æœåŠ¡çš„å„ä¸ªå‚æ•°ã€?br />< serviceClass>å…ƒç´ åŒ…å«äº†Java¾cÈš„åå—åQŒå®ƒæŒ‡å®šäº†æ–¹æ³•ç¾å。在我们的例åä¸åQŒå®ƒæ˜¯æŽ¥å£IBankingService。如æž?Java¾cÀL²¡æœ‰å®žçŽîC“Q何接å£ï¼Œä½ å°±éœ€è¦æŠŠ¾cÈš„åå—æ”‘Öœ¨˜q™é‡Œã€‚åœ¨ä½ çš„Java¾cÀLˆ–者接å£ä¸å¯èƒ½æœ‰å‡ 个方法。åªéœ€è¦ä¸€ä¸ªå…¥å£æŠŠå®ƒä»¬å…¨éƒ¨å‘布为Web Servicesã€?br />
<implementationClass>ä¿å˜äº†å®žçŽ°æ–¹æ³•çš„Java¾cÕd。这是一个å¯é€‰å…ƒç´ 。如果上一个元ç´?lt;serviceClass>包å«äº†ä¸€ä¸ªæŽ¥å£ï¼Œé‚£ä¹ˆç›¸åº”的实现类必须在这里指定ã€?br />
ž®±æ˜¯˜q™æ ·ã€‚我们的Web Servicesé…置完æˆäº†ã€?br />
XFire和其它类�/span>
现在是最åŽä¸€æ¥äº†åQŒéœ€è¦å¾—åˆ°æ‰€æœ‰å¿…éœ€çš„ç±»åº“ã€‚æˆ‘ä»¬æ€Žæ ·å¾—åˆ°å®ƒä»¬å‘¢ï¼ŸåŽ»XFire¾|‘ç«™åQŒä¸‹è½½xfire-distribution-1.0.zipåQŒç„¶åŽè§£åŽ‹åˆ°ä¸€ä¸ªæœ¬åœ°æ–‡ä»¶å¤¹ã€‚å¤åˆ¶ä¸‹é¢çš„jaræ–‡äšg和它的库文äšg夹到WEB-INF/libä¸ï¼š(x¨¬)
•        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
一切妥当。我们æ¥éƒ¨çÖvå’Œå¯åŠ¨åº”ç”¨ç¨‹åºã€‚䨓(f¨´)了部¾|²ç¤ºä¾‹åº”用,åªéœ€è¦å¤åˆ¶websvc.war到Apache Tomcatçš„webappsæ–‡äšg夹ä¸åQŒå†½{‰å¾…å‡ ç§’é’Ÿã€‚å®ƒ?y¨u)®†ä¼?x¨¬)自动å¯åŠ¨ã€‚è¿™ä¸ªåº”ç”¨çš„å…¨éƒ¨æºä»£ç 也包å«åœ¨è¿™ä¸ªwaræ–‡äšgä¸ã€‚我们的½E‹åºå·²ç»å‡†å¤‡ä½œäØ“(f¨´)一ä¸?Web Service了ã€?br />
我们如何知é“Web Serviceæ£åœ¨å·¥ä½œå‘¢ï¼Ÿ
ä¸ÞZº†äº†è§£Web Serviceæ˜¯å¦æ£åœ¨å·¥ä½œåQŒæˆ‘ä»¬éœ€è¦æµ‹è¯•。首先,我们‹¹‹è¯•æ¥çœ‹WSDL是å¦å¯ç”¨ã€‚我们在‹¹è§ˆå™¨ä¸è¾“å…¥URL。哪个URLåQŸå› 为我们的应用½E‹åºçš„waræ–‡äšg是websvc.waråQŒåƈ且在services.xmlä¸ç»™å‡ºçš„æœåŠ¡åæ˜¯BankingåQŒW(xu¨¦)SDLçš„URL应该是:(x¨¬)http: //localhost:8080/websvc/services/Banking?wsdlã€?br />
è¯äh³¨æ„:(x¨¬)URL的第一部分åQŒä¾‹å¦‚, http://localhost:8080åQŒå¯èƒ½ä¼š(x¨¬)æ ÒŽ(gu¨©)®ä½ 的应用æœåС噍ä¸åŒè€Œä¸åŒã€‚æ— è®ºæ€Žæ ·åQŒå½“ä½ è¾“å…¥URLåŽï¼Œž®†ä¼š(x¨¬)看到一个XML文档åQŒå®ƒçš„æ ¹å…ƒç´ æ˜?<wsdl:definitions>。这个文档å«åšæœåŠ¡çš„WSDLã€‚å¦‚æžœä½ çœ‹åˆ°äº†ï¼Œ˜q™å°±æ˜¯ä½ 的应用作为Web Serviceå·²ç»å¯ç”¨çš„ç¬¬ä¸€ä¸ªè¯æ˜Žã€?br />
但是˜q™ä¸ª‹¹‹è¯•是ä¸å¤Ÿçš„。å¯èƒ½ä¼š(x¨¬)å‘生˜q™ç§æƒ…况åQŒå¯ä»¥çœ‹åˆ°WSDLåQŒä½†æ˜¯ä»Žå®¢æˆ·ç«¯ç¨‹åºå¯èƒ½ä¼š(x¨¬)讉K—®ä¸åˆ°æœåŠ¡ã€‚å› æ¤äØ“(f¨´)äº†æ ¸å®žæœåŠ¡æ˜¯å¦å¯ä»¥è®¿é—®äº†åQŒæˆ‘们必™åÖM‹É用一个客æˆïL(f¨¥ng)«¯˜q›è¡ŒæœåŠ¡çš„å®žé™…è°ƒç”¨æ¥˜q›è¡Œä¸€ä¸ªçœŸæ£çš„‹¹‹è¯•ã€?br />
å¼€å‘一个客æˆïL(f¨¥ng)«¯
ä½ å¯ä»¥ä‹É用ä“Q何的SOAP工具创å¾å®¢æˆ·ç«¯ï¼Œä¾‹å¦‚åQ?Net或者Apache AxisåQŒæœ‰å¾ˆå¤š¿U方法:(x¨¬)使用从WSDL产生的stubsåQŒä‹É用动æ€ä»£ç†ï¼Œ½{‰ç‰ã€‚在例åä¸ï¼Œæˆ‘们使用一个动æ€ä»£ç†ï¼Œä»¥ä¸€ä¸ªç®€å•çš„Servletå½¢å¼åQŒå«å?WsClient.javaã€‚äØ“(f¨´)äº†ä¿æŒä»£ç 两最ž®ï¼Œæ‰€æœ‰åœ¨å±å¹•昄¡¤ºçš„å…ƒç´ éƒ½æ”‘Öœ¨äº†doGet()æ–ÒŽ(gu¨©)³•ä¸ã€‚对Web Service的实际调用由callWebService()æ–ÒŽ(gu¨©)³•完æˆåQŒå®ƒç›¸å½“地简å•。和下é¢çš„ç±»ä¼û|¼š(x¨¬)
Â

   /**//* 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;
    } Â
˜q™ä¸ªä»£ç 是如何工作的呢?我æ¥è§£é‡Šä¸€ä¸‹ï¼š(x¨¬)首先åQŒæˆ‘们创å»ÞZ¸€ä¸ªæœåŠ¡æ¨¡åž‹ï¼Œå®ƒåŒ…å«æœåŠ¡çš„è¯´æ˜Žâ€”â€”æ¢å¥è¯è¯ß_(d¨¢)¼Œž®±æ˜¯æœåŠ¡çš„å…ƒæ•°æ®ã€‚我们ä‹É用XFireçš„ObjectServiceFactory从IBankingService.class接å£åˆ›å¾˜q™ä¸ªæ¨¡åž‹ã€?br />
接ç€åQŒäØ“(f¨´)XFire获得一个代ç†å·¥åŽ‚å¯¹è±¡ï¼Œå®ƒåŒ…å«äº†å¸¸è§„的代ç ,也相当地½Ž€å•和易懂。这一æ¥ä¸æ²¡æœ‰ä»ÖM½•特定应用的东è¥Ñ€‚从˜q™ä¸ªproxyFactoryåQŒä‹É用æœåŠ¡æ¨¡åž‹å’ŒæœåŠ¡ç«¯ç‚¹URLåQˆç”¨æ¥èŽ·å¾—WSDLåQ‰ï¼Œæˆ‘们å¯ä»¥å¾—到一个æœåŠ¡çš„æœ¬åœ°ä»£ç†ã€?br />
ž®±æ˜¯å®ƒäº†ã€‚这个代ç†å°±æ˜¯å®žé™…的客户端。现在,我们å¯ä»¥è°ƒç”¨å®ƒçš„transferFunds()æ–ÒŽ(gu¨©)³•æ¥å¾—到我们需è¦çš„Web Serviceã€?br />一旦示例应用å‘å¸ƒåÆˆå¯åЍåQŒå°±å¯ä»¥ž®è¯•servlet URLåQ?br />http://localhost:8080/websvc/wsã€?br />
˜q™ä¸ªServletä½¿ç”¨é»˜è®¤å‚æ•°æ¥è°ƒç”¨Web Service和显½CºæŽ¥æ”¶åˆ°çš„å“应。页é¢çš„æœ€åŽä¸¤è¡Œåº”该读å–:(x¨¬)
Response Received
COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678
çŽ°åœ¨ä½ å¯ä»¥ç¡®å®šWeb Serviceå·²ç»å‘布òq¶ä¸”在è¿è¡Œä¸äº†ã€?br />
ä¸ÞZº†ž®è¯•ä¸åŒçš„输入å€û|¼Œä½ å¯ä»¥ä‹É用完整的URLåQŒä¾‹å¦‚:(x¨¬)
http://localhost:8080/websvc/ws?from=11-2345&to=77-9876&amt=250.00&cur=EUR�br />
基本的Web Services开呿¥éª¤æ¸…å?/span>
˜q™ä¸ªæ¸…啿€È»“了将一个Javaæ–ÒŽ(gu¨©)³•å‘布为Web Service所必须的æ¥éª¤ï¼š(x¨¬)
1ã€Â        检查Java¾cÈš„æ–ÒŽ(gu¨©)³•å’Œé»˜è®¤æž„é€ å‡½æ•°ç¡®ä¿äØ“(f¨´)public
2ã€Â Â Â Â Â Â Â Â å¢žåŠ XFire servlet相关æ¡ç›®åˆ°web.xmlä¸?br />3ã€Â        创建services.xmlåQŒæŠŠå®ƒæ”¾åˆ°WEB-INF/classes/META-INF/xfire目录ä¸?br />4ã€Â Â Â Â Â Â Â Â å¢žåŠ XFireå’Œç¬¬ä¸‰æ–¹åŒ…åˆ°ä½ çš„Web应用的WEB-INF/libæ–‡äšg夹ä¸
˜q™å°±æ˜¯æ‰€æœ‰éœ€è¦çš„æ¥éª¤åQŒæ˜¯çš„,相当½Ž€å•ã€?br />
XFire的其他高¾U§ç‰¹æ€?/span>
XFireçš„ä‹É用å¯èƒ½æ¯”较简å•,但是在特性和功能性上åQŒå®ƒå´å æ®ç€é¢†å¯¼è€…çš„ä½ç½®ã€‚䏋颿˜¯å®ƒçš„高çñ”ç‰ÒŽ(gu¨©)€§ï¼š(x¨¬)
-- -本地数殾l‘定支æŒPOJOsåQˆplain-old Java objectsåQ‰ã€XMLBeansã€JAXBåQˆJava Architecture for XML BindingåQ‰ã€Castor½{‰ç‰ã€‚æ•°æ®ç»‘定说明了Web Servicesçš„XMLè¯äh±‚å’Œæ˜ ž®„到Java对象的XMLå“应ã€?br />---使用StAXåQˆStreaming API for XMLåQ‰å¤„ç†XML文档。åŒDOMçš„åŸºäºŽæ ‘(w¨¨i)å’ŒSAX的事仉™©±åŠ¨çš„å¤„ç†æ–¹å¼ç›¸æ¯”åQŒStAX使用了拉åQˆpullåQ‰æœºåˆÓž¼Œå®ƒä‹Éå¤„ç†æ›´å¿«é€Ÿï¼Œå†…å˜æ•ˆçŽ‡æ›´é«˜ã€?br />---支æŒå¤šç§ä¼ 输åè®®åQŒå¦‚HTTPã€JMSåQˆJava Message ServiceåQ‰å’ŒJVMå†…éƒ¨ä¼ è¾“ã€?br />---嵌入å¼ï¼Œ˜q™æ˜¯XFireçš„æ ¸å¿ƒåŠŸèƒ½ä¹‹ä¸€ã€‚ä½ å¯ä»¥æŠŠè¿™ä¸ªSOAP引擎嵌入åˆîC½ 的应用ä¸åQŒå®Œå…¨éšè—所有XFire特定引用åQŒåŒæ äh‰€æœ‰é…¾|®éƒ½æ˜¯ç¨‹åºé©±åЍã€?br />---丰富的APIåQŒå®ƒä½¿XFireå¯é«˜åº¦è‡ªå®šä¹‰åQŒå…许开å‘者在ä¸åŒçš„阶ŒD‰|ˆªèޝ‚¯·æ±‚,òq¶ä¸”对他们进行处ç†ã€?br />-- -å…¼å®¹æœ€æ–°çš„æ ‡å‡†ä¾‹å¦‚SOAP1.1åQˆæ²¡æœ‰åŠ å¯†è¿œ½E‹å·¥½E‹è°ƒç”¨ï¼Œæˆ–者RPCåQ‰å’Œ1.2ã€WSDL1.1ã€the Web Services Interoperability Organization’s Basic Profile 1.0ã€Web Services Addressingå’ŒW(xu¨¦)S-Securityã€?br />
最é‡è¦çš„æ˜¯åQŒXFire属于æ–îC¸€ä»£Web Services引擎。ä¸ä»…仅是è¥é”€ç”¨è¯åQŒâ€œæ–°ä¸€ä»£â€æœ‰ä¸€äº›é‡è¦çš„æ„ä¹‰ã€‚Apache Axis是第一代Javaè¯è¨€çš„Web Services引擎åQŒå·²¾læˆä¸ÞZº†æ‰€æœ‰åŽæ¥å·¥å…ïL(f¨¥ng)š„å‚è€ƒæ ‡å‡†ã€‚åœ¨˜q‡åŽ»çš„å‡ òq´é‡ŒåQŒAxis以åŠ(qi¨¢ng)˜q™äº›å…¶å®ƒçš„工具已¾l在很多生äñ”环境ä¸è¿›è¡Œäº†å®žåœ°‹¹‹è¯•。从ä¸å¾—出的一个关键的问题ž®±æ˜¯Web Servicesòq¶ä¸æœ€é€‚åˆRPC¾cÕdž‹çš„通信。对于性能和效率,é¢å‘文档的消æ¯åÅžå¼æ˜¯æœ€å¥½çš„æ–¹å¼ã€‚但是Apache Axis和很多其他的Web Services引擎都被设计æˆäº†é¢å‘RPC的(ž®½ç®¡å®ƒä»¬æ”¯æŒæ–‡æ¡£å½¢å¼åQ‰ã€‚现在,整个行业æ£åœ¨å¼€å‘新一代的SOAP引擎åQŒè®¾è®¡äØ“(f¨´)é¢å‘文档的。Apache å·²ç»å®£å¸ƒ¾l“æŸæ—§ç‰ˆæœ¬çš„Axis引擎开å‘,现在专注于Axis2åQŒçŽ°åœ¨å®ƒçš„é¢„å‘布版本æ˜?.95。XFire在今òq´çš„2月䆾å‘布了它的第一个äñ”å“版本(1.0åQ‰ã€‚它的下一个版本(1.1åQ‰ä»…ä»…åœ¨å‡ ä¸ªæ˜ŸæœŸä¹‹åŽž®Þp¿›è¡Œäº†å‘布ã€?br />
性能
Web Serviceséœ€è¦æ¶ˆè€—很多资æºï¼Œä½†æ˜¯æ€§èƒ½æ–šw¢å®ƒä»¬ä¸æ˜¯é‚£ä¹ˆå¼•äh注目。XFireæ‰“ç ´äº†è¿™¿Uè¶‹åŠÑ€‚它消耗更ž®‘的内å˜åQˆéƒ¨åˆ†å› ä¸?StAXçš„ä‹É用)åQŒä½†æ˜¯è¡¨çް崿¯”å¤šæ•°å¯æ¯”较的SOAPå¼•æ“Žå‡ø™‰²ã€‚ä½ å¯ä»¥åœ¨èµ„æºä¸æä¾›çš„链接ä¸çœ‹åˆ°æ¯”较的结果ã€?br />æ¤å¤–åQŒXFire˜q˜æä¾›äº†å„ç§æ–ÒŽ(gu¨©)³•æ¥è¿›ä¸€æ¥ä¼˜åŒ–性能。一个方法是使用JVMå†…ç½®ä¼ è¾“åQˆin-JVM transportåQ‰ã€‚å¦‚æžœä½ çŸ¥é“Web Services和客æˆïL(f¨¥ng)«¯˜q行在åŒä¸€ä¸ªJVMä¸Šï¼Œä½ å¯ä»¥é€‰æ‹©ä½¿ç”¨æœ¬åœ°ä¼ 输åQŒå®ƒå¯ä»¥å¤§å¹…æå‡æ€§èƒ½ã€‚在½CÞZ¾‹ä¸çš„客户端代ç ,看以下指定æœåŠ¡ç«¯ç‚¹URL的这行:(x¨¬)
String serviceUrl = "http://localhost:8080/websvc/services/Banking";
替æ¢ä¸?br />String serviceUrl = "xfire.local://Banking";
ä½ ä¼š(x¨¬)看到性能上的明显æé«˜åQŒå› 为它¾l•过了整个网¾lœå±‚ã€?br />
局陿€?/span>
XFire有些é‡è¦çš„局陿€§ä½ 应该清楚åQ?br />-- -å¼€å‘Web Services的好的实跉|˜¯ä»ŽWSDL开始。大部分的SOAP引擎æä¾›äº†ä»ŽWSDLç”ŸæˆæœåŠ¡stub的工兗÷€‚XFire也æä¾›äº†˜q™æ ·ä¸€ä¸ªå·¥å…—÷€‚但是它是基于注释(annotations-basedåQ‰çš„åQŒå› æ¤éœ€è¦J2SE5.0。对于ä»åšæŒä½¿ç”¨J2SE1.4.xçš„ähæ¥è¯´åQŒå®ƒä¸æ˜¯ä¸€ä¸ªä×o(h¨´)äººæ‹æ‰‹å«å¥½çš„工具åQŒå› ä¸ºæˆ‘ä»¬æœ‰å¾ˆå¤šå…¶ä»–æ–¹å¼æ¥ç¼–写客æˆïL(f¨¥ng)«¯åQŒä¸€ä¸ªå°±æ˜¯æ–‡ç« 䏿¼”示的方å¼ã€?br />---附äšg支æŒåQŒå®ƒ?y¨u)®†ä¼?x¨¬)包å«åœ¨æœªæ¥å‘行的版本ä¸ã€?br />---易于å¦ä¹ (f¨¤n)的用户å‘对{€‚XFire团队在这个方é¢è¿˜æœ‰å¾ˆå¤šå·¥ä½œéœ€è¦åšã€?br />
¾l“论
Java 当å‰çš„趋势是½Ž€åŒ–æŠ€æœ¯çš„ä½¿ç”¨ã€‚å› æ¤ï¼Œæˆ‘们æ£çœ‹åˆîC¸€æ³¢åŸºäºŽPOJOçš„å¼€å‘æˆž®±ã€‚åŒæ—Óž¼Œé¢å‘æœåŠ¡æž¶æž„åQˆSOAåQŒServices-oriented architectureåQ‰å’ŒW(xu¨¦)eb Serviceså·²ç»å˜æˆäº†å½“å‰è¡Œä¸šçš„çƒç‚¹è¯é¢˜ã€‚XFireæ£æ˜¯åœ¨è¿™¿U情况下产生的。它能够使POJOå‘布为最ž®‘çš„Web ServicesåQŒè€Œåªéœ€è¦ä»˜å‡ºæœ€ž®åŒ–的努力。从而,它ä‹É希望使用˜q™é¡¹æŠ€æœ¯çš„åˆçñ”å¼€å‘者的å¦ä¹ (f¨¤n)曲线å˜å¾—òq³ç¼“ã€‚åŒæ—Óž¼Œç”׃ºŽå®ƒå…¼å®ÒŽ(gu¨©)œ€æ–°æ ‡å‡†å’Œæä¾›äº†ä¸°å¯Œçš„ APIåQŒXFire为高¾U§ç”¨æˆäh供了更多的大好机ä¼?x¨¬)ã€?br />
关于作�/b>
Shahid Ahmed是一个èÊY件架构师åQŒå¦‚今在¾ŸŽå›½ä¸€å®¶ä¸»è¦çš„æ— 线˜q行商作咨询工作。他åœ?2òq´å‰å¼€å§‹å¼€å‘èÊYä»Óž¼Œå½“æ—¶Kayproã€Osborneã€Apple IIå’ŒTRS-80s¾lŸæ²»ç€æ•´ä¸ªåœ°çƒã€‚在˜q‡åŽ»çš?òq´é‡ŒåQŒä»–更多的精力集ä¸äºŽJava。他现在的工作包括SOAã€Web Servicesã€æ¶ˆæ¯ã€POJOã€Springã€Ajax½{‰ç‰ã€‚Shahid是一个èÊYä»¶çƒè¡¯‚€…,æ¯å¤©éƒ½åœ¨å¥‹æ–—以求在技术的˜qäh‹å’Œç¤¾ä¼?x¨¬)生‹zÈš„çƒçˆ±ä¹‹é—´å¯ÀL‰¾òqŒ™¡¡ç‚V€?br />
资æºåQ?/b>
Matrix Java½C‘ÖŒº:http://www.matrix.org.cn
ä¸‹è²æœ¬æ–‡ä¸çš„½CÞZ¾‹åº”用åQ?a target="_new">http://www.javaworld.com/javaworld/jw-05-2006/xfire/jw-0501-xfire.zip
Web Servicesæž¶æž„:http://www.w3.org/TR/ws-arch/
WSDL2.0åQˆåŽŸæ¥æè®®äØ“(f¨´)WSDL1.2åQŒçŽ°åœ¨é‡æ–°å‘½å了åQ‰ï¼š(x¨¬)½W¬ä¸€éƒ¨åˆ†åQšæ ¸å¿ƒè¯a€åQˆW3C Candidate Recommendation 27 March 2006åQ?br />
引自:http://www.matrix.org.cn/resource/article/2006-09-24/XFire_6bd1061c-4bc6-11db-978f-43b3336b7e51.html

]]>