webservice的技术有很多,现在流行的有JAX-WS、XFile、CXF、Axis1、Axis2等。不过JAX-WS是webservice技术最轻量级的,不需要引入额外jar包。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。当然 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。
我们使用JAX-WS开发WebService只需要很简单的几个步骤:写接口和实现=>发布=>生成客户端。
开发webservice服务端我们可以先编写接口,接口中只需要把类注明为@WebService,把要暴露给客户端的方法注明为@WebMethod即可。
1:编写webservice服务端接口
package service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* 测试webservice接口
* @author
*
*/
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface TestService {
/**
* 测试接口
*/
@WebMethod
void SayHiDefault();
@WebMethod
void SayHi(@WebParam(name = "name") String name);
@WebMethod
String sayHello(String userName);
}
2:编写接口的实现类
package service.imp;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import service.TestService;
@WebService(endpointInterface = "service.TestService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class TestServiceImp implements TestService {
@Override
public void SayHiDefault() {
System.out.println("Hi,wangql!");
}
@Override
public void SayHi(String name) {
System.out.println("Hi,"+name+"!");
}
@WebMethod
public String sayHello(@WebParam(name = "userName") String userName) {
return "hi," + userName + " welcome to wangql";
}
}
3:发布
方法一:(此方式只能作为调试,有以下BUG:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在service接口和实现类添加“@SOAPBinding(style = SOAPBinding.Style.RPC)”注解)
package main;
import javax.xml.ws.Endpoint;
import service.TestService;
import service.imp.TestServiceImp;
public class ServerStart {
public static void main(String[] args) {
System.out.println("start publish jax-ws ...");
TestService service = new TestServiceImp();
Endpoint.publish("http://localhost:8080/jaxwsTest/TestService", service);
System.out.println("publish webservice successful");
}
}
方法二:(基于web服务器Servlet方式,使用tomcat发布)
以Tomcat为例,首先编写sun-jaxws.xml文件并放到WEB-INF下:
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="TestService"
implementation="service.imp.TestServiceImp"
url-pattern="/service/test" />
</endpoints>
然后编辑web.xml,添加listener和servlet(url-pattern要保持一致):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>TestService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/service/test</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
完成之后启动tomcat,访问http://localhost:8080/jaxwsTest/service/test?wsdl
成功访问wsdl文件,服务端可以正常运行。
注:@SOAPBinding(style = SOAPBinding.Style.RPC)一定要加上
http://www.micmiu.com/soa/webservice/jdk6-webservice-doc-rpc/ 可以看一下这篇文章,我再研究一下这个东西。
3:生成webservice客户端
方法一:使用jdk自带工具wsimport生成客户端
一般情况下直接输入wsimport命令行直接生成客户端,因为我是用java开发的,所以我是先在MyEclipse上创建一个webservice项目,然后在通过wsimport命令生成客户端,这样可以尽量避免因为编写造成的不必要麻烦。
(1)在Eclipse或者MyEclipse上创建一个webservice项目
(2)我们先访问到项目的src目录下,然后执行"wsimport -keep http://localhost:8080/jaxwsTest/TestService?wsdl"生成客户端代码。
注:我们访问的http://localhost:8080/jaxwsTest/TestService?wsdl是wsdl文件的路径
我们查看我们的项目,如图
这样就自动生成webservice客户端了。
我们在客户端编写测试代码
package main;
import service.imp.TestServiceImpService;
public class WSClient {
public static void main(String[] args) {
TestServiceImpService test = new TestServiceImpService();
String name = test.getTestServiceImpPort().sayHello("123213");
System.out.println(name);
}
}
如图调用成功
方法二:使用MyEclipse创建webservice Client
在webservice服务端工程中 右击 new----> other ---->web service client创建客户端
在WSDL URL添加地址就可以了
如果出错检查自己的地址和tomcat服务是否已开启
方法三:自己创建webservice客户端,因为webservice可以跨平台,我们可以用任何语言编写客户端,所以自己编写客户端是最好的选择。