简介:
在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。
当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。
通过web service所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。
当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。
通过web service所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作。
这次测试为两个项目之间的接口调用,分别为webservice.byJava(服务端),webservice.client(客户端),需要用的jar包: webservices-api.jar
webservices-extra-api.jar
webservices-extra.jar
webservices-rt.jar
webservice.byJava 结构:
User.java:
package com.java.model;
public class User {
int id;
String name;
public User() {
super();
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
SelectUser.java:
package com.java.remote;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import com.java.model.User;
/** Jdk 提供 JAX-WS WebService 方式
* 1.添加jar包( webservices-api.jar,
* webservices-extra-api.jar,
* webservices-extra.jar,
* webservices-rt.jar)
* ·2.编写接口以及实现
* 3.配置接口(配置sun-jaxws.xml,web.xml)
* 4.运行web项目,此时服务已经公布,可以使用客户端调用。
*
* (注:此接口为webservice服务端接口,提供客户端远程调用,
* 客户端与服务端需要相同有相同定义的接口,客户端不予实现,服务端实现接口并返回数据给客户端
* 注意接口定义的格式以及入参格式。
* targetNamespace 目标命名空间 ,浏览器输入此地址可查看服务相关配置)
* @author dk
*/
@WebService(targetNamespace = "http://www.ceshi.com")
@SOAPBinding(style = Style.RPC)
public interface SelectUser {
@WebMethod
public User select(@WebParam(name="user")User user);
}
SelectUserImpl.java:
package com.java.remote.impl;
import javax.jws.WebService;
import com.java.model.User;
import com.java.remote.SelectUser;
/**
* 服务端接口实现类,实现具体业务
* @author dk
* endpointInterface为接口的包路径
* service为服务名称
* portName 端口名称
* targetNamespace 目标命名空间 ,浏览器输入此地址可查看服务相关配置
*/
@WebService(endpointInterface = "com.java.remote.SelectUser", serviceName = "SelectUser", portName = "SelectUserPort", targetNamespace = "http://www.ceshi.com")
public class SelectUserImpl implements SelectUser {
@Override
public User select(User user) {
user.setId(user.getId()+1);
user.setName(user.getName()+"添加后");
return user;
}
}
sun-jaxws.xml:
<?xml version = "1.0"?>
<endpoints version="2.0"
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="Select"
implementation="com.java.remote.impl.SelectUserImpl"
url-pattern="/Select">
</endpoint>
</endpoints>
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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>webservice.byJava</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- WebService配置开始 -->
<servlet>
<description>测试服务</description>
<display-name>SelectUser</display-name>
<servlet-name>SelectUser</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>SelectUser</servlet-name>
<url-pattern>/Select</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<!-- WebService配置结束 -->
</web-app>
------------------------------------------------------------服务端结束---------------------------------------------------------
webservice.client项目结构:
代码:
User.java:
package com.java.model;
public class User {
int id;
String name;
public User() {
super();
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
SelectUser.java:
package com.java.remote;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import com.java.model.User;
/** Jdk 提供 JAX-WS WebService 方式
* 1.添加jar包( webservices-api.jar,
* webservices-extra-api.jar,
* webservices-extra.jar,
* webservices-rt.jar)
* ·2.编写接口以及实现
* 3.配置接口(配置sun-jaxws.xml,web.xml)
* 4.运行web项目,此时服务已经公布,可以使用客户端调用。
*
* (注:此接口为webservice服务端接口,提供客户端远程调用,
* 客户端与服务端需要相同有相同定义的接口,客户端不予实现,服务端实现接口并返回数据给客户端
* 注意接口定义的格式以及入参格式。
* targetNamespace 目标命名空间 ,浏览器输入此地址可查看服务相关配置)
* @author dk
*/
@WebService(targetNamespace = "http://www.ceshi.com")
@SOAPBinding(style = Style.RPC)
public interface SelectUser {
@WebMethod
public User select(@WebParam(name="user")User user);
}
Ws.java:
package com.java.serice;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.java.model.User;
import com.java.remote.SelectUser;
/**
* 模拟客户端 调用远程接口服务
* @author dk
*
*/
public class Ws {
public static void main(String[] args) throws Exception {
//远程服务url
URL wsdlUrl = new URL("http://localhost:8080/webservice.byJava/Select?wsdl");
//获取远程服务地址,目标命名空间,服务名称
Service s = Service.create(wsdlUrl, new QName("http://www.ceshi.com","SelectUser"));
//目标命名空间,服务端口名称,接口class属性
SelectUser su = s.getPort(new QName("http://www.ceshi.com","SelectUserPort"), SelectUser.class);
//获取实例
new Ws().test(su);
}
public void test(SelectUser su){
//实例对象
User user = new User();
user.setId(0);
user.setName("张三");//设置属性
User result = su.select(user); //调用远程接口的 select 方法
//输出"1|张三添加后",远程服务调用成功
System.out.println(result.getId()+"|"+result.getName());
}
}
测试:将服务端部署到tomcat中,调用客户端可见结果,说明调用成功: