- 浏览: 219290 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (132)
- 企业开发 (46)
- SSO (5)
- CAS (1)
- SOAP (8)
- Oracle (5)
- Eclipse IDE (3)
- 事业 (14)
- Lucene (4)
- 课间十分钟 (2)
- maven (1)
- CMS (5)
- 设计模式 (0)
- 软件开发流程 (0)
- midas/GTS (1)
- Java Hibernate (1)
- SqlServer2005 (1)
- Jquery (1)
- Java (1)
- Java Maven Pom (1)
- Java Velocity (1)
- Jira 项目管理 (2)
- 软件开发 需求分析 (1)
- 单点登录 (1)
- 项目管理 (1)
- 时间管理 (1)
- UI 交互设计流程 (1)
- SVN (1)
- css w3c (1)
- ASP.NET FrameWork (1)
- Oracle Session Process (1)
- tomcat (1)
- Web (0)
最新评论
-
fendou3754:
程序可以运行,不过对于中文的搜索,貌似要将txt文件存为UTF ...
Lucene开发实例--代码篇 -
ewf_momo:
...
Lucene开发实例--代码篇 -
dbh0512:
我的是一段文本 每次只能创建一个索引 但是搜索不到 求解答
Lucene开发实例--代码篇 -
a496649849:
终于安装了 多谢
m2安装Eclipse3.6.1(eclipse-jee-helios-SR1-win32.zip)问题 -
lyj57:
那个"E:\\renwg\\茶余饭后\\新建文件夹& ...
Lucene开发实例--代码篇
发布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
- cxf-bundle-2.1.3.jar (3.9 MB)
- 下载次数: 439
- wss4j-1.5.4.jar (300.2 KB)
- 下载次数: 319
- axis-1.4.jar (1.5 MB)
- 下载次数: 348
评论
童鞋,总不可能把整个项目拿上来吧。呵呵。你所指的好的类是哪个呢?
你是说 UserDTO 类似的类吗? com.transnal.* 下面的类完全不必给出,因为这是基于自己情况构建的实体类.
这只是一个简单的 soap 的 demo。你要清楚哪些是重点。
发表评论
文章已被作者锁定,不允许评论。
-
CXF与 Axis的简单介绍
2011-06-16 14:30 1245在Celtix 和XFire 宣布合并的同年,另一个著名开源W ... -
CXF的 Java 转为 WSDL
2011-06-16 13:53 1719在做WebService的时候,生成WSDL是必不可少的一步。 ... -
使用CXF限制客户端IP地址
2011-06-16 00:14 1742有的时候,对于WebService服务端,想配置白名 ... -
有开发WerbService经验者请进:SOAPFaultException
2010-11-22 12:03 2074在调用CXF的webService时出现这种情况,劳烦有经验者 ... -
简单CXF方式的webService客户端调用范例
2010-11-16 15:34 6154一般webServices发布后需要测试一下,是否可行 ... -
XMLGregorianCalendar与Date的类型相互转换
2010-11-04 15:10 2430发布 webService 时,java.util.Date ... -
SOAP WebService 发布全过程
2010-09-08 15:46 1973package com.transnal.ws.cnlif ...
相关推荐
首先,"5-采用CXF框架发布webservice.avi"这个视频很可能详细介绍了使用CXF的基本步骤。发布一个Web服务通常包括以下过程: 1. **环境准备**:确保你的开发环境中已经安装了Java SDK和Maven或Gradle等构建工具,...
通过以上步骤,我们就可以成功地使用Spring+CXF发布一个完整的WebService服务。这个过程中,Spring负责管理和依赖注入,而CXF则负责处理Web服务的通信细节,两者结合提供了一种强大且灵活的解决方案。在实际开发中,...
**SpringBoot框架** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用...这两个部分可以作为学习和实践SpringBoot发布和消费Web服务的起点,帮助开发者深入理解SpringBoot与CXF的协同工作方式。
这篇博文链接虽然缺失,但通常会介绍使用CXF发布Web服务的步骤。首先,我们需要在项目中引入CXF库。这可以通过Maven或Gradle的依赖管理来实现。接着,我们需要创建一个Java类,该类将作为我们的Web服务接口,通常会...
SSH+CXF整合发布Web服务(Webservice)实例详解 在软件开发中,SSH(Spring、Struts、Hibernate)是一个常见的Java EE应用框架组合,用于构建高效、可维护的企业级应用程序。CXF则是一个开源的Java服务堆栈,主要...
总的来说,“使用CXF发布的WebService服务”涉及到以下几个关键步骤:定义服务接口和实现,配置CXF服务端点,部署服务,以及生成和使用客户端代理。通过这个“employeeServiceForCxf”示例,初学者可以清晰地了解到...
在使用CXF调用Web服务时,通常会经历以下步骤: 1. **创建服务客户端**:首先,你需要有一个服务的WSDL(Web Service Description Language)文件,这是定义Web服务接口和消息格式的标准XML文档。CXF可以基于WSDL...
总之,通过Spring Boot与CXF的集成,我们可以轻松地在Spring Boot应用中发布Web服务接口,提供基于SOAP的通信方式。这不仅简化了开发流程,还利用了Spring Boot的自动化配置和CXF的强大功能,为构建高效、可维护的...
**四、CXF的使用步骤** 1. **定义服务接口**:编写Java接口,声明服务的业务方法。 2. **生成服务类和端点**:使用CXF的工具,如wsdl2java,从接口生成服务类和服务端点(SEI,Service Endpoint Interface)。 3. *...
### 基于CXF的WebService接口开发及调用步骤详解 #### 一、概述 在当前企业级应用开发中,服务化与微服务架构逐渐成为主流趋势,而WebService作为一种跨语言、跨平台的服务交互方式,在众多场景下仍然发挥着重要...
以下是使用CXF开发SOAP服务的基本步骤: 1. **创建服务接口**:定义服务的业务方法,这些方法将作为SOAP接口暴露给客户端调用。例如: ```java @WebService public interface HelloWorldService { @WebMethod ...
总结,CXF作为一个强大的Web服务框架,提供了从服务端到客户端的全方位支持,能够帮助开发者快速构建稳定、高效的Web服务。通过理解并掌握CXF的基本概念和操作,你将能够充分利用它的优势,为你的项目带来便利。
【CXF发布WebService详解】 Apache CXF 是一个开源的Java框架,它允许开发人员创建和部署Web服务。CXF提供了一种简单的方式来构建SOAP(Simple Object Access Protocol)服务器和客户端,使得开发者可以专注于业务...
Apache CXF是一个强大的Java框架,它提供了多种方式来实现Web服务,包括基于WSDL(Web服务描述语言)的第一类公民支持,以及JAX-WS和JAX-RS标准的支持。CXF不仅简化了Web服务的创建,还提供了客户端API,使得调用...
这个示例项目`CXFClient`很可能包含了上述步骤的代码实现,你可以通过阅读和分析代码来深入理解CXF和Spring如何协同工作,创建和消费Web服务。这将帮助你更好地理解和应用这两种强大工具在实际项目中的集成技巧。 ...
三、CXF+Jetty发布WebService步骤 1. **创建WebService** 首先,我们需要定义一个Java接口,该接口代表我们的Web服务。例如,我们可以创建一个名为`CalculatorService`的接口,包含加法和减法的方法。 2. **生成...
总结,使用CXF开发WebService客户端是Java开发者常用的一种方式,它简化了客户端的构建过程,提供了丰富的功能和良好的扩展性。通过理解WSDL、生成客户端代码、配置服务地址以及利用CXF的高级特性,可以高效地完成与...
【标题】:“利用CXF发布RESTful WebService研究” 在当今的互联网开发中,RESTful Web Service已经成为一种广泛采用的接口设计模式,它基于HTTP协议,以资源为中心,通过统一的URI(Uniform Resource Identifier)...
通过阅读相关的博客和实践上述步骤,你可以深入理解CXF的工作原理,并掌握使用CXF开发WebService的基本流程。"利用CXF实现简单的WebService"这个文件名可能包含了一个实际的示例项目,下载后可以作为学习和调试的...