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名称项目名称 arget”会生成“项目名称.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%inwsimport" -keep -Xnocompile -d d:java -p webservice.client http://localhost:8090/jwsDemo/service/hello?wsdl
几个参数说明:
-keep 保留生成的文件
-d <directory> 指定放置生成的输出文件的位置
-p <pkg> 指定目标程序包
-Xnocompile 不编译生成的 Java 文件
在d:javawebserviceclient生成了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"); } }
附,项目截图: