您的位置:首页 > 其它

使用JAX-WS开发WebService

2017-06-08 15:12 309 查看
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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</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" 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[/code]几个参数说明: 
-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");
}
}

附,项目截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: