`

CXF方式发布WebService全步骤。

    博客分类:
  • SOAP
阅读更多

        发布webService有多种方式,不过企业中最常用的还是 以 CXF 的方式。

接下来,我来诉说以下 CXF方式 发布WebService的全步骤,供新朋友参考。

 

1:准备的包: cxf-bundle-2.1.3.jar  |   wss4j-1.5.4.jar   |  axis-1.4.jar

2: 创建WebService 接口,范例代码如下:

package com.transnal.ws;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import com.transnal.user.model.ProfileValue;  //根据自己设定,我就不删了
import com.transnal.user.model.UserDTO;   //最好你也创建一个DTO

/**
 *  说明:对内 用户模块   webservice接口 
 *  ****************** 
 *  日期        人员 
 *  2010-11-1 RenWeigang */
@WebService
public interface UserService {

	@WebResult(name="msg")
	public int  login(@WebParam(name="userName")String userName,@WebParam(name="password")String password);
	
	@WebResult(name="msg")
	public String register(@WebParam(name="userName")String userName,@WebParam(name="password")String password,@WebParam(name="email")String email)throws Exception;

	@WebResult(name="msg")
	public boolean verifyUserByUserNameAndPassword(@WebParam(name="userName")String userName,@WebParam(name="password")String password);
	
	@WebResult(name="userDTO")
	public UserDTO getUserByUserName(@WebParam(name="userName")String username);
	
	@WebResult(name="msg")
	public String userEdit(@WebParam(name="userName")String userName, @WebParam(name="email")String email,
			@WebParam(name="nickName")String nickName,@WebParam(name="realName")String realName,@WebParam(name="sex")int sex,@WebParam(name="birthday")String birthday,@WebParam(name="mobile")String mobile);	
	
	@WebResult(name="result")
	public boolean verifyEmail(@WebParam(name="email")String email);
	@WebResult(name="result")
	public boolean verifyUser(@WebParam(name="userName")String userName);
	
	@WebResult(name="msg")
	public String resetPassword(@WebParam(name="userName")String userName,@WebParam(name="newPassowrd")String newPassword);

	@WebResult(name="msg")
	public String changePassword(@WebParam(name="userName")String userName,@WebParam(name="oldPassword")String oldPassword,
			@WebParam(name="newPassword")String newPassword);
	
	@SuppressWarnings("unchecked")
	public void updateUserProperties(@WebParam(name="userName")String userName, @WebParam(name="userProperties")List<ProfileValue> values);
	
	@SuppressWarnings("unchecked")
	@WebResult(name="ProfileValue")
	public ProfileValue getUserProperties(@WebParam(name="userName")String userName, @WebParam(name="key")String key);
	
}

 

 

3: 创建 WebService 接口实现类,代码如下:

package com.transnal.openplatform.ws.user;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.jws.WebService;

import net.sxinfo.common.enums.Sex;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.EmailValidator;

import com.transnal.profile.model.Profile;
import com.transnal.profile.model.ProfileInfo;
import com.transnal.user.entity.UserEntity;
import com.transnal.user.exceptions.AuthenticationException;
import com.transnal.user.model.ProfileValue;
import com.transnal.user.model.User;
import com.transnal.user.model.UserDTO;
import com.transnal.user.service.UserRemote;
import com.transnal.web.ProfileExtInfo;
import com.transnal.web.UserFactory;
import com.transnal.ws.UserService;

/**
 * 说明:用户webservice实现 
 * ****************** 
 * 日期 人员 2010-11-1 RenWeigang
 */
@WebService(endpointInterface = "com.transnal.ws.UserService", serviceName = "userService")
public class UserServiceImpl implements UserService {
	@Override
	public UserDTO getUserByUserName(String username) {
		UserDTO dto = new UserDTO();

		UserEntity entity = (UserEntity) UserFactory.getUserRemote(null)
				.findUser(username);
		dto.setUserId(entity.getUserId());
		dto.setUserName(entity.getUserName());
		dto.setEmail(entity.getEmail());
		dto.setAnswer(entity.getAnswer());
		dto.setQuestion(entity.getQuestion());
		dto.setApproved(entity.getApproved());
		dto.setLockedOut(entity.getLockedOut());
		dto.setLastLockoutDate(entity.getLastLoginDate());
		dto.setFailedCount(entity.getFailedCount());
		dto.setFailedAnswerCount(entity.getFailedAnswerCount());
		dto.setFailedAnswerDate(entity.getFailedDate());
		dto.setFailedDate(entity.getFailedDate());
		dto.setLastPwdChange(entity.getLastPwdChange());
		dto.setPassword(entity.getPassword());
		dto.setLastLoginDate(entity.getLastLoginDate());
		dto.setPwdFormat(entity.getPwdFormat().name());
		Profile profile = UserFactory.getProfileRemote(null).findUserByName(
				username);
		ProfileExtInfo profileInfo = new ProfileExtInfo(UserFactory
				.getPropertySetAccessor(), profile);
		dto.setRealName(profile.getRealName());
		if(null!=profileInfo.getBirthday()){
			Date birthday = profileInfo.getBirthday();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			dto.setBirthday(sdf.format(birthday));			
		}
		if(StringUtils.isNotEmpty(profileInfo.getMobile())){
			dto.setMobile(profileInfo.getMobile());
		}
		dto.setSex(profileInfo.getSex().ordinal());
		dto.setNickName(profileInfo.getNickName());

		return dto;
	}

	public String register(String userName, String password, String email)
			throws Exception {
		// 判断 用户名是否重复
		if (UserFactory.getUserRemote(null).findUser(userName) != null) {
			return Constants.userNameExist;
		}
		if (!EmailValidator.getInstance().isValid(email)) {
			return Constants.emailIsNotValid;
		}
		// 判断用户email是否被注册
		if (UserFactory.getUserRemote(null).checkEmail(email)) {
			return Constants.emailExist;
		}
		User user = UserFactory.getUserRemote(null).createUser(userName,
				password, email, null, null);
		if (user == null) {
			return Constants.registFail;
		}
		UserFactory.getRoleRemote(null).addRoleToUser(userName, "guest");

		return Constants.registSuccess;
	}

	@Override
	public String changePassword(String userName, String oldPassword,
			String newPassword) {
		UserRemote userRemote = UserFactory.getUserRemote(null);
		if (userRemote.findUser(userName) == null) {
			return Constants.userNotFound;
		}
		if (StringUtils.isBlank(newPassword)
				&& StringUtils.isBlank(oldPassword)) {

			return Constants.passwordIsRequired;
		}
		if (!userRemote.verify(userName, oldPassword)) {
			return Constants.oldPasswordIsNotValid;
		}

		try {
			userRemote.changePwd(userName, oldPassword, newPassword);
		} catch (AuthenticationException e) {
			return Constants.changePasswordFail;
		}
		return Constants.changePasswordSuccess;
	}

	@Override
	public boolean verifyEmail(String email) {
		if (UserFactory.getUserRemote(null).checkEmail(email)) {
			return true;
		}
		return false;
	}

	@Override
	public boolean verifyUser(String userName) {
		// 判断 用户名是否重复
		if (UserFactory.getUserRemote(null).findUser(userName) != null) {
			return true;
		}
		return false;
	}
	
	@Override
	public String userEdit(String userName, String email, String nickName,
			String realName, int sex, String birthday, String mobile) {
		// email 格式
		if (!EmailValidator.getInstance().isValid(email)) {
			return Constants.emailIsNotValid;
		}
		// 是否占用
		if (!UserFactory.getUserRemote(null).isValidEmail(userName, email)) {
			return Constants.emailExist;
		}
		// 修改信息
		UserFactory.getUserRemote(null).updateUser(userName, email);
		Profile profile = UserFactory.getProfileRemote(null).findUserByName(
				userName);
		if(StringUtils.isNotBlank(realName)){
			profile.setRealName(realName);	
		}
		ProfileExtInfo profileInfo = new ProfileExtInfo(UserFactory
				.getPropertySetAccessor(), profile);
		if(StringUtils.isNotBlank(nickName)){
			profileInfo.setNickname(nickName);
		}

		switch (sex) {
		case 1:
			profileInfo.setSex(Sex.male);
			break;
		case 2:
			profileInfo.setSex(Sex.famale);
			break;
		default:
			profileInfo.setSex(Sex.unknown);
			break;
		}

		if(StringUtils.isNotBlank(birthday)){
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			try {
				profileInfo.setBirthday(sdf.parse(birthday));
			} catch (ParseException e) {
				System.out.println("设置生日出错!!!!!!!");

				profileInfo.setBirthday(new Date());
				// e.printStackTrace();
			}			
		}
		
		if(StringUtils.isNotBlank(mobile)){
			profileInfo.setMobile(mobile);
		}
		
		UserFactory.getProfileRemote(null).storeUser(profile);
		UserFactory.getProfileRemote(null).storeUser(profileInfo);

		return Constants.userEditSuccess;
	}

	@Override
	public String resetPassword(String userName, String newPassword) {
		if (StringUtils.isBlank(userName)) {
			return Constants.usernameIsRequired;
		}
		User user = UserFactory.getUserRemote(null).findUser(userName);
		if (null == user) {
			return Constants.userNotFound;
		}

		String username = UserFactory.getUserRemote(null).resetPwd(
				user.getUserName(), newPassword);
		if (username == null) {
			return Constants.oldPasswordIsNotValid;
		}

		return Constants.resetPasswordSuccess;
	}

	@Override
	public boolean verifyUserByUserNameAndPassword(String userName,
			String password) {
		return UserFactory.getUserRemote(null).verify(userName, password);
	}

	@Override
	public int login(String userName, String password) {

		// 登录验证
		try {
			System.out.println("1");
			User user = UserFactory.getUserRemote(null).login(userName, password);
			System.out.println(user.getUserName());
			
			System.out.println("2");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("3");
			if (e instanceof com.transnal.user.exceptions.BadUserNameOrPasswordAuthenticationException) {
				return -1;
			} else if (e instanceof com.transnal.user.exceptions.DisableUserAuthenticationException) {
				return -2;
			} else if (e instanceof com.transnal.user.exceptions.NotApprovedAuthenticationException) {
				return -3;
			} else if (e instanceof com.transnal.user.exceptions.BadPasswordAuthenticationException) {
				return -4;
			}
		}

		return Constants.authenticateSuccess;
	}

	@SuppressWarnings("unchecked")
	public void updateUserProperties(String userName, List<ProfileValue> values) {

		Profile profile = UserFactory.getProfileRemote(null).findUserByName(
				userName);
		UserFactory.getProfileRemote(null).storeUser(profile);
		// 其他属性
		ProfileInfo info = new ProfileInfo(
				UserFactory.getPropertySetAccessor(), profile);
		for (ProfileValue value : values) {

			if (value.getValue() instanceof java.lang.Integer) {
				info.setProperty(value.getKey(), Integer.parseInt(value
						.getValue().toString()));
			} else if (value.getValue() instanceof java.lang.Long) {
				info.setProperty(value.getKey(), Long.parseLong(value
						.getValue().toString()));
			} else if (value.getValue() instanceof java.lang.Double) {
				info.setProperty(value.getKey(), Double.parseDouble(value
						.getValue().toString()));
			} else if (value.getValue() instanceof java.lang.Boolean) {
				info.setProperty(value.getKey(), Boolean.parseBoolean(value
						.getValue().toString()));
			}

			else if (value.getKey().equals("birthday")) {
				Date date = null;
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				try {
					String a = value.getValue().toString();
					date = sdf.parse(a);

				} catch (ParseException e) {
					e.printStackTrace();
				}
				info.setProperty(value.getKey(), date);
			}

			else {
				info.setProperty(value.getKey(), value.getValue());
			}

		}
	}

	@SuppressWarnings("unchecked")
	public ProfileValue getUserProperties(String userName, String key) {

		Profile profile = UserFactory.getProfileRemote(null).findUserByName(
				userName);

		UserFactory.getProfileRemote(null).storeUser(profile);

		ProfileInfo info = new ProfileInfo(
				UserFactory.getPropertySetAccessor(), profile);

		ProfileValue value = new ProfileValue();

		value.setKey(key);
		
		//根据不同的类型设置不同的value
		if (value.getValue() instanceof java.lang.Integer) {
			value.setValue(info.getPropertySet().getInt(key));

		} else if (value.getValue() instanceof java.lang.Long) {
			value.setValue(info.getPropertySet().getLong(key));

		} else if (value.getValue() instanceof java.lang.Double) {

			value.setValue(info.getPropertySet().getDouble(key));
		} else if (value.getValue() instanceof java.lang.Boolean) {
			value.setValue(info.getPropertySet().getBoolean(key));

		}
		else if (value.getKey().equals("birthday")) {
			Date date = null;
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			try {
				String a = value.getValue().toString();
				date = sdf.parse(a);
				value.setValue(date);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		else {
			value.setValue(info.getPropertySet().getString(key));
		}
		return value;
	}
}

 

 

4: 为所发布的WebService指定角色,代码如下:

package com.transnal.openplatform.ws.security;

import java.util.Arrays;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.WSSecurityException;
import com.transnal.user.entity.UserEntity;
import com.transnal.web.UserFactory;


public class PasswordHandler implements CallbackHandler {

                 //凡是角色为 ws  的用户 才可访问你的这个 WebService
	private static final String ROLE_SERVICES="ws";
	
	public void handle(Callback[] callbacks) throws WSSecurityException {

		WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];
		String userName = callback.getIdentifer();
	
		//判断角色
		String[] roles=UserFactory.getRoleRemote(null).findByUser(userName);
        if(!Arrays.asList(roles).contains(ROLE_SERVICES)){
        	throw new WSSecurityException(String.format("not '%s' role privilege ", ROLE_SERVICES));
        }
		
		if (WSConstants.PASSWORD_TEXT.equals(callback.getPasswordType())) {
			String pw = callback.getPassword();
			if (!UserFactory.getUserRemote(null).verify(userName, pw)) {
				throw new WSSecurityException("password not match");
			}
		} else {
			UserEntity user = (UserEntity)UserFactory.getUserRemote(null).findUser(userName);
			callback.setPassword(user.getPassword());
		}

	}

}

 

4: 在 WEB-INF下添加一个apache-cxf.xml 的配置文件,xml文件如下(注意:WebService的接口实现类以及WebService的用户角色类都在此配置中加入.):

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

	<!--  CXF ,此处是配置发布的 web service -->

	<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="utWss4jInHandler" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
		<constructor-arg>
			<map>
				<entry key="action" value="UsernameToken Timestamp" />
				<entry key="passwordType" value="PasswordText" />
				<entry key="passwordCallbackClass"
					value="com.transnal.openplatform.ws.security.PasswordHandler" />
			</map>
		</constructor-arg>
	</bean>

	<!--
		id指 在spring配置的bean的Id implementor 指具体的实现类 address 指明这个web service的相对地址
	-->
	<jaxws:endpoint id="userService"
		implementor="com.transnal.openplatform.ws.user.UserServiceImpl"
		 address="/userService">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
			<ref bean="utWss4jInHandler" />
		</jaxws:inInterceptors>
	</jaxws:endpoint>
</beans>

 5: 在 WEB-INF下的 web.xml 文件中加入 CXF 的配置,范例如下:

<?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" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>用户管理中心</display-name>
  <description>ucmange admin</description>
 
	<!-- 环境参数配置 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/apache-cxf.xml
		</param-value>
	</context-param>

	<!-- CXF -->	
	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>
			org.apache.cxf.transport.servlet.CXFServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup> 
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/ws/*</url-pattern>
	</servlet-mapping>

  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

     注意web.xml文件中配置的 servlet 的 <url-pattern>/ws/*</url-pattern> ,和 在 apache-cxf.xml文件中配置的 address="/userService" 。

     上面的红色 标题 说明的是在 浏览器中访问的webservice 的 url 地址,例如你的工程名为:ucmanage.那么你要测试你是否已经发布好 webservice, 在浏览器中输入的地址为:  http://127.0.0.1:8080/ucmanage/ws/userService

 

 

 

 

    结束语: 至此完毕了 WebService的发布,如要建立客户端调用 webService,请参考: http://rwg109.iteye.com/blog/812873

分享到:
评论
3 楼 rwg109 2011-02-25  
luwanyi 写道
请问楼主有源码吗,好的类没有给出。

童鞋,总不可能把整个项目拿上来吧。呵呵。你所指的好的类是哪个呢?
2 楼 rwg109 2011-01-05  
luwanyi 写道
请问楼主有源码吗,好的类没有给出。


  你是说 UserDTO 类似的类吗? com.transnal.* 下面的类完全不必给出,因为这是基于自己情况构建的实体类.
这只是一个简单的 soap 的 demo。你要清楚哪些是重点。
1 楼 luwanyi 2011-01-04  
请问楼主有源码吗,好的类没有给出。
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    CXF框架发布webservice

    首先,"5-采用CXF框架发布webservice.avi"这个视频很可能详细介绍了使用CXF的基本步骤。发布一个Web服务通常包括以下过程: 1. **环境准备**:确保你的开发环境中已经安装了Java SDK和Maven或Gradle等构建工具,...

    Spring+CXF 发布WebService服务

    通过以上步骤,我们就可以成功地使用Spring+CXF发布一个完整的WebService服务。这个过程中,Spring负责管理和依赖注入,而CXF则负责处理Web服务的通信细节,两者结合提供了一种强大且灵活的解决方案。在实际开发中,...

    SpringBoot框架及CXF发布WebService

    **SpringBoot框架** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用...这两个部分可以作为学习和实践SpringBoot发布和消费Web服务的起点,帮助开发者深入理解SpringBoot与CXF的协同工作方式。

    CXF servlet 发布webservice

    这篇博文链接虽然缺失,但通常会介绍使用CXF发布Web服务的步骤。首先,我们需要在项目中引入CXF库。这可以通过Maven或Gradle的依赖管理来实现。接着,我们需要创建一个Java类,该类将作为我们的Web服务接口,通常会...

    ssh+cxf整合发布webservice实例

    SSH+CXF整合发布Web服务(Webservice)实例详解 在软件开发中,SSH(Spring、Struts、Hibernate)是一个常见的Java EE应用框架组合,用于构建高效、可维护的企业级应用程序。CXF则是一个开源的Java服务堆栈,主要...

    使用cxf发布的webservice服务

    总的来说,“使用CXF发布的WebService服务”涉及到以下几个关键步骤:定义服务接口和实现,配置CXF服务端点,部署服务,以及生成和使用客户端代理。通过这个“employeeServiceForCxf”示例,初学者可以清晰地了解到...

    使用CXF和camel-cxf调用webservice

    在使用CXF调用Web服务时,通常会经历以下步骤: 1. **创建服务客户端**:首先,你需要有一个服务的WSDL(Web Service Description Language)文件,这是定义Web服务接口和消息格式的标准XML文档。CXF可以基于WSDL...

    springboot+CXF发布webservice接口

    总之,通过Spring Boot与CXF的集成,我们可以轻松地在Spring Boot应用中发布Web服务接口,提供基于SOAP的通信方式。这不仅简化了开发流程,还利用了Spring Boot的自动化配置和CXF的强大功能,为构建高效、可维护的...

    WebService CXF 详细教程

    **四、CXF的使用步骤** 1. **定义服务接口**:编写Java接口,声明服务的业务方法。 2. **生成服务类和端点**:使用CXF的工具,如wsdl2java,从接口生成服务类和服务端点(SEI,Service Endpoint Interface)。 3. *...

    基于cxf 的webService 接口开发及调用步骤文档

    ### 基于CXF的WebService接口开发及调用步骤详解 #### 一、概述 在当前企业级应用开发中,服务化与微服务架构逐渐成为主流趋势,而WebService作为一种跨语言、跨平台的服务交互方式,在众多场景下仍然发挥着重要...

    基于Soap协议下CXF框架开发Webservice

    以下是使用CXF开发SOAP服务的基本步骤: 1. **创建服务接口**:定义服务的业务方法,这些方法将作为SOAP接口暴露给客户端调用。例如: ```java @WebService public interface HelloWorldService { @WebMethod ...

    CXF 一个完整的webService(整合客户端和服务端)

    总结,CXF作为一个强大的Web服务框架,提供了从服务端到客户端的全方位支持,能够帮助开发者快速构建稳定、高效的Web服务。通过理解并掌握CXF的基本概念和操作,你将能够充分利用它的优势,为你的项目带来便利。

    CXF发布WebService,jboss和tomcat都能发布

    【CXF发布WebService详解】 Apache CXF 是一个开源的Java框架,它允许开发人员创建和部署Web服务。CXF提供了一种简单的方式来构建SOAP(Simple Object Access Protocol)服务器和客户端,使得开发者可以专注于业务...

    使用CXF开发搭建WebService步骤文档

    Apache CXF是一个强大的Java框架,它提供了多种方式来实现Web服务,包括基于WSDL(Web服务描述语言)的第一类公民支持,以及JAX-WS和JAX-RS标准的支持。CXF不仅简化了Web服务的创建,还提供了客户端API,使得调用...

    cxf+spring webservice demo client

    这个示例项目`CXFClient`很可能包含了上述步骤的代码实现,你可以通过阅读和分析代码来深入理解CXF和Spring如何协同工作,创建和消费Web服务。这将帮助你更好地理解和应用这两种强大工具在实际项目中的集成技巧。 ...

    CXF+Jetty发布WebService

    三、CXF+Jetty发布WebService步骤 1. **创建WebService** 首先,我们需要定义一个Java接口,该接口代表我们的Web服务。例如,我们可以创建一个名为`CalculatorService`的接口,包含加法和减法的方法。 2. **生成...

    WebService开发客户端 cxf方式

    总结,使用CXF开发WebService客户端是Java开发者常用的一种方式,它简化了客户端的构建过程,提供了丰富的功能和良好的扩展性。通过理解WSDL、生成客户端代码、配置服务地址以及利用CXF的高级特性,可以高效地完成与...

    利用CXF发布restful WebService 研究

    【标题】:“利用CXF发布RESTful WebService研究” 在当今的互联网开发中,RESTful Web Service已经成为一种广泛采用的接口设计模式,它基于HTTP协议,以资源为中心,通过统一的URI(Uniform Resource Identifier)...

    CXF实现简单的WebService接口开发

    通过阅读相关的博客和实践上述步骤,你可以深入理解CXF的工作原理,并掌握使用CXF开发WebService的基本流程。"利用CXF实现简单的WebService"这个文件名可能包含了一个实际的示例项目,下载后可以作为学习和调试的...

Global site tag (gtag.js) - Google Analytics