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();
浙公网安备 33010602011771号