Web Service学习-CXF与Spring整合为JavaEE应用发布WebService(三)

CXF与Spring整合,分两个方面给大家介绍:

1,在传统ssh项目基础上添加Web Service

赋值CXF的jar包

在web.xml配置文件中导入CXF的核心控制器:CXFServlet

在Spring配置文件中导入CXF提供Schema,xml配置文件

在Spring配置文件中使用jaxws:endpoint元素来暴露Web Service

如果要添加拦截器,在jaxws:endpoint元素里添加

inInterceptors,outInterceptors子元素

2,远程调用Web Service服务(让Action依赖远程Web Service的接口)

复制CXF的jar包

在Spring配置文件中导入CXF提供Schema,xml配置文件

在Spring配置文件中使用jaxws:client元素来配置远程Web Service代理

如果要添加拦截器。在jaxws:client元素里添加

inInterceptors,outInterceptors子元素

第一个方面:提供Web Service的服务

服务端:

项目结构:

在相应的SSH项目中添加CXF的相关jar包:

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>  

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext-common.xml</param-value>
    </context-param>
      <!--所有来自/*的请求,都交由 CXFServlet来处理-->
    <servlet>
        <servlet-name>HelloWorldService</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorldService</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>  

</web-app>

applicationContext-common.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"
    xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  

	<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" />  

    <bean id="helloWorld" class="com.tgb.service.impl.HelloWorldImpl">
    	<property name="userService" ref="userService"></property>
    </bean>  

  <!-- 用户的Service -->
    <bean id="userService" class="com.tgb.service.impl.UserServiceImpl">
    </bean>
	<!-- implementor指定webservice的服务提供者 -->
	<!-- address为wsdl的访问地址 -->
    <jaxws:endpoint id="hello" implementor="#helloWorld" address="/hjy" >
		<!-- 添加了2个In拦截器,如果不添加拦截器可直接注释掉如下代码 -->
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
			<bean class="com.tgb.auth.AuthInterceptor"/>
		</jaxws:inInterceptors>
		<!-- 如果要配置Out拦截器,使用outInterceptors -->
	</jaxws:endpoint>
</beans>

以上配置已经完成,对于接口和相应的实现参考之前的博客即可,实现中对于new的内容使用spring管理起来

HelloWorldImpl:

package com.tgb.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.jws.WebService;

import com.tgb.domain.Cat;
import com.tgb.domain.User;
import com.tgb.service.HelloWorld;
import com.tgb.service.UserService;

@WebService(endpointInterface="com.tgb.service.HelloWorld",serviceName="HelloWorldImpl")
public class HelloWorldImpl implements HelloWorld{

	private UserService userService;

	public UserService getUserService() {
		return userService;
	}

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public String sayHi(String name) {

		return name+"您好!现在时间为:"+new Date();
	}

	@Override
	public List<Cat> getCatsByUser(User user) {
		//在实际项目中,web service组件自己并不会去实现业务功能
		//它只是调用业务逻辑组件的方法来暴露web service
//		UserService us=new UserServiceImpl();

		return userService.getCatsByUser(user);
	}

	@Override
	public Map<String, Cat> getAllCats() {
//		UserService us=new UserServiceImpl();
		return userService.getAllCats();
	}

}

启动tomcat服务器:

访问如下地址:http://192.168.24.215:8080/CXF_Spring_Server

新建客户端项目CXF_Spring_Client,生成客户端代码:

注意:

有些版本拷贝后,类中的super()会出错,要加上-frontendjaxws21,参看如上截图

客户端调用:

package com.tgb.client;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;

import com.tgb.auth.AddHeaderInterceptor;
import com.tgb.service.Cat;
import com.tgb.service.HelloWorld;
import com.tgb.service.User;
import com.tgb.service.impl.HelloWorldImpl;

public class client {

	public static void main(String[] args){
		HelloWorldImpl factory=new HelloWorldImpl();
		//此处返回的只是远程Web Service的代理
		HelloWorld hw=factory.getHelloWorldImplPort();

		/**
		 * 添加的拦截器
		 */
		Client client=ClientProxy.getClient(hw);
		//参数为输入的用户名,密码
		client.getOutInterceptors().add(new AddHeaderInterceptor("hejingyuan","hjy"));

		System.out.println(hw.sayHi("hejingyuan"));
		System.out.println("--------------------------");

		User user=new User();
		user.setId(20);
		user.setName("孙悟空");
		user.setPass("111");
		user.setAddress("花果山");

		List<Cat> cats=hw.getCatsByUser(user);
		for(Cat cat:cats){
			System.out.println(cat.getName());
		}

		System.out.println("--------------------------");

		System.out.println(hw.getAllCats().getEntry().get(0).getKey());
		System.out.println(hw.getAllCats().getEntry().get(0).getValue().getName());

	}
}

由于我们在服务端添加了拦截器,故客户端必须要添加相应的拦截器给服务端提供参数,否则客户端调用失败

另一个方面:调用远程的Web Service服务

新建客户端项目CXF_Spring_Web_Client,生成客户端代码

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="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">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

applicationContext.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"
    xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 

	<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" />

	<bean id="listCatsAction" class="com.tgb.action.ListCatsAction">
		<property name="helloWorld" ref="helloWorld"></property>
	</bean>

	<!-- 配置远程webservice代理 -->
	<!-- id="helloWorld"对应 action setHelloWorld() -->
	<jaxws:client id="helloWorld"
		serviceClass="com.tgb.service.HelloWorld"
		address="http://localhost:8080/CXF_Spring_Server/hjy">
		<jaxws:outInterceptors>
		<!-- 配置输出拦截器  -->
			<bean class="com.tgb.auth.AddHeaderInterceptor" >
				<constructor-arg value="hejingyuan"/>
				<constructor-arg value="hjy"/>
			</bean>
		</jaxws:outInterceptors>
	</jaxws:client>

