2009年4月4日星期六

Windows下Eclipse Git版本控制的使用


工作准备:

  1. Eclipse3.4.2

  2. Git on Windows (用于生成public SSH Key等)

下载地址:http://msysgit.googlecode.com/files/Git-1.6.2.1-preview20090322.exe

  1. Eclispe Git Plugin

插件Update Site: http://www.jgit.org/update-site


安装

假设您已安装了Eclipse

安装Git on Windows,http://msysgit.googlecode.com/files/Git-1.6.2.1-preview20090322.exe,

安装Eclipse Git插件:打开Eclipse,Help—Software Updated…--Add Site…--输入http://www.jgit.org/update-site,接下来选择需要安装的版本,本人选择的是版本号最新的一个版本,安装完成重启Eclipse


设置

首先到GitHub(提供免费的Git托管)上注册帐号,并创建一个Repository,假设叫test

我们需要在Repository新建一个项目,至于为什么不能在空白的Repository的时候用Eclipse去新建一个Project,然后用Team-Share这样的方式去上传Project,可能是一个Bug,反正我试过是不行的,可能因为这个Plugin还不是很成熟,开始—所有程序—Git—打开Git GUI(请先在编辑—选项下,输入自己的名字和Email)—创建新的版本库—选择一个新的目录E:/GitRepository,这个时候就在本地新建一个版本库,可以先用Eclipse新建一个TestJava Project,然后去EclipseWorkspace下把TestProjectTest的目录一起Copy到刚才的新建的目录中E:/GitRepository,在Git GUI中,选择“重新扫描”,这时候,在左侧会显示“未缓存的改动”,把这些文件全选,然后选择菜单“提交”-“缓存为提交”,这时,左侧“已缓存的改动”将显示刚才的文件,然后输入注释后单击“提交”按钮。



接下来,我们要把这个TestProject上传到服务器的Repository上去。我们先要生成一个Public SSH Key(以后在Eclipse也会用到)来验证您有权限上传文件。点击菜单“帮助”—“生成Public SSH Key”,然后复制这个KeyCopyGitHubRepositoryAdmin TabDeploy Keys用户可以自己找一下,现在可以上传了,选择菜单“远端”—“上传”,如图:



如果一切顺利,GitHub上应该可以看到您上传的项目了:)


接下来可以不需要Git GUI这个软件了,打开Eclipse,先把Eclipse中刚才那个TestPorject删除,选择菜单“File”-“Import”-“Git”-“Git Repository”-“Next”,如图:



URI填入GitHub上提供的URIProtocol处选择“git+ssh”URI处会自己改变,这个不用管,“Next”,如果是第一次操作,会提示你创建“我的文档”下ssh目录下保存一些信息,这时候把刚才Git GUI生成的Public SSH Key的文件拷贝到“我的文档”的ssh文件夹下(我的Vista的路径是C:\Users\我的用户名\.ssh\Eclispe读取验证文件的路径和Git GUI读取的不一样,所以要做这一步),接下来一路Next,就会把GitHub上的TestProject导入进来了,完了会在Workspace下新建一个和Repository名字一样的目录test,下面都是保存的Git的项目,接下来的操作和之前SVN的操作基本上差不多都是在Team菜单下操作了,Git概念下的CommitCommit到本地的Repository的,如果要上传到服务器,请选择“Push to…”,接下来的画面如图选择:



那以后要新建项目到Git Repository怎么办?

先把新项目的结构文件拷贝到test目录下,然后Eclipse下“Import”,“General”,“Existing Projects In Workspace”,导入后,右键项目—“Team”—“Share Project..”—接下来选择Git,下一步选择“Search for existing git repositories”就可以了。我试过,直接在Eclipse中新建Project,然后点Team-Share Project..是不行的。


步骤是有点繁琐,或许这个插件还不成熟,我摸索下来是这样子,供读者分享,如果各位有更好的方法,请留言指正,谢谢!




2009年3月19日星期四

用Axis2 接受和发送二进制对象的总结

接收:(Server端返回的是一个ObjectPack ObjectPack.name是文件的名称,ObjectPack.bin是byte[]类型的binary)
经过我的测试,类似下面发送的方法用RPCServiceClient.invokeBlocking()得到byte[],然后转化成文件这样不行,只好用以下的方式:
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/services/Pic");
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
"http://pic.webservice.com", "get");
OMElement data = fac.createOMElement("get", omNs);
OMElement name= fac.createOMElement("name", omNs);
email.setText("avatar.png");
data.addChild(email);

