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工程
1、执行ant clean清除以前生成的代码
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
发布一个简单的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);
}
}