最近一段時間研究webservice,一般來說,開發java的Webservice經常使用axis2和cxf這兩個比較流行的框架
先使用cxf,開發一個完整示例,方便對webservice有一個整體的概念
使用的工具主要有eclipse、maven
一、開發服務端
整體結構如下:
1、創建maven的web工程,這個就不多贅述了,如果以前沒搭建過可以去網上搜索下,網上資源很多
2、配置POM.xml文件,引入相應的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.moon.ws</groupId> <artifactId>cfxWSServer</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>cfxWSServer Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-api</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-bindings-soap</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-ws-security</artifactId> <version>2.5.0</version> </dependency> </dependencies> <build> <finalName>cfxWSServer</finalName> </build> </project>
3、開發相關的接口和實現類
首先開發接口類
package com.moon.cxfWebservice.server; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface Greeting { public String greeting(@WebParam(name="username")String userName); }
然后開發實現類
package com.moon.cxfWebservice.server; import java.util.Calendar; import javax.jws.WebService; @WebService(endpointInterface="com.moon.cxfWebservice.server.Greeting") public class GreetingImpl implements Greeting{ public String greeting(String userName) { return "Hello " + userName + ", currentTime is " + Calendar.getInstance().getTime(); } }
至此,服務端的代碼就開發完成了。
4、配置web.xml和spring配置文件
web.xml配置如下
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置 Spring 配置文件的名稱和位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/spring.xml</param-value> </context-param> <!-- 啟動 IOC 容器的 ServletContextListener --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置字符集 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <!--==這個設置很重要,那么我們的webservice的地址就是http://localhost:8080/yourProgramName/webservice/Greeting=== --> <url-pattern>/webservice/*</url-pattern> </servlet-mapping> <display-name>hello world!</display-name> <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>
spring的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!--=============== 實現類的bean,需要spring注入 ============================--> <bean id="greetingImpl" class="com.moon.cxfWebservice.server.GreetingImpl"/> <jaxws:endpoint id="greeting" implementor="#greetingImpl" address="/Greeting" /> </beans>
配置完這兩個文件后,服務器端就完成了,我們就可以將這個服務跑起來了,跑起來后 訪問 http://localhost:8080/yourProgramName/webservice/Greeting?wsdl
例如我本地的項目訪問的就是
http://localhost:8080/cxfWSServer/webservice/Greeting?wsdl
二、開發客戶端
客戶端調用我使用的兩種方式
第一種使用apche cxf生成代碼進行訪問
1、下載apache cxf的包,地址為:http://cxf.apache.org/download.html 如:apache-cxf-3.1.6
2、解壓apache-cxf-3.1.6到任意目錄
3、配置環境變量
os系統設置
1)、export CXF_HOME=/Users/moon/Desktop/tools/apache-cxf-3.1.6
2)、path后面加 :$CXF_HOME/bin
windows系統設置
1)、CXF_HOME=D:\apache-cxf-3.1.6
2)、在path后面加上 %CXF_HOME%/bin;
在命令中輸入wsdl2java,如果有提示usage,就表明配置成功
4、運行wsdl2java工具
在命令中輸入:wsdl2java -d \xx\xxx\xx -client http://localhost:8080/cxfWSServer/webservice/Greeting?wsdl
(\xx\xxx\xx 是客戶端程序代碼所在的目錄,http://localhost:8080/cxfWSServer/webservice/Greeting?wsdl 是發布的webservice服務)
附wsdl2java用法:
wsdl2java -p com -d D:\\src -all xx.wsdl
-p 指定其wsdl的命名空間,也就是要生成代碼的包名:
-d 指定要產生代碼所在目錄
-client 生成客戶端測試web service的代碼
-server 生成服務器啟動web service的代碼
-impl 生成web service的實現代碼
-ant 生成build.xml文件
-all 生成所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
生成后的代碼直接放到client工程上面
另外新建一個client類 直接使用生成的類調用
package com.moon.cxf; import com.moon.cxf.client.Greeting; import com.moon.cxf.client.GreetingImplService; public class CxfClient { public static void main(String[] args) { GreetingImplService serviceFactory = new GreetingImplService(); Greeting service = serviceFactory.getGreetingImplPort(); String result = service.greeting("Jaune"); System.out.println(result); } }
二、使用axis調用webservice接口
引入axis 相關jar包
代碼如下
package com.moon.cxf; import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; /** * 使用axis調用cxf發布的webservice接口 * @author moon * */ public class AxisClient { public static void main(String[] args) throws ServiceException, RemoteException { try { String endpoint = " http://localhost:8080/cfxWSServer/webservice/Greeting"; // 調用過程 Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName("http://server.cxfWebservice.moon.com/","greeting"));// WSDL里面描述的操作名稱 call.addParameter("username", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 操作的參數 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設置返回類型 call.setUseSOAPAction(true); // 給方法傳遞參數,並且調用方法 String temp = "good"; Object[] obj = new Object[] { temp }; String result = (String) call.invoke(obj); System.out.println("Result is : " + result); } catch (Exception e) { e.printStackTrace(); } } }
相關代碼:https://github.com/15210448683/WebServiceDemoImpl