您的位置:首页 > 其它

WebService:CXF发布Web项目

2015-12-15 07:55 351 查看
l由于cxf的web项目已经集成了Spring所以,cxf的服务类都是在spring的配置文件中完成的。以下是步骤:
l第一步:建立一个web项目。
l第二步:准备所有jar包。将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。
l第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
l第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。

在web.xml中配置

<?xmlversion="1.0" encoding="UTF-8"?>

<web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>

<!--
配置cxf -->


<servlet-name>cxf</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<init-param>

<!-- 配置Spring的配置文件,默认就是这儿
-->


<param-name>config-location</param-name>

<param-value>/WEB-INF/cxf-servlet.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>cxf</servlet-name>

<url-pattern>/ws/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

cxf-servlet.xm

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="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/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/corehttp://cxf.apache.org/schemas/core.xsd">
<!-- 引入CXFBean定义如下,早期的版本中使用,

导入的三个配置文件都在cxf.jar的META文件夹中

-->
<import resource="classpath:META-INF/cxf/cxf.xml"/>

<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>

<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

<!--
直接发布一个类,无接口 -->

<jaxws:endpointid="one"
implementor="cn.itcast.ws1.OneService"


address="/one">

</jaxws:endpoint>


<!-- 发布一个服务,没有指定接口 --

<!-- 声明方式说明:

serviceClass:必须为一个接口,

并在接口上必须使用@WebService注解否则调用时会抛出异常

serviceBean:是实际服务的类,必须是serviceClass的子类

此类上面即可以使用@WebService注解,也可以不使用

address:访问地址,省去前面的ip:port.

注意在此注册的类,必须要添加@WebService的注解

-->

>

<jaxws:serverid="two"
address="/two" serviceClass="cn.itcast.ws2.ITwoService">

<jaxws:serviceBean>


<!-- 指定发布类,下面类必须添加@WebService注解
-->


<beanclass="cn.itcast.ws2.TwoServiceImpl"></bean>

</jaxws:serviceBean>

</jaxws:server>

</beans>

lhttp://localhost:9999/cxf_spring/ws

CXFServlet

lCXFServlet类,通过读取config-location的配置项读取cxf-servlet.xml配置文件。并在内部读取自己的配置文件cxf.xml文件。
l在CXFServlet读取配置文件后,将文件信息全部读取到ApplicationContext的Spring类中。
以下是它的源代码:



添加 拦截器

<!-- 声明方式说明:

serviceClass:必须为一个接口,

并在接口上必须使用@WebService注解否则调用时会抛出异常

serviceBean:是实际服务的类,必须是serviceClass的子类

此类上面即可以使用@WebService注解,也可以不使用

address:访问地址,省去前面的ip:port.

注意在此注册的类,必须要添加@WebService的注解

-->

<jaxws:server id="one"

serviceClass="cn.one.IOneService"

address="/one">

<jaxws:inInterceptors>


<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>


</jaxws:inInterceptors>


<jaxws:outInterceptors>


<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>


</jaxws:outInterceptors>

<jaxws:serviceBean>

<bean class="cn.one.OneService"></bean>

</jaxws:serviceBean>

</jaxws:server>

客户端调用

l使用纯Java项目调用
•1、根据客户端生成的代码来调用。(优选这种方式)
•请先生成然后在任意的Java项目中调用 。
•2、客户端只拥有一个接口,使用JaxWsProxyFactoryBean来调用。
•因为以下使用了JaxWsProxyFactoryBean,所以,仍然需要CXF的环境,而使用此环境就会造成Jar文件的大量冗余,所以大家要谨慎选择。

JaxWsProxyFactoryBean client =

newJaxWsProxyFactoryBean();

client.setAddress("http://localhost:7777/xcxf2_web/ws/one");

client.setServiceClass(IOneService.class);

IOneService one =
client.create(IOneService.class);

String ss =
one.sayHi("OK你好");

System.err.println(ss);

在Spring项目中,通过配置文件调用

•新建立一个Java项目,并加载cxf的所有包。
•只需要生成的接口文件。
•在classpath下新建立一个ClientBeans.xml文件.

•优点与缺点:
•此种情况,适合于一个Javaweb项目已经集成了Spring。并希望通过CXF配置的方式调用Web服务。
•此种情况,仍然需要导入CXF的大量jar包。
•这种情况也存在一定人优点,如可以将外部的Web服务通过配置文件注入(DI)到Action类中。



1、说明:IHelloWorld.java是通过wsimport生成的接口,我们只需要这个接口。

2、CxfJavaClient.java包含main方法,用于通过ClientBeans.xml文件,调用WebService。

3、源代码:

package com.itcast.cxf.first;

import javax.jws.WebService;

/**

* 如果没有改变包名的情况下,可以只使用@WebService注解。

* 如果修改了包名则应该使用

* @WebService(name="IHelloWorld",targetNamespace="http://wj.com")

* 所以,对于此类,仍然建议使用wsimport或wsdl2java生成。

* (仅需要此接口,其他类,不需要)

* @author wangjianme

*

*/

@WebService

publicinterface IHelloWorld {

public String sayHello(Stringname);

}

以下是ClientBeans.xml的文件的源代码:

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="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/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/corehttp://cxf.apache.org/schemas/core.xsd">
<jaxws:client
id="helloClient"

address="http://127.0.0.1:9999/cxf2.4_spring_web/ws/helloworld"

serviceClass="com.itcast.cxf.first.IHelloWorld">

</jaxws:client>

</beans>

1、以下是CxfJavaClient.java的源代码:

package com.itcast.cxfweb.java.client;

import org.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

import com.itcast.cxf.first.IHelloWorld;

/**

* Java项目的客户端

* @author wangjianme

*/

publicclass CxfJavaClient {

public static void main(String[]
args) {

//读取配置文件

ApplicationContextctx =

new ClassPathXmlApplicationContext("ClientBeans.xml");

//get到接口类型并调用

IHelloWorld hello =(IHelloWorld)ctx.getBean("helloClient");

String str =
hello.sayHello("WJ");

System.err.println(str);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: