1.什么是CXF
3.使用ant打包发版
在这之前,请确认上述环境变量配置完成
用ANT将它发布到Tomcat服务器上:
http://localhost:9999/helloworld/services/hello_world?wsdl
或:http://localhost:9999/helloworld/services
在项目中导入CXF中的所有jar文件
package cn.itcast.cxf;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.cxf.frontend.ServerFactoryBean;
/**
* 使用ServerFactoryBean 发版WebService服务
* @author wangz_ing
*
*/
public class HelloService {
/**
* @param args
*/
public static void main(String[] args) {
ServerFactoryBean bean = new ServerFactoryBean();
//服务的发布地址
bean.setAddress("http://127.0.0.1:6789/hello");
//提供服务的类型
bean.setServiceClass(HelloService.class);
//提供服务的实例
bean.setServiceBean(new HelloService());
//发布服务
bean.create();
System.out.println("Server ready..");
}
public String sayHello(String name){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHello...."+name);
return sdf.format(new Date())+ " hello " +name;
}
}
package cn.itcast.cxf;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.jws.WebService;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**
* 使用JaxWsServerFactoryBean发布服务
* @author wangz_ing
* 必须加入WebService注解,如果不加,虽然不报错,但所有的方法都暴露不出来
*/
@WebService
public class HiService {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//服务的发布地址
bean.setAddress("http://127.0.0.1:7789/hi");
//提供服务的类型
bean.setServiceClass(HiService.class);
//提供服务的实例
bean.setServiceBean(new HiService());
//发布服务
bean.create();
System.out.println("Server ready..");
}
public String sayHi(String name){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHi...."+name);
return sdf.format(new Date())+ " hi: " +name;
}
}
上述服务端服务发布成功之后,下面怎么在服务端调用服务端的方法呢?
CXF中提供了对应的客户端调用方法,ServerFactoryBean--->ClientProxyFactoryBean;JaxWsServerFactoryBean-->JaxWsProxyFactoryBean;
下面我们可以运用标准的编码规范进行服务端代码的编写,包括对应的接口,实现类,而不是所以的方法都写在一个类里
(如果不是使用spring的配置文件发布,可以没有接口文件,但在任何情况下建议拥有接口文件。如果使用spring的配置文件发布,则必须拥有接口类)
接口:
package cn.itcast.cxf;
import javax.jws.WebService;
@WebService
public interface IHelloService {
public String sayHello(String name);
}
实现类:
package cn.itcast.cxf;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloServiceImpl implements IHelloService{
@Override
public String sayHello(String name) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHello...."+name);
return sdf.format(new Date())+ " hello: " +name;
}
}
服务端发布方法:
package cn.itcast.cxf;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**
* 使用JaxWsServerFactoryBean发布服务
* @author wangz_ing
* 必须加入WebService注解,如果不加,虽然不报错,但所有的方法都暴露不出来
*/
public class Server {
/**
* @param args
*/
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//服务的发布地址
bean.setAddress("http://127.0.0.1:7788/hi");
//提供服务的类型或接口类型,建议使用接口
bean.setServiceClass(IHelloService.class);
//提供服务的实例
bean.setServiceBean(new HelloServiceImpl());
//加入请求的消息拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
bean.getInInterceptors().add(new LoggingOutInterceptor());
//发布服务
bean.create();
System.out.println("Hello service ready..");
}
}
值得注意的是,此方法中加入了消息拦截器,
给服务器添加拦截器,类似于使用TCP/IP Monitor来捕获SOAP消息的过程
加入拦截器后,可以在控制台看到对应的请求内容,控制台输出内容为:
2015-8-19 17:00:19 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Address: http://127.0.0.1:7788/hi?wsdl
Http-Method: GET
Content-Type:
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1:7788], User-Agent=[Java/1.6.0_43]}
--------------------------------------
2015-8-19 17:00:20 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 2
Address: http://127.0.0.1:7788/hi
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml;charset="utf-8"
Headers: {Accept=[text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Length=[194], content-type=[text/xml;charset="utf-8"], Host=[127.0.0.1:7788], Soapaction=[""], User-Agent=[JAX-WS RI 2.1.6 in JDK 6]}
Payload: <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:sayHello xmlns:ns2="http://cxf.itcast.cn/"><arg0>aa</arg0></ns2:sayHello></S:Body></S:Envelope>
--------------------------------------
可以看到使用代码方式调用服务端方法时,一次调用,两次请求,先是get'方法判断是否查询到对应的wsdl文件,若可以,则利用post请求再次发出请求,
利用aja调用时,只有一次post请求