EJB发布成WebService总结
来源:互联网 发布:lg18650电池淘宝 编辑:程序博客网 时间:2024/05/17 23:27
EJB发布成WebService总结
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>
3. 客户端测试程序
我们使用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("单锋剑尊"));
}
4. 复杂对象调用的例子
以上例子只是简单调用了WebService,参数是简单的String,如果我们客户端需要获得复杂的,自定义的对象可以吗?答案是EJB容器也很完美的做到了
服务端代码如下
package webservice.HelloWebService;
import javax.ejb.Stateless;
import javax.jws.WebService;
import webservice.HelloWebService.pojo.Car;
@Stateless
@WebService(name = "HelloWebService")
public class CarWebService {
public Car callCar(String name) {
System.out.println("客户" + name + "端调用了服务器端的代码");
Car car = new Car();
car.setName("宝马");
car.setMessage("BMW");
return car;
}
}
这个服务类调用了一个Car实体类,这个类是一个自定义的POJO类
代码如下
package webservice.HelloWebService.pojo;
public class Car {
private String name;
private String message;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name:" + name + " -- " + message;
}
}
客户端在生成代码的时候也会将这个返回值的实体类代码生成一下。客户端生成的程序如下
测试代码如下
public static void main(String[] args) {
CarWebServiceService carWebServiceService = new CarWebServiceService();
HelloWebService helloWebService = carWebServiceService
.getHelloWebServicePort();
Car car = helloWebService.callCar("素续缘");
System.out.println(car.getName() + "--" + car.getMessage());
}
但是需要说明的一点就是在服务器端此Car实体类自己覆盖了toString方法,在客户端生成后的代码,并没有也像服务端那样覆盖toString,所以来说对于实体作为参数或者返回值的话,WebService关注的就是属性值。如果我们没有EJB服务器的实现支持,那么必须得借助像CXF、Axis2、XFire这种Web服务框架了。目前用得比较多的就是Axis2和CXF了。网上对2种框架也是褒贬不一,笔者的观点嘛~还是那句话,各有各的使用场景吧!
- EJB发布成WebService总结
- Ejb发布成webservice
- 带你走进EJB--将EJB发布为Webservice(1)
- 带你走进EJB--将EJB发布为Webservice(2)
- 带你走进EJB--将EJB发布为Webservice(3)
- 带你走进EJB--将EJB发布为Webservice(4)
- CXF发布WebService总结
- 使用J2EE Application Server发布WebService来测试EJB
- IIS 发布webService简单总结
- 使用cxf发布webservice总结
- CXF整合Spring发布WebService学习总结
- WebService 四种发布方式总结
- WebService学习总结(三)--WebServic发布
- WebService 四种发布方式总结
- WebService 四种发布方式总结
- WebService 四种发布方式总结
- WebService学习总结九 使用Spring发布WebService
- 利用Ejb开发WebService
- javaMD5
- 详解Spring中bean的作用域
- Android中的MotionEvent
- 自定义标签
- MPT612—效率高达98%的太阳能转换芯片
- EJB发布成WebService总结
- Sysenter Based System Call Mechanism in Linux 2.6
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
- JavaScript内置对象属性及方法大全
- 博客被抓
- fedora 16 使用LiveCD修复grub2引导
- Ext的Grid自适应问题解决方案
- Visual Studio调用自己编写的DLL
- C#多线程学习(一) 多线程的相关概念