ServiceClient sender = new ServiceClient();
Options options =sender.getOptions();
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTo(targetEPR);
// enabling MTOM in the client side
options.setProperty(Constants.Configuration.ENABLE_MTOM,
Constants.VALUE_TRUE);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
System.out.println(data);
OMElement ome = sender.sendReceive(data);
Iterator ite = ome.getFirstElement().getChildElements();
String fileName = "avatar.png";
int counter = 0;
while (ite.hasNext()) {
OMElement e = ite.next();
if (counter++ == 0) {
fileName = e.getText();
System.out.println(fileName);
} else {
OMText binaryNode = (OMText) e.getFirstOMChild();
binaryNode.setOptimize(true);// 必须加此句,否则会出现ContentID is null的异常!
DataHandler actualDH = (DataHandler) binaryNode
.getDataHandler();
FileOutputStream fos = new FileOutputStream(new File("E:\\"
+ fileName));
InputStream is = actualDH.getInputStream();
byte[] b = new byte[1024];
while (true) {
int i = is.read(b);
if (i == -1)
break;
fos.write(b, 0, i);
}
fos.flush();
fos.close();
is.close();
}
}
发送:(Server端接收的是参数是name:文件名称, byte[] b)
经过我的测试,用上面的ServerClient的方式,用DataHandler 会报错,只好用RPCServiceClient
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/Pic");
options.setTo(targetEPR);
File file = new File("E:\\avatar.png");
FileInputStream fin = new FileInputStream(file);
byte[] b = new byte[(int) file.length()];
fin.read(b, 0, b.length);
fin.close();
Object[] opAddEntryArgs = new Object[] { "name", b };
Class[] classes = new Class[] { Boolean.class };
QName opAddEntry = new QName(
"http://pic.webservice.com",
"changeMessengerDisplayPic");
Boolean result = (Boolean) serviceClient.invokeBlocking(opAddEntry,
opAddEntryArgs, classes)[0];
System.out.println("result:" + result);

2009年2月6日星期五

使用Axis2的底层API开发Web Service

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/25592


本文是在理解官方指南的基础上,用实例实现Axis2提供的4种调用机制,并给出测试结果。
author: ZJ 07-3-13
Blog:
http://zhangjunhd.blog.51cto.com/

 

1.使用Axis2的底层API开发Web Service Server端
1.1创建一个WebService(取名为MyService)
    在MyService中有两个operations,如下所示。


public void ping(OMElement element){}//IN-ONLY模式。仅仅接收OMElement,并对其处理。
public OMElement echo(OMElement element){}//IN_OUT模式。接收OMElemen,并返回OMElement。

 

1.2如何写Web Service
1)创建实现服务的类。

2)创建services.xml来解析这个Web Service。

3)将其打包成一个*.aar文档(Axis Archive)。

4)部署Web Service。

 

1.2.1 创建实现服务的类
    此类中提供的方法必须与Web Service(在services.xml中声明)中的operations对应。除非你提供了数据绑定,否则所有的方法只能接收一个参数,其类型为OMElement。


public class MyService{
  public void ping(OMElement element){...}
  public OMElement echo(OMElement element){...}
}

MyService.java


package userguide.example1;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import javax.xml.stream.XMLStreamException;

public class MyService {
    public OMElement echo(OMElement element) throws XMLStreamException {
        //Praparing the OMElement so that it can be attached to another OM Tree.
        //First the OMElement should be completely build in case it is not fully built and still
        //some of the xml is in the stream.
        element.build();
        //Secondly the OMElement should be detached from the current OMTree so that it can
        // be attached some other OM Tree. Once detached the OmTree will remove its
       // connections to this OMElement.
        element.detach();
        return element;
    }
    public void ping(OMElement element) throws XMLStreamException {
        //Do some processing
    }
    public void pingF(OMElement element) throws AxisFault{
        throw new AxisFault("Fault being thrown");
    }
}

 

1.2.2 创建services.xml
    Axis2使用services.xml来充当一个Web Servicea的配置文件。每一个使用Axis2部署的Web Service都必须拥有一个services.xml。


