WebService:CXF发布Web项目
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>
l
http://localhost:9999/cxf_spring/ws
CXFServlet
l
CXFServlet
类,通过读取
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); ? } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |