Web服务(Web Service)

Web服务也是一种分布式技术,与EJB最大的不同点是,Web服务属于行业规范,可以跨平台及语言。而EJB属于java平台的规范,一般也使用在java平台。Web服务更加偏重对外提供什么功能,而EJB偏重的是如何用一个个组件组装这些功能。

JavaEEweb service提供了两种不同的编程模型:EJB容器模型机Web容器模型,这里主要介绍EJB容器模型。

编写Order

package wang.ejb3.bean; import java.io.Serializable; @SuppressWarnings("serial") public class Order implements Serializable { private String orderid; private String name; public String getOrderid() { return orderid; } public void setOrderid(String orderid) { this.orderid = orderid; } public String getName() { return name; } public void setName(String name) { this.name = name; } }  上面编写的Order类是实现类似Entity bean的功能。

编写session bean的远程接口OrderService.java,接口中有三个业务方法。

package wang.ejb3.service; import java.util.List; import wang.ejb3.bean.Order; public interface OrderService { public String getUserName(String name); public Order getOrder(String orderid); public List<Order> getOrders(); }  编写session bean,实现该远程接口

package wang.ejb3.service.impl; import java.util.ArrayList; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.jws.WebService; import wang.ejb3.bean.Order; import wang.ejb3.service.OrderService; @WebService(targetNamespace="http://ws.wang.cn", name="OrderService", serviceName="OrderServiceBean") @Stateless @Remote(OrderService.class) public class OrderServiceBean implements OrderService { @Override public Order getOrder(String orderid) { Order order = new Order(); order.setOrderid(orderid); order.setName("小燕子"); return order; } @Override public List<Order> getOrders() { List<Order> persons = new ArrayList<Order>(); Order order1 = new Order(); order1.setOrderid("001"); order1.setName("小一"); Order order2 = new Order(); order2.setOrderid("002"); order2.setName("小二"); persons.add(order1); persons.add(order2); return persons; } @Override public String getUserName(String name) { return name; } }  @WebService(targetNamespace="http://ws.wang.cn",

       name="OrderService",

       serviceName="OrderServiceBean")

上面这段注释是把该无状态session bean中所有的业务方法暴露为web service方法,如果想只是把某个方法暴露为web service方法,只需在该方法上添加注释@WebMethod

targetNamespace是命名空间,name是服务端名称,serviceName是服务名称,这些参数都可以在web service的描述语言中查看,启动jboss,输入:http://localhost:8080/jbossws/,点击“View a list of deployed services”,然后点击http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl就可以查看wsdl

<definitions name="OrderServiceBean" targetNamespace="http://ws.wang.cn" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.wang.cn" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <types> - <xs:schema targetNamespace="http://ws.wang.cn" version="1.0" xmlns:tns="http://ws.wang.cn" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="getOrder" type="tns:getOrder" /> <xs:element name="getOrderResponse" type="tns:getOrderResponse" /> <xs:element name="getOrders" type="tns:getOrders" /> <xs:element name="getOrdersResponse" type="tns:getOrdersResponse" /> <xs:element name="getUserName" type="tns:getUserName" /> <xs:element name="getUserNameResponse" type="tns:getUserNameResponse" /> - <xs:complexType name="getOrder"> - <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string" /> </xs:sequence> </xs:complexType> - <xs:complexType name="getOrderResponse"> + <xs:sequence> </xs:complexType> - <xs:complexType name="order"> - <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string" /> <xs:element minOccurs="0" name="orderid" type="xs:string" /> </xs:sequence> </xs:complexType> - <xs:complexType name="getUserName"> - <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string" /> </xs:sequence> </xs:complexType> - <xs:complexType name="getUserNameResponse"> - <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string" /> </xs:sequence> </xs:complexType> - <xs:complexType name="getOrders"> <xs:sequence /> </xs:complexType> - <xs:complexType name="getOrdersResponse"> - <xs:sequence> <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:order" /> </xs:sequence> </xs:complexType> </xs:schema> </types> - <message name="OrderService_getOrder"> <part element="tns:getOrder" name="getOrder" /> </message> - <message name="OrderService_getUserName"> <part element="tns:getUserName" name="getUserName" /> </message> - <message name="OrderService_getUserNameResponse"> <part element="tns:getUserNameResponse" name="getUserNameResponse" /> </message> - <message name="OrderService_getOrderResponse"> <part element="tns:getOrderResponse" name="getOrderResponse" /> </message> - <message name="OrderService_getOrders"> <part element="tns:getOrders" name="getOrders" /> </message> - <message name="OrderService_getOrdersResponse"> <part element="tns:getOrdersResponse" name="getOrdersResponse" /> </message> - <portType name="OrderService"> - <operation name="getOrder" parameterOrder="getOrder"> <input message="tns:OrderService_getOrder" /> <output message="tns:OrderService_getOrderResponse" /> </operation> - <operation name="getOrders" parameterOrder="getOrders"> <input message="tns:OrderService_getOrders" /> <output message="tns:OrderService_getOrdersResponse" /> </operation> - <operation name="getUserName" parameterOrder="getUserName"> <input message="tns:OrderService_getUserName" /> <output message="tns:OrderService_getUserNameResponse" /> </operation> </portType> - <binding name="OrderServiceBinding" type="tns:OrderService"> <soap:binding style="document" mce_style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <operation name="getOrder"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> </operation> - <operation name="getOrders"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> </operation> - <operation name="getUserName"> <soap:operation soapAction="" /> - <input> <soap:body use="literal" /> </input> - <output> <soap:body use="literal" /> </output> </operation> </binding> - <service name="OrderServiceBean"> - <port binding="tns:OrderServiceBinding" name="OrderServicePort"> <soap:address location="http://127.0.0.1:8008/WebService/OrderServiceBean" /> </port> </service> </definitions>  发布该webservicejboss中。

J2SE或者Web中调用Web Service

利用JDKwsimport命令生成辅助类,wsimport用法如下:

wsimport –d E:/JavaProject/WSClient/bin –keep –s E:/JavaProject/WSClient/src –verbose

http://localhost:8080/WsHelloWorld/HelloWorldBean?wsdl –p wang.ejb3.ws.client

上面各选项的含义如下:

-d<directory>指定保存目录,存放生成类编译后的class文件。

-s<directory>指定保存目录,存放生成的源文件。

-keep指定是否生成文件。

-verbose指定是否显示执行细节。

-p指定生成文件所使用的包名。

编写build.xml如下:

<?xml version="1.0" encoding="UTF-8"?> <project name="WSClient" default="wsclientgen" basedir="."> <property name="src.dir" value="${basedir}}/src"/> <path id="build.classpath" description="设置类路径"> <fileset dir="C:/Program Files/Java/jre1.6.0_07/lib"> <include name="*.jar"/> </fileset> </path> <target name="wsclientgen" description="生成webservice客户端辅助代码,执行后请刷新项目"> <exec executable="C:/Program Files/Java/jdk1.6.0_07/bin/wsimport"> <arg line="-keep -s ./src -p wang.ejb3.ws.client -d ./bin http://localhost:8008/WebService/OrderServiceBean?wsdl"/> </exec> </target> </project>  运行该build.xml,生成相应辅助类。

借助辅助类调用web service

OrderServiceBean service = new OrderServiceBean(); OrderService orderService = service.getOrderServicePort(); orderService.getUserName("skycloud") orderService.getOrders();  

 

 

 

 

 

你可能感兴趣的:(Web,webservice,String,service,SOAP,web服务)