<services>
  <description>
    This is a sample Web Service with two operations,echo and ping.
  </description>
  <parameter name=”ServiceClass” locked=”false”>
  userguide.example1.MyService
  </parameter>
  <operation name=”echo”>
    <messageReceiver class=”org.apache.axis2.receivers.RawXMLINOutMessageReceiver”/>
    <actionMapping>urn:echo</actionMapping>
  </operation>
  <operation name=”ping”>
    <messageReceiver class=”org.apache.receivers.RawXMLINOnlyMessageReceiver”/>
    <actionMapping>urn:ping</actionMapping>
  </operation>
</service>

注:The actionMapping is required only if you want to enable WS-Addressing.
    可以创建一个services.xml,其中包含一组服务。这样在运行期,你可以在这些服务间共享信息。


<serviceGroup>
  <service name=”Service1”>
    <!--details for Services1-->
  </service>
<service name=”Service2”>
    <!--details for Services2-->
  </service>
  <module ref=”ModuleName”/>
  <parameter name=”serviceGroupParam1” locked=”false”>value1</parameter>
</serviceGroup>

注:name of the service is a compulsory attribute.

 

1.2.3打包与部署
    这里不再详述,参见《
基于Tomcat5.0和Axis2开发Web Service应用实例 》。

 

2.使用Axis2底层APIs实现Web Service客户端
2.1ClientUtil
    创建一个客户端通用的SOAP包装Util文件。封装"getEchoOMElement"和"getPingOMElement"分别对应"echo"和"ping"这两个operation。

ClientUtil.java


