发布复杂的WebService

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);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值