手机搜狗输入法关掉联想上面的这个能不能关掉几个或者调整位置啊???

1&&&&&&:WebService框架WebService-CXF&1.1&&&&简介:1.1.1&&什么是CXFl& Apache CXF = Celtix + Xfire&:结合Celtix +Xfire的优点;l& 支持多种协议:o&&& SOAP1.1,1,2o&&& XML/HTTPo&&& CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)o&&& 并可以与Spring进行快速无缝的整合o&&& 灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&1.1.2&CXF的结构:&&1.1.2.1&Bus CXF框架的支撑Bus是CXF框架的支撑.CXF Bus由spring配置文件构成(cxf.xml),在servlet初始化时通过SpringBusFactory加载,它为所有终端定义了公共的上下文.它织入了所有运行时的结构组件并提供了一个公共的应用上下文.SpringBusFactory扫描并加载类路径下的META-INF/cxf目录并从以下文件构建上下文.META-INF/cxf/cxf.xmlMETA-INF/cxf/cxf-extension.xmlMETA-INF/cxf/cxf-property-editors.xmlXML文件是安装CXF类库的一部分.CXF内部使用Spring配置.cxf.xml文件中bus定义如下:&bean id=&cxf&class=&org.apache.cxf.bus.CXFBusImpl& /&核心bus组件是CXFBusImpl,该类更多扮演拦截器供应商的角色对于终端出入的请求.这些拦截器一旦应用,即可用于上下文中所有的终端.cxf.xml文件也定义了其他的组件,比如BindingFactoryManager, ConduitFactoryManager等等.这些组件可用于bus的扩展.可以使用getExtension()方法这些组件.注册这些组件以用于获取或更新服务终端级别参数如服务绑定,传输协议,中转等等.--------------1.1.2.2Frontend-前端: FrontendCXF提供了前端建模的概念,可以使用不同的前端API创建ws.这些API使用简单工厂bean和JAX-WS实现创建ws.可以创建动态ws客户端.CXF支持的前端主要是JAX-WS.---------1.1.2.3Message and intercetpors: 消息和拦截器CXF框架中重要的组件之一是拦截器组件.拦截器拦截客户端和服务器间的消息.在CXF,这通过拦截器链的概念实现.拦截器链是CXF运行时的核心功能.链中的每个拦截器是可配的,用户可以控制他的执行.框架的核心的是拦截器接口,它定义了两个方法handleMessage和handleFault,都携带Message类型作为参数.拦截器通常分组成各阶段.每个阶段执行特定的消息处理,每个阶段又被添加到拦截器链中,因此,链有时有序的拦截器阶段的列表.典型的ws终端有三个连接器链:Inbound messages chain(入消息链)Outbound messages chain(出消息链)Error messages chain(错误消息链)内置拦截器如日志,安全,也可以自定义拦截器.-----1.1.2.4Service Model-主要用于生成wsdl文件的各个元素。建模service,创建各种WSDL元素如操作,绑定,终端,schema等等.如下显示了服务模型中的各个组件:-------1.1.2.5&Data binding数据绑定是ws开发的关键.它意味着java对象和xml元素之间的映射.数据绑定组件执行这一工作.CXF最新版本使用JAXB2.1.JAXB使用注解定义java对象和XML之间的映射.如下:@XmlRootElement(name=&processOrder&,&&&&&&&&&&&&&&&&&& &&&&&& namespace=&http://localhost/orderprocess&)@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name=&processOrder&,namespace=&http://localhost/orderprocess&)public class OrderProcess {&&&&&&&& @XmlElement(name=&arg0&,namespace=&&)&&&&&&&& privateorder.Order arg0;&&&&&&&& //Gettterand Setter&&&&&&&& …}-----------协议绑定:protocol bindingsCXF支持以下形式的绑定:SOAP1.1SOAP1.2CORBAPure XML--数据传输——transportCXF支持以下数据传输方式:HTTPCORBAJMSLOCAL&下载完成后将其解压到某个目录下&1.2&&&&Ant +CXF+java环境搭建l& Antl& Tomcatl& 并设置以下环境变量:o&&& JAVA_HOME& o&&& CXF_HOMEo&&& ANT_HOMEo&&& CATALINA_HOME& (tomcat_hone)o&&& Path =%JAVA_HOME%/%CXF_HOME%/%CATALINA_HOME%/%ANT_HOME%/bino&&& CLASSPATH=.;%CXF_HOME%/lib/cxf-manifest../build/classes&1.2.1&1、为什么要用到ant这个工具呢?Ant做为一种工具已经广泛被使用,并且历史悠久。使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。由于ant是用xml语言写成的文件,并取默认名为build.xml文件。所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。2、默认在Eclipse和MyEclipse的对ant有内建的支持。大家可以在MyEclipse中任意项目中建立一个文件叫build.xml文件,你会发现它有不同的图标(上面有个小蚂蚁)。&&1.2.2&用ANT来构造第一个CXF示例:l& 在cxf_home/samples/java_first_pojo目录下启动服务器:o&&& 在命令行模式下进入上述目录:o&&& 执行 以下命令 ant server&& (server不是固定的_这里使用server)l& 在同一目录下打开新命令行窗口运行:o&&& ant clientl& 上面的代码,其实就是通过ant工具对源代码进行编译和运行。l& 如果能编译通过,将会显示buildsuccess.o&&& &1.2.3&用ANT来构造第一个CXF示例:查看它的源代码并修改运行:&1.2.3.1用ANT将它发布到Tomcat服务器上:l& 1、执行ant clean清除以前生成的代码l& 2、执行ant war打包此应用。l& 3、执行ant deploy –Dtomcat=true将项目发布到tomcat的服务器上。l& 4、启动tomcat服务器l& 5、打开IE的地址栏输入:http://localhost:9999/helloworld/services/hello_world?wsdl或:http://localhost:9999/helloworld/services l& 6、在命令行执行:o&&& ant client-servlet –Dbase.url=http://localhost:9999o&&& 或在MyEclipse的WebServiceExplorer中访问这个WebServicel& 7、停止tomcat服务器。l& 8、卸载应用:ant undeploy –Dtomcat=truel& 9、清空项目:ant clean&&&1.3&&&&Eclipse中开发CXF的JavaSE应用:l& 导入CXF中的 所有jar文件。可以通过WACH_JARS来观察各jar文件的用途。l& 建立好之后的项目如&&&&&&右图所示:&&&CXF发布服务的类:l& 用两个不同的类发布应用:l& ServerFactoryBean&& --FacotryBean l& JaxWsServerFactoryBean(建议使用此类)&1.3.1&&使用ServerFactoryBean发布服务:(不建议使用)l& 使用ServerFactoryBean发布服务。l& 使用CXF发布一个服务,与JDK6发布一个服务完全不同o&&& * ,一样可以发布成功o&&& * 即使此类没有对外公布的方法一样可以发布成功&&package cn.itcast.cxf1;import java.util.Dimport org.apache.cxf.frontend.ServerFactoryB/**&* 使用ServerFactoryBean发布服务&* 使用CXF发布一个服务,与JDK6发布一个服务完全不同&* ,一样可以发布成功&* 即使此类没有对外公布的方法一样可以发布成功&*/public class CxfOneServer {&&&&&&&& public String sayHi(){&&&&&&&&&&&&&&&&&& return &Hello:&+new Date();&&&&&&&& }&&&&&&&& public static void main(String[] args) {&&&&&&&&&&&&&&&&&& ServerFactoryBean bean = //声明实例&&&&&&&&&&&&&&&&&&&&&&&&&&& new ServerFactoryBean();&&&&&&&&&&&&&&&&&& //绑定到发布地址的端口&&&&&&&&&&&&&&&&&& bean.setAddress(&http://127.0.0.1:9999/one&);&&&&&&&&&&&&&&&&&& //设置服务接口,如果没有接口,则为本类&&&&&&&&&&&&&&&&&& bean.setServiceClass(CxfOneServer.class);&&&&&&&&&&&&&&&&&& //设置接口实现类,即服务类&&&&&&&&&&&&&&&&&& bean.setServiceBean(new CxfOneServer());&&&&&&&&&&&&&&&&&& bean.create();//发布服务&&&&&&&&&&&&&&&&&& System.err.println(&启动成功&);&&&&&&&& }}&1.3.2&&使用JaxWsServerFactoryBean发布服务:(建议使用此类)&l& JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。l& 但在CXF的API文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。l& 此类,,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范。l& 以下是从它的源代码中找到的对此类的说明。&&package cn.leaf.import javax.jws.WebSimport org.apache.cxf.jaxws.JaxWsServerFactoryB@WebService public class OneService {&&&&&&&& public String sayHi(){&&&&&&&&&&&&&&&&&& return &Good&;&&&&&&&& }&&&&&&&& public static void main(String[] args) throws Exception {&&&&&&&&&&&&&&&&&& JaxWsServerFactoryBean bean& //使用jaxWs对其进行发布&&&&&&&&&&&&&&&&&& & = new JaxWsServerFactoryBean();&&&&&&&&&&&&&&&&&& bean.setServiceBean(new OneService());&&&&&&&&&&&&&&&&&& bean.setServiceClass(OneService.class);&&&&&&&&&&&&&&&&&& bean.setAddress(&http://localhost:4444/one&);&&&&&&&&&&&&&&&&&& bean.create();&&&&&&&&&&&&&&&&&& System.err.println(&服务启动成功。。&);&&&&&&&&&&&&&&&&&& //Thread.sleep();&&&&&&&&&&&&&&&&&& //System.exit(0);&&&&&&&& }}&&&&&1.3.3&使用ClientProxyFactoryBean客户端调用在同一个项目中调用package cn.itcast.cxf1;import org.apache.cxf.frontend.ClientProxyFactoryBpublic class Client {&&&&& public static void main(String[] args) {&&&&&&&&&&&&&&& ClientProxyFactoryBean bean = //创建客户端类&&&&&&&&&&&&&&&&&&&&&&&& new ClientProxyFactoryBean();&&&&&&&&&&&&&&& //设置访问地址&&&&&&&&&&&&&&& bean.setAddress(&http://localhost:9999/one&);&&&&&&&&&&&&&&& //设置服务接口,直接使用本项目中的接口&&&&&&&&&&&&&&& bean.setServiceClass(CxfOne.class);&&&&&&&&&&&&&&& //通过create方法返回接口实例&&&&&&&&&&&&&&& CxfOne s =&& (CxfOne) bean.create();&&&&&&&&&&&&&&& String str = s.sayHi();//调用&&&&&&&&&&&&&&& System.err.println(str);&&&&& }}&&在不同的项目中调用&&&&& public static void main(String[] args) {&&&&&&&&&&&&&&& ClientProxyFactoryBean bean = //创建客户端类&&&&&&&&&&&&&&&&&&&&&&&& new ClientProxyFactoryBean();&&&&&&&&&&&&&&& //设置访问地址&&&&&&&&&&&&&&& bean.setAddress(&http://localhost:9999/one&);&&&&&&&&&&&&&&& //设置服务接口,直接使用本项目中的接口&&&&&&&&&&&&&&& bean.setServiceClass(CxfOnePortType.class);&&&&&&&&&&&&&&& //通过create方法返回接口实例&&&&&&&&&&&&&&& CxfOnePortType one =&& (CxfOnePortType) bean.create();&&&&&&&&&&&&&&& String s = s.sayHi();//调用&&&&&&&&&&&&&&& System.err.println(s);&&&&& }&&&1.4&&&&CXF的实践1.4.1&&使用CXF的类发布一个服务:&packagecn.leaf.one;import javax.jws.WebSimport org.apache.cxf.jaxws.JaxWsServerFactoryB@WebServicepublicclassOneService {&& publicString sayHi(){&&&&& return&Good&;&& }&& publicstaticvoidmain(String[]args)throwsException {&&&&& JaxWsServerFactoryBeanbean//使用jaxWs对其进行发布&&&&& & = new JaxWsServerFactoryBean();&&&&& bean.setServiceBean(new OneService());&&&&& bean.setServiceClass(OneService.class);&&&&& bean.setAddress(&http://localhost:4444/one&);&&&&& bean.create();&&&&& System.err.println(&服务启动成功。。&);&&&&& //Thread.sleep();&&&&& //System.exit(0);&& }}&&1.4.2&&使用JaxWsProxyFactoryBean客户端调用&packagecn.itcast.cxf2;importorg.apache.cxf.jaxws.JaxWsProxyFactoryBpublicclassA {publicstaticvoid main(String[] args) {JaxWsProxyFactoryBean bean = newJaxWsProxyFactoryBean();bean.setAddress(&http://localhost:9999/two&);//此外注册的必须是一个接口,否则将抛出异常信息bean.setServiceClass(Cxf2Server.class);Cxf2Server s = (Cxf2Server) bean.create();System.err.println(s.sayHello());}} &&1、在使用CXF发布服务时,需要首先写一个接口,用以声明服务类型。这有点类似于Spring中的服务层的实现。package cn.&import javax.jws.WebSimport javax.xml.ws.BindingTimport javax.xml.ws.soap.SOAPB&@WebService@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)&publicinterface IHelloService {&&& public String sayHello(Stringname);}&&1.4.2.1wsdl2java生成客户代码l& 在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。l& 先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。l& 此工具位于cxf_home/bin目录下。参数与wsimport有所不同。l& 它包含以下参数:o&&& -d参数,指定代码生成的目录。o&&& -p参数,指定生成的新的包结构。l& 需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。l& 在命令行执行:&&&&&&&& wsdl2java–d . http://127.0.0.1:6666/helloworld?wsdl&1、注意:由于使用的是apache-cxf-2.4.0版本,它是支持jdk1.7的。所以,对于生成的Service要进行稍微的修改。&& 在jdk1.6中的javax.xml.ws.Service的构造方法接收二个参数为:(String url,QName qname);在jdk1.7中的javax.xml.ws.Service的构造方法中接收三个参数为:(String url,QName qname,features);2、将生成的代码,拷贝到项目目录,然后使用以前相同方法调用。&&& 注意:=true参数,将会在调用时多传递一个参数。它参数可以直接传null值。&&&&&&&&&&&&对于这种情况,可以将header=true修改成header=false然后再重要获取客户端源代码。3、大家可能发现了,使用cxf生成的客户端代码与wsimport差不多,甚至是一样,那为什么还要使用cxf呢?它较好的发布方式、较容易的与其他服务器集成、及与Spring的完美结合都不得不让我们使用cxf。&调用端代码:1、必须已经使用wsimport或wsdl2java生成了客户端代码。以下是源代码:packagecom.run;importcom.itcast.cxfserver.javaclient.IHelloWimportcom.itcast.cxfserver.javaclient.IHelloWorldPortT/**&* 使用java6来调用cxf生成的客户端类的服务&* 不管是用wsimport还是用wsdl2java生成的类基本上是完全一样的&*/publicclassCxfServerJava6Client {&& publicstaticvoid main(String[] args) {&&&&& //调用使用wsimport生成的代码&&&&& IHelloWorldPortType hello = newIHelloWorld().getIHelloWorldPort();&&&&& String str = hello.sayHello(&小王&);&&&&& System.err.println(str);&&&&& &&&&& //调用使用wsdl2java生成的代码(一样)&&&&& com.itcast.cxfserver2.javaclient.IHelloWorldPortType client =&&&&& && newcom.itcast.cxfserver2.javaclient.IHelloWorld().getIHelloWorldPort();&&&&& String str2 = client.sayHello(&CXF&);&&&&& System.err.println(str2);&& }}&3、要想研究更多程序请见:cxf2.4_ws服务项目和cxf2.4_java6client客户端项目。&&&1.4.3&给服务添加消息拦截器:-这个非常有用:在服务发布之前添加拦截器:l& LoggingInInterceptor – 信息输入时的拦截器 –请求l& LoggingOutInterceptor –信息输出时的拦截器-响应&&&&&&&&& server.getInInterceptors().add(new LoggingInInterceptor());&&&&&&&& server.getOutInterceptors().add(new LoggingOutInterceptor());&给服务器添加拦截器,类似于使用TCP/IP Monitor来捕获SOAP消息的过程。&package cn.itcast.cxf;&import org.apache.cxf.interceptor.LoggingInIimport org.apache.cxf.interceptor.LoggingOutIimport org.apache.cxf.jaxws.JaxWsServerFactoryB&/**&* &* 使用JaxWsServerFactoryBean发布CXF的Web服务&* 必须加入WebService注解,如果不加,虽然不报错,但是所有的方法都暴露不出来&*/&public class Server {&&&& public static void main(String[] args) {&&&&&&& JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();&&&&&&& bean.setAddress(&http://192.168.1.100:7788/hello&);&&&&&&& //提供服务的类的类型或接口类型&&&&&&& bean.setServiceClass(IHelloService.class);&&&&&&& bean.setServiceBean(newHelloServiceImpl());&&&&&&& //可以多次针对不同的对象在(srping)中配置&&&&&&& //加入请求的消息拦截器&&&&&&& bean.getInInterceptors().add(new LoggingInInterceptor());&&&&&&& //加入请求的消息拦截器&&&&&&& bean.getOutInterceptors().add(new LoggingOutInterceptor());&&&&&&& &&&&&&& bean.create();&&&&&&& System.out.println(&Hello Service ready...&);&&& }}&1.4.4&使用JavaScript也可以访问WebServie:l& jQuery访问WebService.o&&& 1、在本域准备jquery.js (由于jquery对跨域的请求做了限制,所以jquery仅限于在本域中使用。但为了快速解析XML文件,仍然可以使用jquery当成解析xml文件的工具。)。o&&& 2、通过js发起ajax请求。&%@pagelanguage=&java&import=&java.util.*&pageEncoding=&UTF-8&%&&&&&& &%@ tagliburi=&/jsp/jstl/core& prefix=&c& %&&&&&& &html&&&&&& &head&&&&&&&&& &script type=&text/javascript& src=&&c:url value='/js/jquery-1.6.2.js'/&&&&/script&&&&&& &/head&&&&&& &body&&&&&& &p&用js来控制的客户端&/p&&&&&&&&& &button id=&all&&显示所有&/button&&br/&&&&&&&&& &hr/&&&&&&&&& Name:&input type=&text& id=&_name&&,Age:&input type=&text& id=&_age&&&&&&&&&& &button id=&add&&增加一个&/button&&br/&&&&&&&&& &table id=&tb& width=&70%& border=&1&&&&&&&&&&&&& &tr&&&&&&&&&&&&&&&& &th&学生姓名&/th&&&&&&&&&&&&&&&& &th&学生年龄&/th&&&&&&&&&&&& &/tr&&&&&&&&& &/table&&&&&& &/body&&&&&& &script type=&text/javascript&&&&&&&&&& &$(function(){&&&&&&&&&&& &var url = &http://localhost:7777/xcxf3_ss/ws/studQuery&;&&&&&&&&&&& &$(&#all&).click(function(){&&&&&&&&&&&&&&& //查询时必须向服务器发以下xml文件&&&&&&&&&&&&&&& &var xml = '&soap:Envelope xmlns:soap=&http://schemas.xmlsoap.org/soap/envelope/&&'+&&&&&&&&&&&&&&&&&&&&& '&soap:Body&&ns2:query xmlns:ns2=&/&/&'+&&&&&&&&&&&&&&&&&&&&& '&/soap:Body&&/soap:Envelope&';&&&&&&&&&&&&&&& &$.ajax({&&&&&&&&&&&&&&&&&& &url:url,&&&&&&&&&&&&&&&&&& &type:'post',&&&&&&&&&&&&&&&&&& &dataType:'xml',&&&&&&&&&&&&&&&&&& &contentType:'application/soap+charset=UTF-8',&&&&&&&&&&&&&&&&&& &data:xml,&&&&&&&&&&&&&&&&&& &success:function(data){&&&&&&&&&&&&&&&&&&&&& &$(&#tb tr:gt(0)&).remove();//删除所有列&&&&&&&&&&&&&&&&&&&&&& //遍历data&&&&&&&&&&&&&&&&&&&&& &$(data).find(&return&).each(function(){&&&&&&&&&&&&&&&&&&&&&&&& &var name = $(this).find(&name&).text();&&&&&&&&&&&&&&&&&&&&&&&& &var age& = $(this).find(&age&).text();&&&&&&&&&&&&&&&&&&&&&&&& &var tr = $('&tr&&td&'+name+'&/td&&td&'+age+'&/td&&/tr&');&&&&&&&&&&&&&&&&&&&&&&&& &tr.appendTo(&#tb&);&&&&&&&&&&&&&&&&&&&&& &});&&&&&&&&&&&&&&&&&& &}&&&&&&&&&&&&&&& &});&&&&&&&&&&&&&&& //以下是增加&&&&&&&&&&&&&&& &$(&#add&).click(function(){&&&&&&&&&&&&&&&&&& &var nm = $(&#_name&).val();&&&&&&&&&&&&&&&&&& &var age = $(&#_age&).val();&&&&&&&&&&&&&&&&&& if($.trim(nm)==&& || $.trim(age)==&&){&& &&&&&&&&&&&&&&&&&& alert('姓名和年龄必须输入');&&&&&&&&&&&&&&&&&&& &}&&&&&&&&&&&&&&&&&& //以下是保存服务的xml&&&&&&&&&&&&&&&&&& &var xml = '&soap:Envelope xmlns:soap=&http://schemas.xmlsoap.org/soap/envelope/&&'&&&&&&&&&&&&&&&&&&&&&&&& && +'&soap:Body&&ns2:add xmlns:ns2=&/&&'&&&&&&&&&&&&&&&&&&&&&&&& && +'&arg0&&age&'+age+'&/age&&name&'+nm+'&/name&&/arg0&&/ns2:add&'&&&&&&&&&&&&&&&&&&&&&&&& && +'&/soap:Body&&/soap:Envelope&';&&&&&&&&&&&&&&&&&& &$.ajax({&&&&&&&&&&&&&&&&&&&&& &url:url,&&&&&&&&&&&&&&&&&&&&& &type:'post',&&&&&&&&&&&&&&&&&&&&& &dataType:'xml',&&&&&&&&&&&&&&&&&&&&& &contentType:'application/soap+charset=UTF-8',&&&&&&&&&&&&&&&&&&&&& &data:xml,&&&&&&&&&&&&&&&&&&&&& &success:function(){&&&&&&&&&&&&&&&&&&&&&&&& alert('保存成功');& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &}&&&&&&&&&&&&&&&&&& &});&&&&&&&&&&&&&&& &});&&&&&&&&&&& &});&&&&&&&& &});&&&&& &/script&&&&&& &/html&&&l& 如何通过ant发布第一个cxf应用。l& 手工建立一个java项目发布cxf的ws.l& Java项目和js访问webService l& 加入消息拦截器l& 将服务端改为SOAP1.2实现l& SOAP1.1与1.2&&
iOS手写签名生成图片&贝赛尔
最新教程周点击榜
7iOS手写签名生成图片&贝赛尔曲线&
微信扫一扫2009年11月
日一二三四五六252627282930311234567891012131415161719212225262728293012345
随笔分类(116)
随笔档案(114)
文章分类(1)
文章档案(1)
阅读排行榜
评论排行榜当前位置: >
> CXF框架实现webservice教程 中文WORD版
CXF框架实现webservice教程 中文WORD版
书籍大小:152KB
软件语言:简体中文
书籍类型:
书籍授权:免费软件
更新时间:
书籍类别:java电子书
购买链接:&&
应用平台:
网友评分:
内容介绍热点排行下载地址相关内容
本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形java入门最好的书Java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。本书用通俗易懂的语言和丰富多彩的实例,通过对ajax、javascript、html等web系统开发技术基础知识的讲解,并结合mvc设计模式的理念,详细讲述了使用jsp及struts框架进行web如果你想要看“一本正经”的书,那你去找其他的吧,这本书你肯定不喜欢。因为这本书太幽默风趣了,甚至给你扯到了如何去玩电脑游戏!!因为面向对象是抽象的,所以这本书也本书从从XML、Servlet、JSP和应用的角度向读者展示了Java Web开发中各种技术的应用,循序渐进地引导读者快速掌握Java Web开发继承了前两个畅销版本面向实战、实用的写作风格。作者Craig Walls拥有一种特殊的技能,可以将读者真正需要的技术通过非常有趣的示例予以呈现。本书介绍了Spring 3.0最重要的本书讲解目前java web开发中的主流技术,Spring,Struts,Hibernate,WebWork,WebService,EJB3,JPA,SSH融合,SSH2组合本书介绍了在java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对java平台设计专家所使用的技术的全面描述,揭示《Java核心技术?卷1:基础知识(原书第9版)》共14章。第1章概述了Java语言与其他程序设计语言不同的性能;第2章讲解了如何下载和安装JDK及本书的程序示例;第3章介绍了变
CXF框架实现webservice教程 中文WORD版
CopyRight &
JB51.Net , All Rights Reservedcxf_心得技巧_动态网站制作指南
来源:人气:136
1.1.& WS常见框架和CXF概述
Axis:--&Axis2
XFire:--&(WebService框架)
Celtrix:(ESB框架)
CXF(XFire+Celtrix)
CXF号称是SOA框架,我们做WS只会用到XFire。
CXF内置Jetty Web服务器。
使用CXF开发WebServer端都需要“接口”和“实现类”两部分。
支持多种数据格式:和JSON(Restful)。
并可以与Sing进行快速无缝的整合
灵 活的 部 署 : ant(build.xml)& maven(pom.xml)
可 以运 行 有Tomcat,Jboss,Jetty(内 置web 服 务器),IBMWebsphere,BeaWebLogic上面。
官网地址:http://cxf.apache.org/
为了方便使用CXF下的工具,把CXF\bin配置到PATH里去。当然最好先配置CXF_HOmE,然后在Path里面直接引用。
常用jar库文件:
除了jetty服务器相关的类外,有7个必须的包:
asm是字节码相关的包;
logging是日志相关的包;
cxf是框架核心包;
geronimo-servlet是servlet相关包;
neethi是网络安全相关包;
wsdl4j是wsdl解析用的包;
xmlschema是schema相关的包。
1.2.& wsdl2工具
在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。
先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。
此工具位于cxf_home/bin目录下。参数与wsimport有所不同。
它主要包含以下参数:
-d参数,指定代码生成的目录。
-p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。
Wsdl2java& -d . -p cn.itsource.ws.cxf.aahttp://localhost:9998/hi?wsdl
1、注意:由于使用的是apache-cxf较新版本,所以支持jdk1.7的。对于生成的Service要进行稍微的修改。
在jdk1.6中 的javax.xml.ws.Service的 构 造 方 法 接 收 二个 参 数 为:(URLurl,QName qname);
在jdk1.7中的javax.xml.ws.Service的构造方法中接 收三个参数为:(URLurl,QName qname,WebServiceFeature... features);
2、将生成的代码,拷贝到项目目录,然后使用以前相同方法调用。
注意:如果你对@WebMethod设置了header=true参数,将会在调用时多传递一个参数。它参数可以直接传null值。对于这种情况,可以将header=true修改成header=false然后再重要获取客户端源代码。
3、大家可能发现了,使用cxf生成的客户端代码与wsimport差不多,甚至是一样,
那为什么还要使用cxf呢?它较好的发布方式、较容易的与其他服务器集成、及与Spring的完美结合都不得不让我们使用cxf。
1.3.& ServerFactoryBean和ClientProxyFactoryBean方式
此时服务类和接口,都可以不使用@WebService标注。(因为这套标准在JDK1.6之前就有了)
//服务端发布
1.创建ServerFactoryBean的对象,用于发布服务
2.设置服务发布地址
3.设置服务发布的接口
4.设置服务的发布对象
5.使用create方法发布服务
&&&&& JaxWsServerFactoryBeanbean=
newJaxWsServerFactoryBean();
&&&&& // 2.设置服务发布地址
&&&&& bean.setAddress(&http://localhost:9998/hi&);
&&&&& // 3.设置服务发布的接口
&&&&& bean.setServiceClass(IHelloService.class);//接口设置ServiceClass
&&&&& // 4.设置服务的发布对象
&&&&& bean.setServiceBean(new HelloServiceImpl());
&&&&& //============拦截器==========//
&&&&& bean.getInInterceptors().add(newLoggingInInterceptor());
&&&&& bean.getInInterceptors().add(new AuthInInterceptor());
&&&&& //============拦截器==========//
&&&&& // 5.使用create方法发布服务
&&&&& bean.create();
&&&&& System.out.println(&服务发布成功!&);
其中设置接口实现类或设置服务类对象任意一个都可以。
//客户端:
1.创建ClientProxyFactoryBean的对象,用于接收服务
2.设置服务的发布地址,表示去哪里过去服务
3.设置服务的发布接口,使用本地的代理接口
4.通过create方法返回接口代理实例
5.调用远程方法
&& JaxWsProxyFactoryBeanbean=
newJaxWsProxyFactoryBean();
&&&&& // 2.设置服务的发布地址,表示去哪里过去服务
&&&&& bean.setAddress(&http://192.168.1.254:9999/hi&);//不能加?wsdl
&&&&& // 3.设置服务的发布接口,使用本地的代理接口
&&&&& bean.setServiceClass(IHelloService.class);
&&&&& //===================拦截器=======================//
&&&&& bean.getOutInterceptors().add(newLoggingOutInterceptor());&
//先获取框子,直接往里面放
&&&&& //自定义拦截器
&&&&& bean.getOutInterceptors().add(new AuthOutInterceptor(&admin&,&1&));&
//先获取框子,直接往里面放
&&&&& //===================拦截器=======================//
&&&&& // 4.通过create方法返回接口代理实例
&&&&& IHelloServicehelloService= (IHelloService)
bean.create();
&&&&& System.out.println(helloService.getClass().getName());
&&&&& System.out.println(helloService.sayHello(&小猪&));
1.4.& JaxWsServerFactoryBean和JaxWsProxyFactoryBean方式
支持@WebService等注解
JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
但在CXF的API文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。此类,必须要在被发布为服务的类和接口上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范,建议使用该类。
1.创建JaxWsServerFactoryBean的对象,用于发布服务
2.设置服务发布地址
3.设置服务发布的接口
4.设置服务的发布对象
5.使用create方法发布服务
这种方式发布必须使用接口。
1.创建JaxWsProxyFactoryBean的对象,用于接收服务
2.设置服务的发布地址,表示去哪里过去服务
3.设置服务的发布接口,使用本地的代理接口
4.通过create方法返回接口代理实例
5.调用远程方法
1.5.& 为CXF客户端和服务端添加拦截器
使用自带的日志拦截器:可以用来捕获soap的消息
LoggingInInterceptor–信息输入时的拦截器-请求
LoggingOutInterceptor–信息输出时的拦截器-响应
1.5.1.&&服务端添加拦截器
&&& // 1.创建JaxWsServerFactoryBean的对象,用于发布服
&&&&& JaxWsServerFactoryBean
bean = newJaxWsServerFactoryBean();
&&&&& // 2.设置服务发布地址
&&&&& bean.setAddress(&http://localhost:9998/hi&);
&&&&& // 3.设置服务发布的接口
&&&&& bean.setServiceClass(IHelloService.class);//接口设置ServiceClass
&&&&& // 4.设置服务的发布对象
&&&&& bean.setServiceBean(new HelloServiceImpl());
&&&&& //============拦截器==========//
&&&&& bean.getInInterceptors().add(new LoggingInInterceptor());
&&&&& bean.getInInterceptors().add(new AuthInInterceptor());
&&&&& //============拦截器==========//
&&&&& // 5.使用create方法发布服务
&&&&& bean.create();
&&&&& System.out.println(&服务发布成功!&)
1.5.2.&&客户端添加拦截器
&& // 1.创建JaxWsProxyFactoryBean的对象,用于接收服务
&&&&& JaxWsProxyFactoryBeanbean=
newJaxWsProxyFactoryBean();
&&&&& // 2.设置服务的发布地址,表示去哪里过去服务
&&&&& bean.setAddress(&http://localhost:9998/hi&);//不能加?wsdl
&&&&& // 3.设置服务的发布接口,使用本地的代理接口
&&&&& bean.setServiceClass(IHelloService.class);
&&&&& //===================拦截器=======================//
&&&&& bean.getOutInterceptors().add(newLoggingOutInterceptor());&
//先获取框子,直接往里面放
&&&&& //自定义拦截器
&&&&& bean.getOutInterceptors().add(new AuthOutInterceptor(&admin&,&1&));&
//先获取框子,直接往里面放
&&&&& //===================拦截器=======================//
&&&&& // 4.通过create方法返回接口代理实例
&&&&& IHelloServicehelloService= (IHelloService)
bean.create();
&&&&& System.out.println(helloService.getClass().getName());
&&&&& System.out.println(helloService.sayHello(&小猪&));
1.5.3.&&为CXF添加自定义拦截器完成权限控制、
场景就是做服务的访问权限判断
拦截器使用的步骤:
1、声明一个类,来充当拦截器。这个类需要继承或实现某个接口或基类。
2、完成拦截器的逻辑。
3、把拦截器配置到访问或者发布逻辑中。
自 定 义 拦 截 器 需 要 实 现Interceptor接 口 , 一 般 的 我 们 直 接 继承AbstractPhaseInterceptor类。
做一个权限控制例子。
要求客户端把请求发送到服务端的时候,服务端根据客户端发送的SAOP消息,从&Header&里取出登录信息,以做权限验证。那么应该在客户端添加一个自定义的输出拦截器,在服务端添加一个自定义的输入拦截器。
1.1.1&&&& 客户端添加权限拦截器
得在拦截器里拼装一个SOAP消息的Header片段,如下:
&soap:Header&
& &authHeader&
&&& &username&用户名&/username&
&&& &pass&密码&/password&
& &/authHeader&
&/soap:Header&
AuthOutInterceptor类:
publicclass AuthOutInterceptor
&&&&&&&&&&&&&&&&&& extendsAbstractPhaseInterceptor&SoapMessage&{
& private S
& private S
& publicAuthOutInterceptor(String username,String password) {
&&& //在哪个阶段拦截
&&& super(Phase.PREPARE_SEND);//准备发送SOAP消息的时候,启用拦截器,添加
&&& this.username=
&&& this.password=
& public voidhandleMessage(SoapMessage msg) throws Fault {
&&& //使用工具创建dom对象
&& &Documentdoc =
DOMUtils.createDocument();
&&& //使用DOM对象创建符合XML规范的子元素
&&& //创建头信息中认证信息的根
&&& Element root =doc.createElement(&autherHeader&);
&&& //创建头信息中认证信息的内容
&&& Element nameEle =doc.createElement(&username&);
&&& Element pwdEle =doc.createElement(&password&);
&&& nameEle.setTextContent(username);
&&& pwdEle.setTextContent(password);
&&& root.appendChild(nameEle);
&&& root.appendChild(pwdEle);
&& &Headerheader =new Header(new QName(&sirius&),root);
&&& msg.getHeaders().add(header);
客户端代码:
publicvoid testCxf() {
& JaxWsProxyFactoryBeanbean = new JaxWsProxyFactoryBean();
& //设置访问地址
& bean.setAddress(&http://localhost:9527/hello&);
& //设置服务接口,直接使用本项目中的接口
& bean.setServiceClass(IHelloKity.class);
& //通过create方法返回接口实例
& bean.getOutInterceptors().add(
& new AuthOutInterceptor(&sirius&,&1314&));
& bean.getOutInterceptors().add(newLoggingOutInterceptor());
& IHelloKity hello =(IHelloKity) bean.create();
& String ret =hello.sayHi(&sirius&, 18);
& System.out.println(ret);
添加拦截后SOAP内容如下:
信息:Outbound Message
---------------------------
Address:http://localhost:9527/hello
Encoding:UTF-8
Content-Type:text/xml
Headers:{Accept=[*/*], SOAPAction=[&&]}
&soap:Envelopexmlns:soap=&http://schemas.xmlsoap.org/soap/envelope/&&
&soap:Header&
&autherHeader&
&username&sirius&/username&
&password&1314&/password&
&/autherHeader&
&/soap:Header&
&soap:Body&
&ns2:sayHixmlns:ns2=&http://cxf.ws.itc
&arg0&sirius&/arg0&
&arg1&18&/arg1&
&/ns2:sayHi&
&/soap:Body&
&/soap:Envelope&
1.5.4.&&服务端添加权限验证拦截器
服务端从SOAP中去取Header消息,若取到,再根据以下格式解析XML,得到username和password数据。
&soap:Header&
&authHeader&
&username&用户名&/username&
&password&密码&/password&
&/authHeader&
&/soap:Header&
AuthInInterceptor类:
publicclass AuthInInterceptor
&&&&&&&&&&&&extendsAbstractPhaseInterceptor&SoapMessage& {
publicAuthInInterceptor() {
& super(Phase.PRE_INVOKE);
& System.out.println(&构造器&);
publicvoid handleMessage(SoapMessage msg) throws Fault {
& List&Header&headers = msg.getHeaders();
& if (headers == null|| headers.isEmpty()) {
&&& throw new Fault(newIllegalArgumentException(&没有header&));
& Header header=headers.get(0);
//在客户端的过滤器里,把element放入了header中,所以这里可以
& Element root =(Element) header.getObject();
& String username =
&&&&&&&& root.getElementsByTagName(&username&).item(0).getTextContent();
& String password =
&&&&&&& &root.getElementsByTagName(&password&).item(0).getTextContent();
& //查询验证
& if (!&sirius&.equals(username) || !&1314&.equals(password)) {
&&& thrownewFault(newIllegalArgumentException(&用户名或密码不对!&));
& System.out.println(&恭喜你可以开始了&);
服务端代码:
publicstatic void main(String[] args) {
& JaxWsServerFactoryBeanbean = new JaxWsServerFactoryBean();
& //绑定到发布地址的端口
& bean.setAddress(&http://localhost:9527/hello&);
& //设置服务接口,如果没有接口,则为本类
& bean.setServiceClass(IHelloKity.class);
& //设置服务类对象
& bean.setServiceBean(newHelloKityWS());
& //发布服务
& bean.getInInterceptors().add(newAuthInInterceptor());
& bean.create();
& System.out.println(&启动OK&);
package cn.itsource.ws.cxf.
import java.util.L
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.headers.H
import org.apache.cxf.interceptor.F
importorg.apache.cxf.phase.AbstractPhaseI
import org.apache.cxf.phase.P
import org.w3c.dom.E
public class AuthInInterceptor extendsAbstractPhaseInterceptor&SoapMessage& {
&&&&&&&& publicAuthInInterceptor() {
&&&&&&&&&&&&&&&&&& super(Phase.PRE_INVOKE);//必须在执行之前,接收之后
&&&&&&&&&&&&&&&&&& //TODO Auto-generated constructor stub
&&&&&&&& }
&&&&&&&& @Override
&&&&&&&& publicvoid handleMessage(SoapMessage soapMessage) throws Fault {
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //获取所有的头信息
&&&&&&&&&&&&&&&&&& List&Header&headers = soapMessage.getHeaders();
&&&&&&&&&&&&&&&&&& if(null == headers || headers.size()==0) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& thrownew Fault(new IllegalException(&请携带认证信息!&));
&&&&&&&&&&&&&&&&&& }
&&&&&&&& &&&&&&&&
&&&&&&&&&&&&&&&&&& //很确定认证头就是第一个
&&&&&&&&&&&&&&&&&& Headerheader = headers.get(0);
&&&&&&&&&&&&&&&&&& if(null == header) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& thrownew Fault(new IllegalAccessException(&请携带认证信息!&));
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //获取AuthInfo节点
&&&&&&&&&&&&&&&&&& Elementele = (Element) header.getObject();
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& StringuserName = ele.getElementsByTagName(&userName&).item(0).getTextContent();
&&&&&&&&&&&&&&&&&& Stringpassword =ele.getElementsByTagName(&password&).item(0).getTextContent();
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //可以使用用户名和密码到数据库中做验证,现在写死。
&&&&&&&&&&&&&&&&&& if(&admin&.equals(userName)&&&1&.equals(password)) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&//直接返回就是放行
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& thrownew Fault(new IllegalAccessException(&用户名和密码不正确!&));
&&&&&&&& }
package cn.itsource.ws.cxf.
import javax.xml.namespace.QN
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.headers.H
import org.apache.cxf.helpers.DOMU
import org.apache.cxf.interceptor.F
importorg.apache.cxf.phase.AbstractPhaseI
import org.apache.cxf.phase.P
import org.w3c.dom.D
import org.w3c.dom.E
&*@author Administrator
public class AuthOutInterceptor extendsAbstractPhaseInterceptor&SoapMessage& {
&&&&&&&& privateString userN
&&&&&&&& privateS
&&&&&&&& publicAuthOutInterceptor(String userName,String password) {
&&&&&&&&&&&&&&&&&& super(Phase.PREPARE_SEND);//设置拦截器的阶段
&&&&&&&&&&&&&&&&&& this.userName= userN
&&&&&&&&&&&&&&&&&& this.password=
&&&&&&&& }
&&&&&&&& /**
&&&&&&&& &* 把权限认证的信息加到SOAP的Header里面
&&&&&&&& &* &soap:Header&
&&&&&&&&&&&&&&&&&& &authInfo&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &userName&admin&/userName&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &password&1&/password&
&&&&&&&&&&&&&&&&&& &/authInfo&
&&&&&&&&&&&&&&&&&&
&&&&&&&& &&/soap:Header&
&&&&&&&& &*/
&&&&&&&& @Override
&&&&&&&& publicvoid handleMessage(SoapMessage message) throws Fault {
&&&&&&&&&&&&&&&&&& //第一步:通过工具类获取Document对象,就可以使用对象创建权限信息的节点
&&&&&&&&&&&&&&&&&& Documentdocument = DOMUtils.createDocument();
&&&&&&&&&&&&&&&&&& //第二步:创建权限信息的节点
&&&&&&&&&&&&&&&&&& ElementauthInfoEle = document.createElement(&authInfo&);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& ElementuserNameEle = document.createElement(&userName&);
&&&&&&&&&&&&&&&&&& userNameEle.setTextContent(userName);
&&&&&&&&&&&&&&&&&& ElementpasswordEle = document.createElement(&password&);
&&&&&&&&&&&&&&&&&& passwordEle.setTextContent(password);
&&&&&&&&&&&&&&&&&& authInfoEle.appendChild(userNameEle);
&&&&&&&&&&&&&&&&&& authInfoEle.appendChild(passwordEle);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //localPart是一个唯一标识,可以随便写
&&&&&&&&&&&&&&&&&& QNameqName = new QName(&xxxx&);// &autoInfo&&/authInfo&
&&&&&&&&&&&&&&&&&& //QNameqName = new QName(namespaceURI, localPart)//&autoInfoxmlns=&&&&/authInfo&
&&&&&&&&&&&&&&&&&& //QNameqName = new QName(namespaceURI, localPart, prefix)//&autoInfoxmlns:xxx=&&&&/authInfo&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //有两个参数:后面的一个为要添加节点,第一个为修改该节点的Namespace
&&&&&&&&&&&&&&&&&& Headerheader = new Header(qName , authInfoEle);
&&&&&&&&&&&&&&&&&& //第三步:把权限信息的节点添加到header里面
&&&&&&&&&&&&&&&&&& message.getHeaders().add(header);
&&&&&&&& }
&&&&&&&& publicString getUserName() {
&&&&&&&&&&&&&&&&&& returnuserN
&&&&&&&& }
&&&&&&&& publicvoid setUserName(String userName) {
&&&&&&&&&&&&&&&&&& this.userName= userN
&&&&&&&& }
&&&&&&&& publicString getPassword() {
&&&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& publicvoid setPassword(String password) {
&&&&&&&&&&&&&&&&&& this.password=
&&&&&&&& }
1.6.& CXF和Spring集成
1.6.1.&&服务端部分
使用CXF的最大好处就是能快速的Spring进行集成,现在在服务端来做一个和集成Spring应用。分为如下6步:
l& 建立标准的Web工程结构;
l& 拷贝CXF的核心jar包;
l& 拷贝Spring的核心jar包;
l& 在web.xml中配置cxf的核心servlet--CXFServlet;
l& 在Spring文件中配置CXF核心bean;
l& 服务器端发布服务;
1.6.1.1.&&&&&&&&&&&建立标准的Web工程结构
1.6.1.2.&&&&&&&&&&&拷贝CXF的核心jar包;
官方提供的lib里有75个包,但不是所有的我们都需要,在这里抽取一个mini版的CXF库,一共7个包。
1.6.1.3.&&&&&&&&&&&添加Spring相关配置
导入17spring依赖包:
在resource中添加:
Context.xml
在web.xml中配置spring上下文:
&context-param&
&&&&&& &param-name&contextConfigLocation&/param-name&
&&&&&& &param-value&classpath:applicationContext.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
在web.xml中配置cxf的核心servlet—CXFServlet
在web.xml中添加CXF核心servlet
&&&&&& &servlet&
&&&&&&&&&&&&& &servlet-name&cxf&/servlet-name&
&&&&&&&&&&&&& &servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&&&&&& &/servlet&
&&&&&& &servlet-mapping&
&&&&&&&&&&&&& &servlet-name&cxf&/servlet-name&
&&&&&&&&&&&&& &url-pattern&/ws/*&/url-pattern&
&&&&&& &/servlet-mapping&
1.6.1.4.&&&&&&&&&&&在Spring文件中配置CXF核心bean
通过查看前面配置的CXFServlet,可以看出,如果没有在工程WEB-INF下有个cxf-servlet.xml,在servlet代码执行时不会创建spring环境。
这时我们直接在applicationContext中手动集成CXF和Spring
&!-- cxf的核心bean --&
&import resource=&classpath:META-INF/cxf/cxf.xml& /&
&!-- SOAP相关配置 --&
&importresource=&classpath:META-INF/cxf/cxf-extension-soap.xml& /&
1.6.1.5.&&&&&&&&&&&服务器端发布服务
服务端的发布分为两种情况:
&&&&&& &!—1、简单发布(不支持接口,实现类不能直接实例化)--&
&&&&&& &beanid=&hellobean& class=&test.HelloKityWSImpl&/&
&&&&&& &jaxws:endpointid=&hello& implementor=&#hellobean& address=&/hi&/&
&&&&&& &!-- 2、通过接口的方式发布服务 --&
&beanid=&hellobean& class=&test.HelloKityWSImpl& /&
&&&&&& &jaxws:server id=&hello&address=&/hi& serviceClass=&test.IHelloKity&&
&&&&&&&&&&&&& &jaxws:serviceBean&
&&&&&& &&&&&&&&&&&&& &refbean=&hellobean& /&
&&&&&&&&&&&&& &/jaxws:serviceBean&
&&&&&&&!-- 添加拦截器 --&
&&&&&&&&&&&&& &jaxws:inInterceptors&
&&&&&&&&&&&&&&&&&&&& &beanclass=&org.apache.cxf.interceptor.LoggingInInterceptor& /&
&&&&&&&&&&&&& &/jaxws:inInterceptors&
&&&&&&&&&&&&& &jaxws:outInterceptors&
&&&&&&&&&&&&&&&&&&&& &beanclass=&org.apache.cxf.interceptor.LoggingOutInterceptor& /&
&&&&&&&&&&&&& &/jaxws:outInterceptors&
&&&&&& &/jaxws:server&
第一种达到的效果和最初使用JDK中的Endpoint.publish效果相同,可以直接理解为这样配置,由Spring容器自动调用上面方法发布服务。这种发布不支持接口,应用不广。
第二种方式配置更为细腻,做到了接口和实现类的分离,配置灵活性更大
红色部分是拦截器配置,与之前代码中添加的拦截器效果相相同。
完成了上面配置,整个服务端服务就发布成功了。
1.6.2.&&客户端部分
使用CXF的最大好处就是能快速的Spring进行集成,现在在客户端来做一个和集成Spring应用。分为如下5步:
l& 建立标准的Web工程结构;
l& 拷贝CXF的核心jar包;
l& 拷贝Spring的核心jar包;
l& 在Spring文件中配置服务代理接口;
l& 客户端使用服务;
1.6.2.1.&&&&&&&&&&&建立标准的Web工程结构
1.6.2.2.&&&&&&&&&&&拷贝CXF的核心jar包;
官方提供的lib里有75个包,但不是所有的我们都需要,在这里抽取一个mini版的CXF库,一共7个包。
1.6.2.3.&&&&&&&&&&&添加Spring相关配置
导入17spring依赖包:
在resource中添加:
applicationContext.xml
在web.xml中配置spring上下文:
&context-param&
&&&&&& &param-name&contextConfigLocation&/param-name&
&&&&&& &param-value&classpath:applicationContext.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
1.6.2.4.&&&&&&&&&&&在Spring文件中配置服务代理接口
在客户端先找到需要消费服务的WSDL文件地址,使用wsimport导入服务生成客户端代码,保留接口和接口所依赖的domain。其他都删掉。
这时我们直接在applicationContext中手动配置需要消费的接口
&!-- 客户端通过jaxws:client标签配置以后,就可以当成本地bean来进行使用 --&
&jaxws:client &id=&hello&
&serviceClass=&ws.client.test.IHelloKity&&
&wsdlLocation=&http://localhost:8080/ws/hi?wsdl&/&
1.6.2.5.&&&&&&&&&&&客户端使用服务
在客户端的编写测试代码:
public class TestClient {
public void testCall() throws Exception {
&&& ApplicationContext ctx =
&&&&&&&& newClassPathXmlApplicationContext(&applicationContext.xml&);
&&&&&& IHelloKityservice = ctx.getBean(&hello&, IHelloKity.class);
&&&&&& System.out.println(&service: & +service.sayHi(&sirius&));
得到打印结果:
service : sirius,你好!
优质网站模板

我要回帖

更多关于 如何把搜狗输入法关掉 的文章

 

随机推荐