WebService-CXF
ApacheCXF的是一个开源的服务框架。 CXF帮助您使用前端编程API,如JAX-WS和JAX-RS来建设和开发服务。这些服务可以使用多种协议,如SOAP,XML / HTTPRESTful HTTP,或CORBA,可以以多种传输方式工作,如HTTP,JMS或JBI。
支持多种协议:
SOAP1.1,1,2
XML/HTTP
CORBA(Common Object Request broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
优点:可以与Spring进行快速无缝的整合
灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。
jax-ws
jax-ws是Sun公司发布的一套开发WebService服务的标准。早期的标准如jax-rpc已经很少使用(在目前的jdk当中也没有附带这个工具,axis就是使用的这个标准。)。而cxf就是在新标准jax-ws下开发出来的WebService,jax-ws也内置到了jdk1.6当中。
安装CXF
设置以下环境变量:
• JAVA_HOME
• CXF_HOME
• ANT_HOME
• CATALINA_HOME
• Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin
• CLAsspATH=.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes
Ant工具
Ant做为一种工具已经广泛被使用,并且历史悠久。使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。由于ant是用xml语言写成的文件,并取默认名为build.xml文件。所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。默认在Eclipse和MyEclipse的对ant有内建的支持。大家可以在MyEclipse中任意项目中建立一个文件叫build.xml文件,你会发现它有不同的图标(上面有个小蚂蚁)。
简单介绍Ant:
在myeclipse中建立build.xml文件后会变成小蚂蚁标志
<?xml version="1.0"?> <!--对于project来说,需要指定一个default属性,说明入口程序是谁,也就是那个任务的name--> <project default="a"> <!--由多个任务组成--> <target name="a"> <!--对于ant,可以进行拷贝、翻译、下载、打包--> <!--输出hello world--> <echo>hello world</echo> </target> <!--也可以定义变量,变量可以定义到外部文件中,但是必须交build.properties--> <property name="abc">hello world</property> <target name="b"> <echo message="${abc}"></echo> </target> </project>
Ant发布tomcat工程
2、执行ant war打包此应用。
3、执行ant deploy–Dtomcat=true将项目发布到tomcat的服务器上。
4、启动tomcat服务器
5、打开IE的地址栏输入: http://localhost:9999/helloworld/services/hello_world?wsdl
或:http://localhost:9999/helloworld/services
6、在命令行执行: antclient-servlet –Dbase.url=http://localhost:9999
或在MyEclipse的WebServiceExplorer中访问这个WebService
7、停止tomcat服务器。
8、卸载应用:antundeploy –Dtomcat=true
9、清空项目:ant clean
用CXF发布webservice
1、导入全部jar包
2、发布webservice需要用到FacotryBean,有两个Serverfactorybean和JaxWsServerfactorybean,建议用第二种JaxWsServerfactorybean,因为JaxWsServerfactorybean继承了Serverfactorybean,用Serverfactorybean发布的webservice即使加上@WebService注解后,生成的wsdl文件也不会全面。但是用JaxWsServerfactorybean发布的webservice,加上@WebService注解后,生成的wsdl文件全面。
//加入@WebService注解后,生成的wsdl文件全面,并且接口上也要加上@WebService注解
@WebService public class JaxWsHelloWorld { public String sayHello(){ System.out.println("服务已经被调用。。。"); return "HelloWorld!"; } public static void main(String[] args) { //创建实现类实例 JaxWsHelloWorldImpl hw = new JaxWsHelloWorldImpl(); JaxWsServerfactorybean server = new JaxWsServerfactorybean(); //设置要发布为webservice的类(传入接口) server.setServiceClass(IJaxWsHelloWorld.class); //设置绑定发布地址 server.setAddress("http://192.168.1.100:9999/helloworld"); //设置发布为webservice的实例 server.setServiceBean(hw); //增加消息拦截器 server.getininterceptors().add(new LoggingInInterceptor()); server.getoutInterceptors().add(new LoggingOutInterceptor()); //创建webservice server.create(); System.out.println("服务已经被创建。。。"); } }
注:对于同Serverfactorybean发布的WebService,客户端可用ClientProxyfactorybean。而用JaxWsServerfactorybean发布的WebService,客户端可用JaxWsProxyfactorybean。但是一般不用这种框架客户端的调用方式,应为高度耦合。
CXF发布Web工程
由于cxf的web项目已经集成了Spring。所以,cxf的服务类都是在spring的配置文件中完成的。
步骤:第一步:建立一个web项目。
第二步:准备所有jar包。将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。
第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
<!-- 配置cxf框架的核心Servlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> 第四步:创建(最好是copy)cxf-servlet.xml文件。这是一个spring的配置文件。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> </beans>
发布一个简单的webservice
在cxf-servlet.xml
<!-- 发布一个简单的webservice
* 使用jaxws:endpoint标签来发布
* id:标签id,唯一的,必要条件
* address:绑定地址,相对地址(相对工程上下文)
* implementor:绑定需要发布为webservice的类路径
-->
<jaxws:endpointid="HelloWorld"address="/helloworld"implementor="app.service.HelloWorld"></jaxws:endpoint>
/* * 在类上也要加入@WebService注解,这样wsdl文件就全面了。 * 但是不用在接口上加注解,由于在配置文件中我们只加入了类的类名,而没引入接口 */ @WebService public class HelloWorld implements IHelloWorld { public String sayHello(){ System.out.println("服务已经被调用。。。"); return "HelloWorld!"; } }
对于客户端的调用也可通过CXF的wsdl2java生成客户代码
在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样
它包含以下参数:-d参数,指定代码生成的目录。-p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。对于1.7的service类中的构造函数是传入三个参数,但是以前的版本传入两个参数,如果用的是低版本的,执行删除报错地方的第三个参数即可。
发布一个复杂的webservice
<!--发布一个复杂的webservice,指定接口--> <jaxws:server id="HelloWorld" address="/helloworld" serviceClass="app.service.IHelloWorld"> <jaxws:serviceBean> <!-- 指明实现类 --> <bean class="app.service.HelloWorld"></bean> </jaxws:serviceBean> </jaxws:server> //这时在类跟接口上都要指定@WebService注解,由于配置文件中都涉及到了 @WebService public class HelloWorld implements IHelloWorld { private List<User> users = new ArrayList<User>(); //增加用户 public void saveUser(User user){ System.out.println(user.getName()); System.out.println(user.getAge()); users.add(user); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。