使用JAX-WS開發WebService


Axis2和CXF是目前流行的Webservice框架,這兩個框架都屬於重量級框架。
相對而言,JAX-WS RI是一個輕量級的框架。
開發WebService只需要很簡單的幾個步驟:寫接口和實現->發布->生成客戶端(測試或使用)。

服務端寫接口和實現

1、新建一個Maven Web項目,在項目中添加JAX-WS RI引用,pom.xml配置文件如下

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.test</groupId>
<artifactId>jwsDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>jwsDemo</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<!-- JAXWS-RI --> 
<dependency> 
<groupId>com.sun.xml.ws</groupId> 
<artifactId>jaxws-rt</artifactId> 
<version>2.2.10</version> 
</dependency> 
</dependencies> 
<build>
<finalName>jwsDemo</finalName>
<defaultGoal>compile</defaultGoal>
</build>
</project>

2、創建服務接口

接口中把類注明為@WebService,把方法注明為@WebMethod,其余如@WebResult、@WebParam等都不是必要的,
而客戶端和服務端的通信用RPC 和Message-Oriented兩種。

package service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloService {
	
	@WebMethod
	void say1();
	
	@WebMethod
	void say2(@WebParam(name = "name") String name);
}

3、創建接口的實現類

package service.imp;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

import service.HelloService;

@WebService(endpointInterface = "service.HelloService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class HelloServiceImp implements HelloService{

	@Override
	public void say1() {
		 System.out.println("Hi, abc!");		
	}

	@Override
	public void say2(String name) {
		System.out.println("Hi, " + name + "!");		
	}

}

4、基於web服務器Servlet方式發布服務

(1)在WEB-INF中創建WebService配置文件sun-jaxws.xml,配置文件中一個WebService對應一個Endpoint。

<?xml version = "1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<!-- 服務路徑http://站點路徑/service/hello?wsdl--> 
<endpoint name="HelloService" implementation="service.imp.HelloServiceImp" url-pattern="/service/hello" />
</endpoints>

(2)在web.xml中添加WSServlet,如果Web項目使用Servlet 3.0或以上則不需要。

<?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" 
version="3.0"> 

<display-name>jwsDemo</display-name>
<!-- Servlet 3.0或者以上不需要配置 --> 
<!-- <listener> 
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener 
</listener-class>
</listener>
<servlet> 
<servlet-name>HelloService</servlet-name> 
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>HelloService</servlet-name> 
<url-pattern>/service/hello</url-pattern> 
</servlet-mapping> -->

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app> 

(3)生成

選擇項目 -> Run as -> Maven Install,在“workspace名稱\項目名稱\target”會生成“項目名稱.war”,即jwsDemo.war

(4)選擇項目 -> Run as -> Run on Server,在Eclipse中的瀏覽器中輸入地址
http://localhost:8090/jwsDemo/service/hello?wsdl (備注:本機把默認端口8080改了8090)
能看到東西就說明正常

(5)部署
把jwsDemo.war復制到tomcat的webapps目錄下,執行bin里面的startup.bat啟動,tomcat自動把“項目名稱.war”解壓出來並啟動。

客戶端調用
1、使用jdk自帶工具wsimport生成客戶端的Java類:

"%java_home%\bin\wsimport" -keep -Xnocompile -d d:\java -p webservice.client http://localhost:8090/jwsDemo/service/hello?wsdl

幾個參數說明:
-keep 保留生成的文件
-d <directory> 指定放置生成的輸出文件的位置
-p <pkg> 指定目標程序包
-Xnocompile 不編譯生成的 Java 文件

在d:\java\webservice\client生成了2個文件HelloService.java、HelloServiceImp.java

2、把生成的Java類添加到客戶端相應的Package下

客戶端調用

package test;

import webservice.client.HelloService;
import webservice.client.HelloServiceImpService;

public class Hello{	
	public void say() {		
	     HelloService service = new HelloServiceImpService().getHelloServiceImpPort(); 
	     service.say1();
	     service.say2("cdfefcg");
	}
}

 附,項目截圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM