加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WEBSERVICE之CXF服务端与客户端配置(初级应用,本人才疏学浅啊)

发布时间:2020-12-17 00:23:39 所属栏目:安全 来源:网络整理
导读:CXF实现与Spring整合访问,实现客户端与服务端之间的通信:通信过程中的bean必须序列化,才能在网络中传输 客户端: 一、通过手动+配置方式实现: 配置web.xml:如果只作为客户端,只需要配置加载spring配置文件部分即可,当作为服务端时,才需要!-- webservi
CXF实现与Spring整合访问,实现客户端与服务端之间的通信:通信过程中的bean必须序列化,才能在网络中传输 客户端: 一、通过手动+配置方式实现: 配置web.xml:如果只作为客户端,只需要配置加载spring配置文件部分即可,当作为服务端时,才需要<!-- webservice 配置 -->配置部分 <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- webservice 配置? <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> 貌似是可有可无 <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> ? <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> --> 配置applicationContext-ws-client.xml: <?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:cxf="http://cxf.apache.org/core" xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="byType" default-lazy-init="true"> ? <description>WebService客户端配置</description> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <!--? <jaxws:client id="userService" serviceClass="com.creditease.oa.manager.IUserWebService" address="${smp.url}/services/userService"> </jaxws:client>? --> <!--? 在客户端一方,获得一个该接口声明,调用接口方法,通过配置文件,找到address服务端对应的接口 address为服务地址 ?--> <jaxws:client id="capticalAssetService" serviceClass="com.creditease.oa.manager.ICapticalAssetService" address="http://10.105.18.96:8081/easext/webservices/capticalAsset"> </jaxws:client> </beans> 客户端实现类获取服务接口的方式: //ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext-ws-client.xml" }); //ICapticalAssetService capticalAssetService = (ICapticalAssetService) context.getBean("capticalAssetService"); 二、通过手动+不配置方式: public class ITestServiceTest { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); ? factory.setServiceClass(ITestService.class); ? factory.setAddress("http://localhost:8080/webServicecxf/webservices/testService"); 客户端实现类获取服务接口 ITestService service = (ITestService)factory.create(); ? String result = service.helloWord("good");? } } 三、通过自动生成方式:通过myeclipse自动生成客户端 生成的客户端文件包名为服务端接口实现类定义的命名空间名 客户端生成的服务接口提供类为:名称=targetNamespace命名空间名+portName+Service,这个类会继承Service类 public class AutoTest { public static void main(String[] args) { //继承了Service的类new一个对象 TestServiceImplService ts = new TestServiceImplService(); //客户端实现类获取服务接口,如果服务端接口实现类配置了portName="serviceImpl",则getPort()为getServiceImpl() ITestService service = ts.getPort(); String str = service.helloWord("ok"); } } 方式一、方式二需要在客户端建立与服务端相同的接口、bean以及提供相关的jar包,方式三会自动生成接口文件以及bean文件 @WebService(targetNamespace="payment") public interface IPaymentService { public List<CapticalAssetsBean> queryAssetsClassNameAndCodeByFistClass(String first_class); public ?List<CapticalAssetsBean> queryMeasureUnitInfo(); } public class CapticalAssetsBean implements Serializable { private String name; private String code; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } } 服务端:需要配置web.xml、applicationContext*.xml 配置web.xml: <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--貌似是可有可无 <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/applicationContext*.xml</param-value> </context-param> <!-- webservice 配置 --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <!-- 貌似是可有可无 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> ? <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> 配置applicationContext-ws-server.xml: <?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" > <!--配置实现的原理:定义一个接口实现类bean,然后在配置一个终端,实现拦截的请求与此接口实现类连接--> <bean id="_deptWebService" class="com.creditease.oa.manager.impl.DeptWebServiceImpl" /> <jaxws:endpoint id="deptService" address="/deptService"> <jaxws:implementor ref="_deptWebService" /> <!--? <jaxws:inInterceptors> <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> <property name="properties"> <map> <entry key="action" value="UsernameToken" /> <entry key="passwordType" value="PasswordText" /> <entry key="passwordCallbackRef" value-ref="serverValidateCallback" /> </map> </property> </bean> </jaxws:inInterceptors> --> </jaxws:endpoint> <!-- 下面这两个bean以及参数??? --> <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" />? <bean id="jaxWsServiceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" scope="prototype"> <property name="wrapped" value="true" /> <property name="dataBinding" ref="aegisBean" /> </bean> <!-- implementor="#myTestService"指向接口实现类bean(jquery中的$("#id")使用) ,address="/testService"就相当于action的name作用 --> <bean id="myTestService" class="com.cxf.TestServiceImpl"></bean> <jaxws:endpoint id="testService" implementor="#myTestService" address="/testService"> ?<jaxws:serviceFactory> <ref bean="jaxWsServiceFactoryBean" /> ?</jaxws:serviceFactory> </jaxws:endpoint> <!-- 测试 第二种方式,通过Spring创建数据绑定的类现在一般都是使用这种方式-->? <bean id="my" class="com.cxf.MyTestServiceImpl"></bean> <jaxws:server id="myWebService" serviceClass="com.cxf.IMyTestService" address="http://localhost:1111/services/testService"> <jaxws:serviceBean> ? ?<ref bean="my"/> </jaxws:serviceBean> </jaxws:server> <!-- 这里需要导入cxf的xml文件 --> <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-extension-http-jetty.xml"/>? </beans> 请求url的组成部分:http://localhost:80/webServicecxf/webservices/testService ? webServicecxf:是项目名 ? /webservices/:在服务端的web.xml文件中servlet的pattern-url拦截的就是/webservices/* ? /testService:在服务端的applicationContext*.xml配置文件中,服务终端的address就是/testService 整个请求的流程走向:客户端进行业务操作,调用接口,在客户端的applicationContext*.xml配置文件中serviceClass定义的就是该接口,而address定义的服务端访问url ? ?请求会被服务端的web.xml的pattern-url拦截,然后找到服务端的applicationContext*.xml文件,其中address为对应url的尾部,通过address找到 ? ?implementor所指向的服务接口实现类

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读