package userguide.clients;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class ClientUtil {
    public static OMElement getEchoOMElement() {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace(
                "
http://example1.org/example1", "example1");
        OMElement method = fac.createOMElement("echo", omNs);
        OMElement value = fac.createOMElement("Text", omNs);
        value.addChild(fac.createOMText(value, "Axis2 Echo String "));
        method.addChild(value);
        return method;
    }
    public static OMElement getPingOMElement() {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace(
                "
http://example1.org/example1", "example1");
        OMElement method = fac.createOMElement("ping", omNs);
        OMElement value = fac.createOMElement("Text", omNs);
        value.addChild(fac.createOMText(value, "Axis2 Ping String "));
        method.addChild(value);
        return method;
    }
}

 

2.2EchoBlockingClient
    Axis2向用户提供了从blocking
single channel调用到non-blocking dual channel调用的多种调用Web
Service的模式。下面用最简单的blocking调用机制来实现”MyService”中的"echo" operation。

EchoBlockingClient.java


package userguide.clients;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

/**
 * Sample for synchronous single channel blocking service invocation.
 * Message Exchage Pattern IN-OUT
 */
public class EchoBlockingClient {
private static EndpointReference targetEPR =
 new EndpointReference("
http://localhost:8080/axis2/services/MyService");
    public static void main(String[] args) {
try {
            OMElement payload = ClientUtil.getEchoOMElement();
        
    Options options = new Options();
            options.setTo(targetEPR); // this sets the location of MyService service
            ServiceClient serviceClient = new ServiceClient();
            serviceClient.setOptions(options);
            OMElement result =
serviceClient.sendReceive(payload);
            System.out.println(result);
} catch (AxisFault axisFault) {
         axisFault.printStackTrace();
}
}

    绿色部分显示了为了调用一个Web Service而需要对operation作的设置。剩下的部分是用来创建OMElement,用来发送和显示相应的OMElement。

 

结果:


<example1:echo xmlns:example1="http://example1.org/example1"
xmlns:tns="
http://ws.apache.org/axis2">
<example1:Text>
Axis2 Echo String
</example1:Text>
</example1:echo>

 

2.3 PingClient
    在”MyService”中,我们有一种IN-ONLY模式的名为"ping"的operation。应用它的客户端代码如下:
PingClient.java


package userguide.clients;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

/**
 * Sample for fire-and-forget service invocation
 * Message Exchage Pattern IN-Only
 */
public class PingClient {
private static EndpointReference targetEPR =
 new EndpointReference("
http://localhost:8080/axis2/services/MyService");
    public static void main(String[] args) {
try {
       OMElement payload = ClientUtil.getPingOMElement();
       Options options = new Options();
       options.setTo(targetEPR);
       ServiceClient serviceClient = new ServiceClient();
       serviceClient.setOptions(options);
      
serviceClient.fireAndForget(payload);
        /**
         * We have to block this thread untill we send the request , the problem
         * is if we go out of the main thread , then request wont send ,so
         * you have to wait some time :)
         */
       Thread.sleep(500);
     }
catch (AxisFault axisFault) {
            axisFault.printStackTrace();
     }
}

    由于我们在访问一个IN-ONLY模式的operation,所以我们可以直接使用ServiceClient中的"fireAndForget()"方法来调用这个operation。而且那样做的话,不会阻塞发起端,因此,它会立刻将控制权返回给客户端。

 

2.4 EchoNonBlockingClient
   
在客户端EchoBlockingClient,一旦调用"serviceClient.sendReceive(payload);",客户端将会被阻
塞直到operation完成。这种方式在有很多Web
Service需要在一个单一的客户端应用程序中启动时很不可取。一种解决方法是使用Non-Blocking API来调用这些Web
Services。Axis2提供给用户一种基于回叫机制的non-blocking API。
EchoNonBlockingClient.java


package userguide.clients;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.Callback;

/**
 * Sample for asynchronous single channel non-blocking service invocation.
 * Message Exchage Pattern IN-OUT
 */
public class EchoNonBlockingClient {
private static EndpointReference targetEPR =
 new EndpointReference("
http://127.0.0.1:8080/axis2/services/MyService");
private static boolean finish = false;
    public static void main(String[] args) throws Exception {
        ServiceClient sender =
new ServiceClient();
        Options options = new Options();
        try {
            OMElement payload = ClientUtil.getEchoOMElement();
            options.setTo(targetEPR);


            AxisCallback callback = new AxisCallback() {
            public void onFault(MessageContext content) {
                System.out.println("Exception");
            }

            public void onMessage(MessageContext content) {
                System.out.println("Message");
                System.out.println(content.getEnvelope().getBody().getFirstElement().getText());
                //or:
                //OMElement result = context.getEnvelope().getBody()
                //            .getFirstElement();
                //    Iterator<OMElement> it = result.getChildren();
                //    while (it.hasNext()) {
                //        System.out.println(it.next().getText());
                //    }
               
finish = true;
            }


            public void onComplete() {
                System.out.println("OK");
            }

            public void onError(Exception exception) {
                System.out.println("Exception");
            }
        };

        client.setOptions(options);
        client.sendReceiveNonBlocking(payload, callback);
       
        synchronized (callback) {
                if (!finish) {
                    callback.wait(10000);
                    if (!finish) {
                        throw new AxisFault(
                                "Server was shutdown as the async response take too long to complete");
                    }
                }
            }
        // or://Thread.sleep(2000);


        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sender != null) {
                sender.disengageModule("addressing");
                sender.cleanup();
                sender.finalizeInvoke();
            }
                     
        }
    }
}

 

结果:


<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<example1:echo xmlns:example1="
http://example1.org/example1"
xmlns:tns="
http://ws.apache.org/axis2">
<example1:Text>
Axis2 Echo String
</example1:Text>
</example1:echo>
</soapenv:Body>
</soapenv:Envelope>

    sender.sendReceiveNonBlocking(payload, callback);这个调用接受一个callback对象作为参数。
 

2.5EchoNonBlockingDualClient
    当调用的Web
Service需要很长一段时间来完成时,这种由Non-Blocking
API提供的解决方式将有一定的局限性。这种局限性是由使用单一的传输连接来调用Web
Service并接收response造成的。换句话说,客户端提供一种没有阻塞的调用机制,但request和response的传输使用单一的传输
(双工方式)连接(如HTTP)。长时间运行的Web Service调用或Web
Service调用使用单工传输方式(如SMTP)不能简单地利用一个没有阻塞的调用。
   
一种尝试地解决方法是request和response各自使用单独的传输连接(单工或双工均可)。这种方式产生的问题是如何解决相关性(关联
request和response)。WS-Addressing提供了一种很好的解决方法,在头中使用<wsa:MessageID>
和 <wsa:RelatesTo> 标签。Axis2对这种基于关联机制的寻址方式提供了支持。
   
用户可以选择Blocking 或Non-Blocking APIs的Web
Service,并使用两个传输连接。通过使用一个布尔标记,同一个API可以调用多个在两个传输连接上的Web Services(IN-OUT
operations)。下例使用Non-Blocking API 以及两个传输连接来实现上文中提到的"echo" operation。
EchoNonBlockingDualClient.java


package userguide.clients;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.Callback;
import javax.xml.namespace.QName;

/**
 * Sample for asynchronous dual channel non-blocking service invocation.
 * Message Exchage Pattern IN-OUT
 * Ulitmate asynchronous service invocation sample.
 */
public class EchoNonBlockingDualClient {
private static EndpointReference targetEPR =
 new EndpointReference("
http://127.0.0.1:8080/axis2/services/MyService");
    public static void main(String[] args) {
        ServiceClient sender = null;
        try {
            OMElement payload = ClientUtil.getEchoOMElement();
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
         
   options.setUseSeparateListener(true);
            options.setAction("urn:echo");  // this is the action mapping we put within the service.xml
            //Callback to handle the response
            Callback callback = new Callback() {
                public void onComplete(AsyncResult result) {
                    System.out.println(result.getResponseEnvelope());
                }
                public void onError(Exception e) {
                    e.printStackTrace();
                }
            };
            //Non-Blocking Invocation
           ConfigurationContext sysContext = ConfigurationContextFactory
            .createConfigurationContextFromFileSystem(
             "D:\\Dvp\\Axis2\\axis2\\WEB-INF", null);//见注解①
            sender = new ServiceClient(sysContext, null);
            sender.engageModule(new QName(Constants.MODULE_ADDRESSING));
            sender.setOptions(options);
            sender.sendReceiveNonBlocking(payload, callback);
            //Wait till the callback receives the response.
            while (!callback.isComplete()) {
                Thread.sleep(1000);
            }
            //Need to close the Client Side Listener.
        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
              
  sender.finalizeInvoke();
            } catch (AxisFault axisFault) {
                //have to ignore this
            }
        }
    }
}

注解①
RE: [Axis2] 0.95 WS-Addressing web SERVICE-SIDE: module not found
   
I now have managed to get EchoNonBlockingDualClient working. I still
can't get the original code to work, where ever I put
addressing-0.95.mar, but the ConfigurationContext works.
    The code I ended up with was:


 ConfigurationContext sysContext = ConfigurationContextFactory
           .createConfigurationContextFromFileSystem(
            "C:\\axis2", null);
  sender = new ServiceClient(sysContext, null);

    with no need, obviously, for the .engageModule method.
   
I did discover though that the directory which the ConfigurationContext
points to has to have two directories within it: "conf", which must
contain the axis.xml configuration file, and the "modules" directory
which contains addressing-0.95.mar.

   
在方法"options.setUseSeparateListener(...)"中的布尔标记通知通知Axis2引擎使用两个不同的传输连接来分别处
理request和response。Finally中的
"serviceClient.finalizeInvoke()"方法通知Axis2引擎停用客户端的用于接收response的listener。
    在我们运行客户端的例程之前,我们还有一件事情要做。如前面提到的,Axis2使用基于地址的关联机制,因此我们必须在服务器端和客户端“搭建”寻址模块。


结果:


<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsa:To>http://59.14.131.187:6060/axis2/services/__ANONYMOUS_SERVICE__/__OPERATION_OUT_IN__
</wsa:To>
<wsa:ReplyTo>
<wsa:Address>
http://www.w3.org/2005/08/addressing/anonymous
</wsa:Address>
</wsa:ReplyTo>
<wsa:From>
<wsa:Address>
http://127.0.0.1:8080/axis2/services/MyService
</wsa:Address>
</wsa:From>
<wsa:FaultTo>
<wsa:Address>
http://127.0.0.1:8080/axis2/services/MyService
</wsa:Address>
</wsa:FaultTo>
<wsa:MessageID>
urn:uuid:B087CBB98F1B51A24711742241136206
</wsa:MessageID>
<wsa:Action>urn:echo</wsa:Action>
<wsa:RelatesTo wsa:RelationshipType="wsa:Reply">
urn:uuid:CA4B9513377E6E9E1511742241130391
</wsa:RelatesTo>
</soapenv:Header>
<soapenv:Body>
<example1:echo xmlns:example1="
http://example1.org/example1" xmlns:tns="http://ws.apache.org/axis2">
<example1:Text>
Axis2 Echo String
</example1:Text>
</example1:echo>
</soapenv:Body>
</soapenv:Envelope>

[SimpleHTTPServer] Stop called

 

2.6 实现服务器端的寻址
   
根据Axis2的结构,寻址模块在"pre-dispatch"阶段已经给出它的句柄。因此,所谓的“搭建”仅仅是在”axis2.xml”(注意不是
services.xml)增加一个模块的引用。现在将下面这行字加入到axis2.xml,该文件在"/webapps/axis2/WEB-
INF/conf"目录下。


<module ref="addressing"/>

注: 一旦你改变了axis2.xml,你必须重启这个servlet容器,改变才能生效。

 

2.7 实现客户端的寻址
    有两种方式。
   
一种方法是在%Axis2_HOME%\axis2-std-1.0-bin\modules目录下得到addressing-<
version>.mar。并且在你的classpath中对其可见。(此种方法目前,我还没有调试成功,具体见注解①。下面的第二种方法可用)
    另一种方法是创建一个ConfigurationContext,指定一个repository位置。Axis2支持repository的方式来保存服务和模块。
   
你可以使用二进制distribution作为repository,只要它含有一个Axis2
repository认可的repository结构(其中应包含services和modules目录)。ConfigurationContext
中含有Axis2体系的运行时的上下文信息。
   
如果你解压一个标准的二进制distribution到目录(譬如)$user_home/axis2/dist, 那么在 sender = new
ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):


new ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):
ConfigurationContext configContext =
ConfigurationContextFactory.createConfigurationContextFromFileSystem(< Axis2RepositoryLocation >, null);

    用"sender = new ServiceClient(configContext, null);" 替换 "sender = new ServiceClient();"
这样可以在客户端和服务器端都实现寻址。

 

2.8 EchoBlockingDualClient
   
这又是一个两路的传输的request/response客户端,但这次,我们使用一个Blocking
API。实现机制和EchoNonBlockingDualClient差不多,唯一的不同是,这里不需要使用一个callback对象来处理
response。
EchoBlockingDualClient.java


package userguide.clients;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLOutputFactory;
import java.io.StringWriter;

/**
 * Sample for synchronous dual channel blocking service invocation.
 * Message Exchage Pattern IN-OUT
 */
public class EchoBlockingDualClient {
private static EndpointReference targetEPR =
 new EndpointReference("
http://127.0.0.1:8080/axis2/services/MyService");
    public static void main(String[] args) {
        ServiceClient sender = null;
        try {
            OMElement payload = ClientUtil.getEchoOMElement();
            Options options = new Options();
            options.setTo(targetEPR);
            options.setAction("urn:echo");
            //The boolean flag informs the axis2 engine to use two separate transport connection
            //to retrieve the response.
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
            options.setUseSeparateListener(true);
            //Blocking Invocation
            ConfigurationContext sysContext = ConfigurationContextFactory
            .createConfigurationContextFromFileSystem(
             "D:\\Dvp\\Axis2\\axis2\\WEB-INF", null);
            sender = new ServiceClient(sysContext, null);
            sender.engageModule(new QName(Constants.MODULE_ADDRESSING));
            sender.setOptions(options);
            OMElement result = sender.sendReceive(payload);
            StringWriter writer = new StringWriter();
           result.serialize(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));
            writer.flush();
            System.out.println(writer.toString());
            //Need to close the Client Side Listener.
        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
            try {
                sender.finalizeInvoke();
            } catch (AxisFault axisFault) {
                //
            }
        }
    }
}
结果:
<example1:echo xmlns:example1="
http://example1.org/example1" xmlns:tns="http://ws.apache.org/axis2">
<example1:Text>Axis2 Echo String </example1:Text>
</example1:echo>
[SimpleHTTPServer] Stop called

2008年12月14日星期日

Java中过滤掉HTML中所有的Tag

str.replaceAll("\\<.*?>", "");

Javascript的getBytes方法得到字符长度

String.prototype.getBytes = function() {    
    var cArr = this.match(/[^\x00-\xff]/ig);    
    return this.length + (cArr == null ? 0 : cArr.length);    
}

用法:"你好".getBytes();