java開發webservice幾種方式小結
1.利用jdk web服務api實現,這裡使用基於 SOAP message 的 Web 服務
第一步.新建一個web專案,編寫一個POJO.
package com.handkoo.webservice.service01;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class Hello {
@WebMethod
public String sayHello(String name){
return "hello,"+name+"!";
}
public static void main(String[] args){
Hello hello = new Hello();
Endpoint endpoint = Endpoint.publish("http://192.168.3.187:4222/hello",hello);
}
}
編寫完成後,執行該類.第二步,在瀏覽器中檢視服務是否釋出成功,在瀏覽器中輸入:http://192.168.3.187:4222/hello?wsdl
第三步,利用wsimport命令生成客戶端程式碼:wsimport -keep http://192.168.3.187:4222/hello?wsdl
第四步:測試呼叫webservice
/**
* 使用java自帶的方式呼叫webservice
*/
@Test
public void testDemo01(){
HelloService helloService = new HelloService();
Hello hello = helloService.getHelloPort();
System.out.println(hello.sayHello("小鵬要逆襲"));
}
2.利用xfire框架開發webservice
第一步,準備開發環境,下載所有的xfire包,新建一個web專案,將jar包複製到WEB-INF的lib資料夾下,同時配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>WebServiceClient</display-name>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
第二步,開始編寫POJO類對外提供介面
package com.handkoo.webservice.service02;
public interface HelloService {
String helloExample(String name);
}
第三步,編寫介面的實現類
package com.handkoo.webservice.service02;
public class HelloServiceImpl implements HelloService {
@Override
public String helloExample(String name) {
return "來自java的問候:你好"+name;
}
}
第四步,在src檔案加下新建META-INF資料夾xfire,新建service.xml檔案
service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWebService</name>
<serviceClass>com.handkoo.webservice.service02.HelloService
</serviceClass>
<implementationClass>com.handkoo.webservice.service02.HelloServiceImpl
</implementationClass>
</service>
</beans>
第五步,啟動tomcat,在瀏覽器中輸入地址http://lcoalhost:8888/WebServiceDemo/services/HelloWebService?wsdl,看到如下頁面說明已經發布webservice成功。
第六步,下面開始編寫客戶端進行測試,使用xfire呼叫webservice,需要引用的jar包有:
第七步,編寫測試程式碼呼叫之前釋出的webservice:
這裡呼叫有兩種方式:
方式1:
/**
* xfire的方式呼叫-方式一
*/
@Test
public void testDemo02(){
try {
Client client = new Client(new URL("http://localhost:8888/WebServiceDemo/services/HelloWebService?wsdl"));
Object[] result = client.invoke("helloExample", new Object[]{"小鵬要逆襲"});
System.out.println(result[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
方式2:
需要把webservice剛剛開發的介面拷貝過來(HelloService):
@Test
public void testDemo03() throws MalformedURLException{
String serviceURL = "http://localhost:8888/WebServiceDemo/services/HelloWebService?wsdl";
Service serviceModel = new ObjectServiceFactory()
.create(com.handkoo.webservice.service02.HelloService.class,null,serviceURL,null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
com.handkoo.webservice.service02.HelloService helloService =
(com.handkoo.webservice.service02.HelloService) serviceFactory.create(serviceModel,"http://localhost:8888/WebServiceDemo/services/HelloWebService");
System.out.println(helloService.helloExample("xzit"));
}
執行結果:
3.使用Axis2開發webservice簡單例項
第一步,下載axis2的war包,放到tomcat中,在瀏覽器中訪問:
第二步,新建一個web專案,把tomcat裡面的axis工程裡面的WEB-INF下的conf modules 和services拷貝到新建的工程的WEB-INF裡面:
同時把lib檔案裡面的jar也一併拷貝過去
第二步,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Axis2Demo</display-name>
<servlet>
<servlet-name>AxisServletservlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServletservlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
第三步,編寫服務類:
package com.handkoo.service;
public class HelloWorld {
public String getHello(String name){
return "hello"+name+".";
}
public String getWorld(String name){
return "world,"+name+".";
}
public String getHelloWorld(){
return "hello world";
}
}
第四步,在WEB-INF/services 的檔案加下新建HelloWorld/META-INF/資料夾,並新建service.xml配置檔案:
services.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="HelloWorld">
<description>hello world webservice</description>
<parameter name="ServiceClass">
com.handkoo.service.HelloWorld
</parameter>
<operation name="getHello">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"></messageReceiver>
</operation>
<operation name="getWorld">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"></messageReceiver>
</operation>
<operation name="getHelloWorld">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"></messageReceiver>
</operation>
</service>
</serviceGroup>
第五步,啟動tomcat服務,在瀏覽器中檢視是否釋出成功:
第六步,編寫測試類:
package com.handkoo.test;
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;
import org.junit.Test;
public class TestWebService {
@Test
public void testAxis(){
try {
// 使用RPC方式呼叫webservice
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定呼叫webservice的url
EndpointReference targetEPR = new EndpointReference("http://localhost:8888/Axis2Demo/services/HelloWorld");
options.setTo(targetEPR);
/*** 下面是設定呼叫webservice的名稱空間和方法名(opAddEntry),以及設定方法的返回型別(opAddEntryArgs) ***/
// 在建立QName物件時,QName類的構造方法的第一個參數列示WSDL檔案的名稱空間名,也就是<wsdl:definitions>元素的targetNamespace屬性值
// 指定要呼叫的getWorld方法及WSDL檔案的名稱空間.....
QName opAddEntry = new QName("http://service.handkoo.com","getWorld");
// 指定getGreeting方法的引數值,如果有多個,繼續往後面增加即可,不用指定引數的名稱
Object[] opAddEntryArgs = new Object[]{"xiaopeng"};
// 返回引數型別,這個和axis1有點區別
// invokeBlocking方法有三個引數,其中第一個引數的型別是QName物件,表示要呼叫的方法名;
// 第二個參數列示要呼叫的WebService方法的引數值,引數型別為Object[];
// 第三個參數列示WebService方法的返回值型別的Class物件,引數型別為Class[]。
// 當方法沒有引數時,invokeBlocking方法的第二個引數值不能是null,而要使用new Object[]{}
// 如果被呼叫的WebService方法沒有返回值,應使用RPCServiceClient類的invokeRobust方法,
// 該方法只有兩個引數,它們的含義與invokeBlocking方法的前兩個引數的含義相同
// 指定getGreeting方法返回值的資料型別的Class物件.....
Class[] classes = new Class[]{String.class};
String result = (String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0];
System.out.println("getWorld:"+result);
opAddEntry = new QName("http://service.handkoo.com", "getHello");
opAddEntryArgs = new Object[]{"小鵬要逆襲"};
System.out.println("getHelloWorld:"+serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs,classes)[0]);
opAddEntry = new QName("http://service.handkoo.com", "getHelloWorld");
System.out.println("getHello:"+serviceClient.invokeBlocking(opAddEntry, new Object[]{},classes)[0]);
} catch (AxisFault e) {
e.printStackTrace();
}
}
}
執行結果:
相關文章
- 一種WebService的呼叫方式Web
- 幾種結匯方式分享
- 小結:二叉樹的幾種實現方式二叉樹
- JAVA - mongodb 聚合幾種查詢方式JavaMongoDB
- 【開發經驗】幾種常見的加密方式加密
- java md5加密的幾種方式Java加密
- java幾種代理模式的實現方式Java模式
- Java中型別判斷的幾種方式Java型別
- java webservice 帶請求頭方式處理JavaWeb
- 說說Java非同步呼叫的幾種方式Java非同步
- java專案部署Linux伺服器幾種啟動方式總結經驗JavaLinux伺服器
- JS 總結之原型繼承的幾種方式JS原型繼承
- Java實際工作裡用到的幾種加密方式Java加密
- Java 各種鎖的小結Java
- 微信小程式 使用filter過濾器幾種方式微信小程式Filter過濾器
- 惡意軟體開發——shellcode執行的幾種常見方式
- Java建立多執行緒的幾種方式實現Java執行緒
- css引入的幾種方式CSS
- Unity反射的幾種方式Unity反射
- 短視訊app開發,介面滑動到底的幾種實現方式APP
- 最全總結!聊聊 Python 傳送郵件的幾種方式Python
- 線上直播原始碼,java資料分頁幾種方式原始碼Java
- 直播軟體原始碼,java資料分頁幾種方式原始碼Java
- 獲取Java執行緒返回值的幾種方式Java執行緒
- Java裡連線字串的幾種方式以及優缺點Java字串
- Java開發學習(四)----bean的三種例項化方式JavaBean
- Java併發小結01Java
- offline tablespace 的幾種方式 (轉)
- 程式碼迭代的幾種方式
- Spring注入Bean的幾種方式SpringBean
- react 路由的幾種使用方式React路由
- python 非同步的幾種方式Python非同步
- python的幾種輸出方式Python
- python的幾種輸入方式Python
- JavaScript的幾種繼承方式JavaScript繼承
- OAuth的幾種授權方式OAuth
- AOP 有幾種實現方式?
- Java(SpringBoot)專案打包(構建)成`Docker`映象的幾種方式JavaSpring BootDocker
- Android技能樹 — 網路小結(4)之socket/websocket/webserviceAndroidWeb