1. 将EJB发布成,或者说暴露成Web服务(也许更贴切),在EJB容器中不是困难的事情,只要容器实现了JavaEE的JAX-WS标准就行了,开发人员要做的就是增加一点点有关WebService的注解,打包发布到应用容器即可。不过在笔者使用JBoss5作为EJB容器的时候,调用Web服务出现了异常~~~最后发现是JDK版本的问题,改用JDK1.5编译EJB类、启动JBoss后才能正常调用。这个问题先留着,回头使用JBoss6的时候在试试吧~~~~
2. helloworld服务端代码
服务端不用再强制规定WebService必须实现一个接口了,而一个普通的POJO+EJB注解的类就可以当做WebService服务器类。
代码如下:
package webservice.HelloWebService;
import javax.ejb.Stateless; import javax.jws.WebService;
@Stateless @WebService(name = "HelloWebService") public class HelloWebService { public String sayHello(String name) { System.out.println("客户端调用了服务器端的代码"); return "你好:" + name+",传授给你武功--旋空斩"; } } |
将此类打包部署到JBoss容器中,重启JBoss,打开链接
http://127.0.0.1:8080/jbossws看到如下界面
选择View a list of deployed services查看webservice列表
点击链接即可看到WSDL文档
<definitions name='HelloWebServiceService' targetNamespace='http://HelloWebService.webservice/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://HelloWebService.webservice/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <types> <xs:schema targetNamespace='http://HelloWebService.webservice/' version='1.0' xmlns:tns='http://HelloWebService.webservice/' xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:element name='sayHello' type='tns:sayHello'/> <xs:element name='sayHelloResponse' type='tns:sayHelloResponse'/> <xs:complexType name='sayHello'> <xs:sequence> <xs:element minOccurs='0' name='arg0' type='xs:string'/> </xs:sequence> </xs:complexType> <xs:complexType name='sayHelloResponse'> <xs:sequence> <xs:element minOccurs='0' name='return' type='xs:string'/> </xs:sequence> </xs:complexType> </xs:schema> </types> <message name='HelloWebService_sayHelloResponse'> <part element='tns:sayHelloResponse' name='sayHelloResponse'></part> </message> <message name='HelloWebService_sayHello'> <part element='tns:sayHello' name='sayHello'></part> </message> <portType name='HelloWebService'> <operation name='sayHello' parameterOrder='sayHello'> <input message='tns:HelloWebService_sayHello'></input> <output message='tns:HelloWebService_sayHelloResponse'></output> </operation> </portType> <binding name='HelloWebServiceBinding' type='tns:HelloWebService'> <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='sayHello'> <soap:operation soapAction=''/> <input> <soap:body use='literal'/> </input> <output> <soap:body use='literal'/> </output> </operation> </binding> <service name='HelloWebServiceService'> <port binding='tns:HelloWebServiceBinding' name='HelloWebServicePort'> <soap:address location='http://127.0.0.1:8080/EJBWebService/HelloWebService'/> </port> </service> </definitions> |
1. 客户端测试程序
我们使用IDE工具生成客户端代码,在MyEclipse中选择new菜单,选择Web服务客户端,如下图所示
选择生成代码的目标项目和类型
之后输入WSDL文档的URL位置,如下图所示
之后选择Next进入加入依赖包的选项
如果不加入任何依赖包也可以,可以手工下载CXF项目(http://cxf.apache.org/),将它的lib下的wsdl4j-version.jar、XmlSchema-version.jar拷贝到客户端Classpath下面就行。
之后生成的代码如下
其中HelloWebServiceService是需要客户端稍微关心一下的类,客户端调用这个类的方法就能调到服务器端的代码。测试程序如下
public static void main(String[] args) { HelloWebServiceService helloWebServiceService = new HelloWebServiceService(); HelloWebService helloWebService = helloWebServiceService.getHelloWebServicePort(); System.out.println(helloWebService.sayHello("单锋剑尊")); } |