有两种方式用 CXF 写 WebService
1、JAVA FIRST
即先写java类,然后通过javax.ws包的注解将java类发布为WebService
2、WSDL FIRST
先写WSDL文件描述,然后用CXF的wsdl2java工具生成WebService的java类,最后加入业务逻辑
javax.xml.ws 包
javax.xml.ws包在JAVA 6中被正式引入到J2SE版本中,在JAVA5的时候,还是作为J2EE中的内容。
javax.xml.ws被包含在CXF的geronimo-jaxws_2.1_spec-1.0.jar包中
1、该包中的 javax.xml.ws.BindingType 注解可以用来配置WSDL文件中 <wsdl:binding>部分的<soap:binding>,BindingType 可选值有以下几种:SOAPBinding.SOAP11HTTP_BINDING, SOAPBinding.SOAP12HTTP_BINDING, HTTPBinding.HTTP_BINDING
当 BindingType 的值为 SOAPBinding.SOAP12HTTP_BINDING 时,生成的WSDL中<wsdl:binding>的内容如下:<wsdl:binding ... ><soap12:binding ...>
BindingType 用来修饰 WebService接口的实现类
2、javax.jws包
javax.jws包要注意以下注解
1、WebMethod 用来注解WebService接口要向外公开的方法。
只有被标注为 WebMethod 的方法,才会公开给外部访问。
2、WebParam 用来注解上述所讲的方法的参数,该注解的 name 属性对应于WSDL中相应方法的参数的name属性
WebParam.Mode 属性用来指定?
3、WebResult 用来注解上述所描述的方法的返回值,该注解的 name 属性对应于WSDL中相应方法返回值的name属性
4、WebService 用来对类和接口进行注解。当接口和其实现类被WebService注解之后才能成为一个WebService。
endpointInterface 属性,一般都作用于接口的实现类上,且其值就是该实现类的接口的全路径。
name 属性用来指定 WebService的name,
对应于<wsdl:definitions>的name属性
serviceName 属性用来做指定公开的WebService的服务名,对应于WSDL中 <wsdl:service> 的name
portName 属性用来指定WSDL中生成出来的
<wsdl:port>的name属性
wsdlLocation 属性用来指定WebService类所匹配的WSDL文件的路径,如果不指定这个,那么通过WebserviceName?wsdl生成出来的wsdl是CXF自己产生的,如果指定了,那么通过WebserviceName?wsdl生成的wsdl就是wsdlLocation 所指向的文件的内容
以上属性全作用于类和接口上
targetNamespace 用来指定WebService的WSDL的 targetNamespace 属性,该属性可以用于接口和类上,也可以作用于endpoint 上
JAXB :javax.xml.bind 包
javax.xml.bind包用来提供将java bean和xml之间进行转换的支持。
通过 JAXB 中的 Marshaller 和 Unmarshaller 可以将xml和java bean 进行转换
- Web 服务端点
javax.xml.ws.Endpoint
使用在此类中定义的静态方法创建端点。一个端点总是绑定到一个 Binding
和一个实现者,这两项都是在创建端点时设置的。
端点要么处于已发布状态,要么处于未发布状态。可以使用 publish
方法开始发布端点,此时端点开始接受传入请求。相反,可以使用 stop
方法停止接受传入请求并取消端点。一旦停止,就不能再次发布该端点。
可以在端点上设置 Executor
以便更好地控制用来指派传入请求的线程。例如,通过创建ThreadPoolExecutor
并向端点注册可以启用带有特定参数的线程池。
处理程序链可以使用所含的 Binding
来设置。
端点可以使一个元数据文档(如 WSDL 和 XMLSchema 文档)列表与之绑定。发布时,JAX-WS 实现将根据实现者上存在的注释,尽可能多地重用这些元数据,而不是生成新的元数据。
例:
Endpoint.publish(address, new UniverseBusImpl());
- 建立webservice步骤
1. 新建一个JAVA project.
2. 新建一个Hello.java,代码如下:
package study.jdk6ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService(targetNamespace ="http://jdk6ws.study/client")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Hello {
@WebMethod
public String sayHello(String name) {
return "OK, " + name;
}
}
3. 新建一个发布这个服务的启动程序(StartService.java),代码如下:
package study.jdk6ws;
import javax.xml.ws.Endpoint;
public class StartService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/HelloService", new Hello());
System.out.println("Success");
}
}
4. 运行这个应用程序: StartService
5. 打开浏览器,输入: http://localhost:8080/HelloService?wsdl
可以看到相应的wsdl描述:
另若有接口及其实现类:
第二步中:
接口中
import javax.jws.WebService;
@WebService
public interface UniverseBusInterface {
public Message busSynExecuteMessage(Message message) throws Exception;
public boolean autoBusRegister(AliveBus ab);
public void busAsynExecuteMessage(Message message);
public void busAsynExecuteResult(Message message);
public String checkBus();
}
实现类中
import javax.jws.WebMethod;
public class UniverseBusImpl implements UniverseBusInterface {
@WebMethod
public void busAsynExecuteMessage(final Message message) {
。。。。。。}
。。。。。。
}
发布程序中
import javax.xml.ws.Endpoint;
public class BusLaucher {
private static void startServer(String address)
{
Endpoint.publish(address, new UniverseBusImpl());
}
。。。。。。
}
转载地址:http://blog.csdn.net/doriswang1986/article/details/5841339