最近使用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便可固定格式便可發佈成功