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);
}
}
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);
}
}
相关文章推荐
- Neville 插值方法
- Kafka消息delivery可靠性保证(Message Delivery Semantics)
- [MSSQL]服务器端压力过大导致SSMS异常
- 在Unity3D中使用ScriptableObject进行序列化
- php支持生僻字的汉字转拼音类
- Leetcode 153: Find Minimum in Rotated Sorted Array
- ES6学习——ES6背景介绍
- 298. Binary Tree Longest Consecutive Sequence
- 暗网背后那些明目张胆的地下黑色产业
- 举例数据库sqlite3的使用
- Xsolla与Ubisoft游戏Rainbow Six Siege 和刺客信条:辛迪加展开战略合作
- 297. Serialize and Deserialize Binary Tree
- PHP学习1-Mac OS X环境配置和PHP介绍
- [LeetCode]Number of Islands II
- EF+MVC+Bootstrap 项目实践 Day7
- (转)新手学习System Verilog & UVM指南
- 从头认识java-13.8 类型擦除的问题与解决
- Python中通过多个字符分割(split)字符串的方法
- Leetcode 11: Container With Most Water
- Linux_Rsync远程同步备份服务器