虾屮蛋

导航

 

     java中搭建webservice服务可用好几个框架,如axis1,axis2,xfire,cxf,jax-ws...,利用ide都能较容易的实现。

一、JAX-WS方式

    Java6中自带的JAX-WS2.0能很方便的生产webservice服务端及客户端代码,普通类加上注解,然后写个main方法便可发布,有时候挺方便的。下面代码便可发布一个简单的webservice服务:

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class TestService {
	public static void main(String []args) {
		String publishUrl = "http://localhost:9999/testService";
		try {
		    Endpoint.publish(publishUrl, new TestService()); 
		    System.out.println("start success");
		} catch(Exception e) {}
	}
	
    public String contact(String str1, String str2) {
    	System.out.println("method contact called");
    	return str1 + str2;
    }
    // 上传文件
    public String upload(DataHandler handler, String fileName) { return fileName;  // save handler to file }
}

// JDK1.6 wsimport生成客户端代码后,如下代码便可调用:
    TestService service = new TestServiceService().getTestServicePort();
    System.out.println(service.contact("test1", "test2"));
    System.out.println(service.upload(new byte[] {1,1,1}, "test.txt"));

 启动后可通过访问: http://localhost:9999/testService?wsdl 看到描述信息。JDK6可通过下面命令可以产生客户端代码:

 wsimport -p com.test -keep http://localhost:9999/testService?wsdl

 wsimport为jdk6带的命令,可以先cd 到工程所在src目录,再执行上述命令,代码生成在工程的com.test包下,上面的例子客户端仅生成两个java类: TestService.java  TestServiceService.java。

 如果是JDK6以下或WEB工程,则可通过IDE中的web service client根据工程情况选择框架(xfire, axis2等)来生成客户端代码。JAX-WS用的HTTP1.1协议,axis1生成的客户端,需要修改axis.jar中org.apache.axis.client中的 client-config.wsdd,将deployment name="defaultClientConfig"  指定为deployment name="ApacheCommonsHTTPConfig",并加入commons-httpclient-3.0.jar commons-codec-1.4.jar。

二、AXIS2方式

1 下载axis2包并解压 : http://axis.apache.org/axis2/java/core/download.cgi
2 eclipse(3.6版本)中配置axis2的runtime: Preferences --> Web Service --> Axis2 Perferences下选择
  axis2的目录
3 随便在工程里面建个java项目,写个java类TestService:
4 eclipse里面建立一个server(tomcat)
5 new一个webservice项目WebServiceProject: 在service implementation中选择我们上面建立的类,选择runtime server
  及axis2, 下一步, 然后startServer
6 http://localhost:8080/WebServiceProject/services/TestService?wsdl 可访问wsdl文件
7 可以修改TestService.java文件,重启WebServiceProject,可以看wsdl,发布也已经修改

8 客户端调用:新建一个客户端javaproject, new webservice client project,选择客户端project, service definition可填wsdl地址,或指定
  工程中的wsdl文件,可以看到客户端project加入了一些jar包和类。

也可用wsimport生成客户端代码。

三、AXIS1方式

  类似AXIS2,不需要下载axis2, 新建webservice工程时选择axis。

  AXIS1与AXIS2及JAX-WS对于附件的处理不太一样,生成的wsdl也不太一样。 服务端代码都类似,文件用DataHandler对象,AXIS1中 type="apachesoap:DataHandler", 后者是type="xsd:base64Binary"。 axis1中处理附件需要加入activation.jar 与 mail.jar(wsdl会报错,创建webservice时,client type选startClient,否则好像服务起不来)。

  axis1客户端创建后,调用下面代码可访问:

        TestService service = new TestServiceProxy().getTestService();
        DataHandler handler = new DataHandler(new FileDataSource("testtest.zip"));
        service.upload(handler, "test.zip");

 如果不想生成客户端代码类, 直接调用也可以:

ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(new QName("TestServiceService"));
Call call = service.createCall(new QName("TestService"));
call.setTargetEndpointAddress("http://localhost:8080/WebServiceProject/services/TestService?wsdl");

DataHandler handler = new DataHandler(new FileDataSource("test.aaa"));
QName q1 = new QName("par1", "String");
QName q2 = new QName("par2", "DataHandler");

call.setOperationName(new QName(namespaceURI, "upload"));
call.addParameter("par1", q1, ParameterMode.IN);
call.addParameter("par2", q2, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
Object[] inParams = new Object[] { handler, "test.txt" };
String rtnValue = call.invoke(inParams).toString();

 

 

 

 

 

posted on 2013-04-21 11:14  虾屮蛋  阅读(423)  评论(0)    收藏  举报