Apache CXF = Celtix + @H_404_6@XFire,开始叫 Apache Celtixfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 @H_404_6@JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。@H_404_6@
简单来说CXF就是用来被发布一个WebService类的@H_404_6@@H_404_6@
1,开发第一个CXF的web应用程序@H_404_6@@H_404_6@
@H_404_6@其中一个核心类是:@H_404_6@JaxWsServiceFactoryBean - 它替代了EndPoint类,用于发布一个基于jax-ws 的 webService@H_404_6@@H_404_6@
cxf-2.6.1.jar@H_404_6@
jetty-continuation-7.4.5.v20110725.jar@H_404_6@
jetty-server-7.4.5.v20110725.jar@H_404_6@
jetty-security-7.4.5.v20110725.jar@H_404_6@
servlet-api.jar@H_404_6@
wsdl4j-1.6.2.jar@H_404_6@
xmlschema-core-2.0.1.jar@H_404_6@
其中jetty其实就相当于一个容器,类似tomcat一样
第二步;@H_404_6@
@H_404_6@
@WebService //采用sope 1.1 协议 @BindingType(javax.xml.ws.soap.soAPBinding.soAP11HTTP_BINDING) public class HelloWorld { /** * 至少应该包含一个对外公开的方法 */ public String sayHi(String name){ System.err.println("服务器:"+name); return "你好,时间为:"+new Date()+","+name; } /** * CXF发布一个webService * 注释了的 是用 EndPoint 发布的一个webService * */ public static void main(String[] args) { //用CXF的发布类,基于jax-ws的服务 JaxWsServerfactorybean bean = new JaxWsServerfactorybean(); //设置服务类 bean.setServiceBean(new HelloWorld()); //3:设置服务的地址和端口 bean.setAddress("http://192.168.0.70:8080/hello"); //4:启动服务,内部开启jetty这个容器 Server ss = bean.create(); System.err.println("发布成功。。。。"); //Endpoint.publish("http://192.168.1.100:8888/hello",new HelloWorld());//jax-ws }
第三步:@H_404_6@
@H_404_6@客户端调用webService@H_404_6@
@H_404_6@命令行输入:wsimport -s . http://192.168.0.70:8080/hello?wsdl ,将生成的代码拷贝到项目中@H_404_6@
@H_404_6@
public static void main(String[] args) { HelloWorld hw = new HelloWorldService().getHelloWorldPort(); String str = hw.sayHi("张三"); System.err.println(str); }
第四步:@H_404_6@
@H_404_6@将服务器端的webservice注解改成如下方式,@H_404_6@就是soap1.2协议 @H_404_6@@H_404_6@
@BindingType(javax.xml.ws.soap.soAPBinding.soAP12HTTP_BINDING)
但是注意: jdk提供的wsimport方式只支持生成 soap1.1的方式,所以用wsimport生成soap1.2服务器端代码时会出错。@H_404_6@
@H_404_6@
第五步:@H_404_6@
@H_404_6@eclipse和Myeclipse本身提供了一个插件,可以拦截请求获取一个请求soap1.2所发送的xml文本 window --》show view --》 TCP/IP Monitor@H_404_6@
@H_404_6@因为这里不能贴图,这不就略了 ,下面是获取的xml文本@H_404_6@
以下是拦截到的请求soap12: <?xml version="1.0" ?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope "><S:Body> <ns2:sayHi xmlns:ns2="http://ws.itcast.cn/"><arg0>Jack</arg0></ns2:sayHi></S:Body> </S:Envelope> 以下是拦截到的响应的soap12: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope "><soap:Body> <ns1:sayHiResponse xmlns:ns1="http://ws.itcast.cn/"> <return>Wed Nov 14 10:13:49 CST 2012,Jack</return></ns1:sayHiResponse> </soap:Body></soap:Envelope> 拦截soap1.1 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/ "> <S:Body><ns2:sayHi xmlns:ns2="http://ws.itcast.cn/"> <arg0>Name </arg0></ns2:sayHi></S:Body> </S:Envelope> 拦截到的soap11响应: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/ "><soap:Body><ns1:sayHiResponse xmlns:ns1="http://ws.itcast.cn/"><return> Wed Nov 14 10:17:52 CST 2012,Jack</return> </ns1:sayHiResponse></soap:Body></soap:Envelope>
第六步:测试@H_404_6@
@H_404_6@
@H_404_6@用ajax向soap1.1的服务发11请求,和发12请求。@H_404_6@
用ajax向soap12发11的请求和12的请求。@H_404_6@
<html> <script type="text/javascript" src="jquery-1.8.2.js"></script> <body> <input type="text" id="name"><br/> <button id="btn">Send</button> <button id="btn2">Send_Soap12</button> </body> <script type="text/javascript"> $(function(){ var xhr = new ActiveXObject("Microsoft.XMLHttp"); $("#btn").click(function(){ var url = "http://192.168.0.70:8080/hello"; xhr.open("POST",url,true); xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8"); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200){ var xml = xhr.responseText; alert(xml); } } }; var nm = $("#name").val(); var xml = '<soap12:Envelope xmlns:soap12="http://schemas.xmlsoap.org/soap/envelope/">'+ '<soap12:Body><ns2:sayHi xmlns:ns2="http://ws.itcast.cn/">'+ '<arg0>'+nm+'</arg0></ns2:sayHi></soap12:Body></soap12:Envelope>'; alert("发送的是:"+xml); xhr.send(xml); }); //soap1.2 $("#btn2").click(function(){ var url = "http://192.168.0.70:8080/hello"; xhr.open("POST","application/soap+xml;charset=UTF-8"); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200){ var xml = xhr.responseText; alert(xml); } } }; var nm = $("#name").val(); var xml= '<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Body>'+ '<ns2:sayHi xmlns:ns2="http://ws.itcast.cn/">'+ '<arg0>'+nm+'</arg0></ns2:sayHi></S:Body></S:Envelope>'; xhr.send(xml); }); }); </script> </html>
@H_404_6@ 第七步:@H_404_6@
@H_404_6@还有一种方式 是用来 提来 jdk不能提供soap1.2 的 工具@H_404_6@
@H_404_6@@H_404_6@在cxf安装包中,提供了wsdl2java.bat这个工具,它可以解析soap1.2的wsdl和soap1.2的wsdl@H_404_6@
@H_404_6@生成webService服务器端代码的方式: @H_404_6@
@H_404_6@
@H_404_6@第一种:用wsimport生成本地调用代码,只支持soap1.1的生成 代码。
@H_404_6@第二种:用ajax获取soap文件,自己发送去调用。Jquery去解析
@H_404_6@第三种:用URLConnection发送soap文本调用。用dom去解析
@H_404_6@第四种:用wsdl2java生成本的调用代码。即支持1.1也支持1.2。
2, 发布一个Jax-RS的webService@H_404_6@
@H_404_6@JAX-RS的意思是 静态地址参数转换,http://localhost:8080/hello/jack/80
@H_404_6@核心类:
@H_404_6@JAXRSServicefactorybean
Jas-rs不支持返回字符串类型的数据,支持的是List<Bean>,List<String>,List<Map>,Bean,Map@H_404_6@
它的注解分为以以下的注解:
@Path– 说明webservice的路径信息,@Path(value=”/user/”)
@FormParam – 如果为post类型,则说明引用哪一个表单中的变量。
@Produces – 设置返回的是xml数据还是json数据
还有用于设置返回的bean的根元素是什么名:
@RootElement
再倒入两个jar包:
jsr311-api-1.1.1.jar@H_404_6@
jettison-1.3.jar@H_404_6@
@Path(value="/greeting/")
@H_404_6@@Produces(value={"application/xml","application/json"})
@H_404_6@public class Greeting {
@GET
@Path(value="/hello/{nm}")
public User hello(@PathParam(value="nm")String name){
System.err.println("服务器输出的是:"+name);
User u = new User();
u.setName("你好:"+name+","+new Date());
return u;
}
public static void main(String[] args) {
JAXRSServerfactorybean bean =
new JAXRSServerfactorybean();
bean.setServiceBean(new Greeting());
bean.setAddress("http://192.168.0.70:8080");
bean.create();
System.err.println("启动成功。。。");
}
}
访问
http://192.168.0.70:8080/greeting?_wadl&_type=xml
ajax反方式访问:
@H_404_6@
<html> <script type="text/javascript" src="jquery-1.8.2.js"></script> <body> <button id="btn">Btn1</button> <button id="btn2">Btn2</button> </body> <script type="text/javascript"> $("#btn").click(function(){ var xhr = new ActiveXObject("Microsoft.XMLHttp"); var url = "http://192.168.0.70:8080/greeting/hello/Jack/22/"; xhr.open("GET",true); xhr.setRequestHeader("accept","application/json");//决定了服务器返回什么类型的数据 xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200){ var txt = xhr.responseText; alert(txt); } } }; xhr.send(null); }); $("#btn2").click(function(){ var xhr = new ActiveXObject("Microsoft.XMLHttp"); var url = "http://192.168.0.70:8080/greeting/save"; xhr.open("POST","application/xml");//决定了服务器返回什么类型的数据 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.setRequestHeader("content-encoding","UTF-8"); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200){ var txt = xhr.responseText; alert(txt); } } }; var param = "name=李四同学&age=90"; //param = encodeURI(param); xhr.send(param); }); </script> </html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。