最近使用webservice进行远程调用一直很火,自从JDK1.6版本发布后,发布一个webservice项目变得更加简单了java
笔者因为工做的须要针对JDK和axis2如何发布webservice作过相关了解,现整理出来供你们参阅,因为水平所限不免有不足之处,请你们指正!web
JDK发布webservice的方法apache
要求环境,jdk1.6以上api
服务端代码:tomcat
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;服务器
@WebService(name="pre",targetNamespace="http://www.pre.com")
@SOAPBinding(style = Style.RPC)
public class PreService {
@WebMethod
public void say(){
System.out.println("------hello world--------");
}
}app
注释:
name只是肯定一个名字,能够本身随便取名,targetNamespace是你的命名空间,也就是调用你这个服务端时要绑定的域名
SOAP格式,style肯定使用哪一种方式进行交互,RPC是远程调用函数
下面生成客户端:
cmd命令行下面写下面的代码
wsimport -keep -p com.demo.client http://localhost:8080/Test/services/preService?wsdl
命令参数说明:
-d:生成客户端执行类的class文件的存放目录
-s:
-p:定义生成类的包名url
而后把生成的类放入客户端,这样就能够实例化一个服务端类的对象
public class Client {
private static URL CRC_WSDL_LOCATION;
private static QName qName;
private static Service service;
private static Pre simp;
static {
URL url = null;
try {
url = new URL("http://localhost:8080/Test/services/preService?wsdl");
CRC_WSDL_LOCATION = url;
qName = new QName("http://www.pre.com", "PreServiceService");
service = Service.create(CRC_WSDL_LOCATION, qName);
simp = service.getPort(Pre.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}spa
URL:就是你服务端发布的端口
QName里面的两个参数:第一个---服务器类的命名空间,第二个---使用wsimport命令生成的客户端类PreServiceService
wsimport命令会生成两个客户端类,Pre.java和PreServiceService.java,其中Pre.java是接口
接下来配置文件,有两种方式把服务器端启动起来
第一种:使用main函数发布,不须要tomcat
简单的新建一个类,使用了一个main主函数写一个方法
Endpoint.publish("http://127.0.0.1:8888/preService" , new Pre());
第二种:使用tomcat发布
web.xml里面添加以下代码
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>PreService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PreService</servlet-name>
<url-pattern>/preService</url-pattern>
</servlet-mapping>
这样须要导入三个jar包,以下:
webservices-extra-api.jar
webservices-extra.jar
webservices-rt.jar
这三个jar包百度搜索就能够下载下来,笔者这里就不连接下载地址了
在WEB-INF下面新建一个sun-jaxws.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
<endpoint
name='PreService'
implementation='com.amarsoft.pre.PreService'
url-pattern='/preService'/>
</endpoints>
第四个属性:binding="http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/"
endpoint里面只需三个属性,网上有4个属性的会在生成客户端的时候报SOAP的Binding不是一个标准的
这样有一个缺点就是不能修改发布端口,靠tomcat发布只能使用tamcat的端口
================================================================================================
使用axis2发布webservice,同样比较简单
第一步导入axis2的jar包
服务器端:
package org.test.service;
public class HelloWorld {
public String sayHello(String name){
return "Hello,my name is:"+name;
}
}
在src目录下面新建一个META-INF文件夹,在META-INF文件夹下面新建一个services.xml文件,注意这里不是service.xml
<service name="HelloWorldService" >
<description>
Please Type your service description here
</description>
<messageReceivers>
<!-- 无返回值 -->
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<!-- 有返回值 -->
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">org.test.service.HelloWorld</parameter>
</service>
客户端:
package testClient;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Client {
public static void main(String[] args) throws AxisFault {
// 使用RPC方式调用
RPCServiceClient sc = new RPCServiceClient();
Options option = sc.getOptions();
// url
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8888/axis2/services/HelloWorldService");
option.setTo(targetEPR);
//指定参数
String[] reqArgs = new String[] {"monk"};
//指定返回类型
Class[] clazz = new Class[]{String.class};
QName qname = new QName("http://service.test.org","sayHello");
System.out.println(sc.invokeBlocking(qname,reqArgs, clazz)[0]);
}
}
web.xml直接复制axis2里面的web.xml便可固定格式便可发布成功