</beans>

Struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

	<package name="default" namespace="/" extends="struts-default">
		<action name="listCats" class="com.tgb.action.ListCatsAction" >
			<result name="SUCCESS">/WEB-INF/page/listcats.jsp</result>
		</action>
	</package>
</struts>

调用代码:

package com.tgb.action;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;

import com.opensymphony.xwork2.ActionSupport;
import com.tgb.auth.AddHeaderInterceptor;
import com.tgb.service.HelloWorld;

public class ListCatsAction extends ActionSupport{

	private HelloWorld helloWorld;

	public HelloWorld getHelloWorld() {
		return helloWorld;
	}

	public void setHelloWorld(HelloWorld helloWorld) {
		this.helloWorld = helloWorld;
	}

	@Override
	public String execute() throws Exception {
		/**
		 * 添加的拦截器
		 */
		Client client=ClientProxy.getClient(helloWorld);
		//参数为输入的用户名,密码
		client.getOutInterceptors().add(new AddHeaderInterceptor("hejingyuan","hjy"));
		helloWorld.sayHi("hejingyuan");
		return "SUCCESS";
	}

}

最终的项目结构:

总结:

以上与Spring的整合,概括的说,在应用Spring的框架过程中,一种是我们如何对外提供服务,另一种是我们如何获取已经提供好的服务。在整个过程中,只有几个关键点,很简单,但是要注意jar包的版本问题。

源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 10:20:41

Web Service学习-CXF与Spring整合为JavaEE应用发布WebService(三)的相关文章

Web Service (四) 手动发布Web Service接口-CXF与Spring集成

当我们发布完Web Service接口之后有两种方式可以调用Web service服务,一种是通过动态客户端方式,另一种是引用服务端的接口,引用服务端接口的方式对于客户端同服务器端耦合比较大,而使用WSDL的方式客户端不知道服务端的存在就可以调用服务器的方法. 下面是项目的结构图: 1.Web Service发布项目 2.编写服务端接口类以及实现类,如下,同上一篇自动发布接口,多了一个注解@WebService package com.test.webservice; import javax.

Web Service学习-CXF开发Web Service实例demo(一)

Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样调用问题.比如.有一个C语言写的程序.它想去调用java语言写的某个方法. 集中解决:1,远程调用 2.跨平台调用 3,跨语言调用 实际应用: 1.同一个公司的新,旧系统的整合.Linux上的java应用,去调用windows平台的C应用 2,不同公司的业务整合.业务整合就带来不同公司的系统整合.不

Web Service学习-CXF开发Web Service的权限控制(二)

Web Service如何进行权限控制? 解决思路:服务器端要求input消息总是携带有用户名,密码信息,如果没有用户名和密码信息,直接拒绝调用 解决方案:拦截器 为了让程序员能访问,并修改CXF框架所生成的SOAP消息,CXF提供了拦截器 CXF(Celtix +XFire)说明: 如果不用CXF等框架,SOAP消息的生成,解析都是由程序员负责.无论是添加用户名,密码信息还是提取用户名,密码信息,都可由程序员代码完成. 如果使用CXF等框架,SOAP消息的生成,解析都是由CXF等框架来完成.

分布式系统(3)---Web Service实战--CXF理论篇

第一篇:CXF理论篇 在Java领域,WebService的框架很多,例如:AXIS,XFire,CXF等.AXIS,XFire相对比较成熟. Axis全程Apache Extensible Interaction System即Apache可扩展交互系统.是第三代Apache SOAP.本质上就是一个SOAP引擎,但不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎的服务器. XFire是新一代的Java Web服务引擎,可以非常容易地和Spring集成.是c

Web Service学习之一:Web Service原理

一.定义 Web Service 不是框架也不是技术 而是解决远程调用.跨平台调用.跨语言调用问题的一种规范. 二.应用1.同一个公司新.旧系统的整合:比如CRM系统与OA.客服系统相互调用2.不同公司的业务组合:比如淘宝与物流公司信息平台调用3.内容聚合:比如天气预报.股市行情.新闻信息等 需要不同平台获取相关信息 三.web service 框架Axis(Apache)-->Axis2(Apache)XFire --> Celtrix(ESB框架) + XFire(web service框

webservice的cxf和spring整合发布

1.新建一个web项目 2.导入cxf相应的jar包,并部署到项目中 3.服务接口 1 package com.xiaostudy; 2 3 /** 4 * @desc 服务器接口 5 * @author xiaostudy 6 * 7 */ 8 public interface Test_service { 9 10 public String getNumber(String number); 11 12 } 4.服务接口实现类 1 package com.xiaostudy; 2 3 im

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

Android Web Service学习总结(二)

上篇文章做好了准备工作,现在就实践(android平台调用web service实现号码归属地查询) 1.    Ksoap2-android简介 在Android平台调用web service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP).在Android平台中我们并不会直接使用ksoap2,而是使用ksoap2 android.KSoap2 Androi

Web Service学习之服务端搭建与客户端调用

?工作中用到了Web Service,但是对这块不是很熟悉,决定花时间学习一下,现在记录一下最基本的入门知识点. 使用Java搭建Web Service服务端,使用Python脚本调用接口. 一.Web Service服务端 1.在Eclipse中新建一个Java工程,新建test.TestWebService类 package test; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public