一、Spring+CXF整合示例

WebService是一种跨编程语言、跨操作系统平台的远程调用技术,它是指一个应用程序向外界暴露一个能通过Web调用的API接口,我们把调用这个WebService的应用程序称作客户端,把提供这个WebService的应用程序称作服务端。

环境

win10+Spring5.1+cxf3.3.2

下载

服务端

  • 新建web项目

  • 放入依赖

    apache-cxf-3.3.2\lib中的jar包全部copy至项目WEB-INF\lib目录下(偷个懒,这些jar包中包含了Spring所需的jar包)

  • web.xml中添加webService的配置拦截
  1. <!--webService -->
  2. <servlet>
  3. <servlet-name>CXFService</servlet-name>
  4. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>CXFService</servlet-name>
  8. <url-pattern>/webservice/*</url-pattern>
  9. </servlet-mapping>
  • webservice服务接口

    在项目src目录下新建pms.inface.WebServiceInterface
  1. package pms.inface;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebParam;
  4. import javax.jws.WebResult;
  5. import javax.jws.WebService;
  6. @WebService(targetNamespace = "http://spring.webservice.server", name = "WebServiceInterface")
  7. public interface WebServiceInterface {
  8. @WebMethod
  9. @WebResult(name = "result", targetNamespace = "http://spring.webservice.server")
  10. public String sayBye(@WebParam(name = "word", targetNamespace = "http://spring.webservice.server") String word);
  11. }
  • 接口实现类

    在项目src目录下新建pms.impl.WebServiceImpl
  1. package pms.impl;
  2. import javax.jws.WebService;
  3. import pms.inface.WebServiceInterface;
  4. @WebService
  5. public class WebServiceImpl implements WebServiceInterface{
  6. @Override
  7. public String sayBye(String word) {
  8. return word + "当和这个真实的世界迎面撞上时,你是否找到办法和自己身上的欲望讲和,又该如何理解这个铺面而来的人生?";
  9. }
  10. }
  • webservice配置文件

    WEB-INF目录下新建webservice配置文件cxf-webService.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xmlns:cxf="http://cxf.apache.org/core"
  6. xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  9. http://cxf.apache.org/jaxws
  10. http://cxf.apache.org/schemas/jaxws.xsd
  11. http://cxf.apache.org/core
  12. http://cxf.apache.org/schemas/core.xsd
  13. http://cxf.apache.org/transports/http/configuration
  14. http://cxf.apache.org/schemas/configuration/http-conf.xsd
  15. ">
  16. <import resource="classpath:META-INF/cxf/cxf.xml" />
  17. <!-- 使用jaxws:server标签发布WebService服务 ,设置address为访问地址, 和web.xml文件中配置的CXF配合为一个完整的路径 -->
  18. <!-- serviceClass为实现类的接口 serviceBean引用配置好的WebService实现类 -->
  19. <jaxws:server address="/webServiceInterface"
  20. serviceClass="pms.inface.WebServiceInterface">
  21. <jaxws:serviceBean>
  22. <ref bean="WebServiceImpl" />
  23. </jaxws:serviceBean>
  24. </jaxws:server>
  25. <!-- 为所有的WS设置超时时间 ,此时为默认值 连接时间30s,等待回复时间为60s-->
  26. <http-conf:conduit name="*.http-conduit">
  27. <http-conf:client ConnectionTimeout="60000" ReceiveTimeout="120000"/>
  28. </http-conf:conduit>
  29. </beans>
  • spring配置文件

    WEB-INF目录下新建spring配置文件applicationContext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <bean id="WebServiceImpl" class="pms.impl.WebServiceImpl"></bean>
  7. <import resource="cxf-webService.xml" />
  8. </beans>

      在web.xml中配置applicationContext.xml

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>
  4. /WEB-INF/applicationContext.xml
  5. </param-value>
  6. </context-param>
  7. <listener>
  8. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  9. </listener>
  • 将项目放至tomcat中启动

    启动后访问地址:localhost:PORT/项目名/webservice/webServiceInterface?wsdl,如下图所示,webservice接口发布成功

二、SoapUI测试

SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。

下载

  • 百度网盘

    链接:https://pan.baidu.com/s/1N2RTqhvrkuzx7YJvmDeY7Q

    提取码:e1w3

测试

  • 打开SoapUI,新建一个SOAP项目,将刚才的发布地址copyInitial WSDL栏,点击OK按钮

  • 发起接口请求

三、客户端

使用wsdl2java工具生成webservice客户端代码

  • 该工具在刚才下载的apache-cxf-3.3.2\bin目录下

  • 配置环境变量

    设置CXF_HOME,并添加%CXF_HOME %/binpath环境变量。



  • CMD命令行输入wsdl2java -help,有正常提示说明环境已经正确配置

  • wsdl2java.bat用法:
  1. wsdl2java p 包名 d 存放目录 -all wsdl地址
  2. -p 指定wsdl的命名空间,也就是要生成代码的包名
  3. -d 指令要生成代码所在目录
  4. -client 生成客户端测试web service的代码
  5. -server 生成服务器启动web service代码
  6. -impl 生成web service的实现代码,我们在方式一用的就是这个
  7. -ant 生成build.xml文件
  8. -all 生成所有开始端点代码
  • 生成客户端代码
  1. wsdl2java -p pms.inface -d ./ -all http://localhost:8080/spring_webservice_server/webservice/webServiceInterface?wsdl

客户端调用

  • 新建web项目

  • 放入依赖

    apache-cxf-3.3.2\lib中的jar包全部copy至项目WEB-INF\lib目录下
  • wsdl2java生成的代码放至src.pms.inface目录下

调用方法一:
  • 新建webServiceClientMain测试
  1. package pms;
  2. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  3. import pms.inface.WebServiceInterface;
  4. public class webServiceClientMain {
  5. public static void main(String[] args) {
  6. JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
  7. svr.setServiceClass(WebServiceInterface.class);
  8. svr.setAddress("http://localhost:8080/spring_webservice_server/webservice/webServiceInterface?wsdl");
  9. WebServiceInterface webServiceInterface = (WebServiceInterface) svr.create();
  10. System.out.println(webServiceInterface.sayBye("honey,"));
  11. }
  12. }
  • 运行webServiceClientMain

调用方法二:
  • 在src目录下新建applicationContext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  10. http://cxf.apache.org/jaxws
  11. http://cxf.apache.org/schemas/jaxws.xsd">
  12. <jaxws:client id="webServiceInterface"
  13. serviceClass="pms.inface.WebServiceInterface"
  14. address="http://localhost:8080/spring_webservice_server/webservice/webServiceInterface?wsdl" >
  15. </jaxws:client>
  16. </beans>
  • 新建webServiceClientTest测试
  1. package pms;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import pms.inface.WebServiceInterface;
  5. public class webServiceClientTest {
  6. public static void main(String[] args) {
  7. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  8. WebServiceInterface webServiceInterface = context.getBean(WebServiceInterface.class);
  9. String result = webServiceInterface.sayBye("honey,");
  10. System.out.println(result);
  11. }
  12. }
  • 运行webServiceClientTest

四、服务端拦截器

  • 需求场景:服务提供方安全验证,也就是webservice自定义请求头的实现,服务接口在身份认证过程中的密码字段满足SM3(哈希函数算法标准)的加密要求
  • 请求头格式
  1. <security>
  2. <username></username>
  3. <password></password>
  4. </auth>
  • src.pms.interceptor下新建WebServiceInInterceptor拦截器拦截请求,解析头部
  1. package pms.interceptor;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.xml.namespace.QName;
  5. import org.apache.cxf.binding.soap.SoapMessage;
  6. import org.apache.cxf.headers.Header;
  7. import org.apache.cxf.interceptor.Fault;
  8. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  9. import org.apache.cxf.phase.Phase;
  10. import org.apache.cxf.transport.http.AbstractHTTPDestination;
  11. import org.w3c.dom.Element;
  12. import org.w3c.dom.Node;
  13. import org.w3c.dom.NodeList;
  14. import pms.support.Sm3Utils;
  15. import pms.support.StringUtils;
  16. /**
  17. * WebService的输入拦截器
  18. * @author coisini
  19. * @date May 2020, 13
  20. *
  21. */
  22. public class WebServiceInInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
  23. private static final String USERNAME = "admin";
  24. private static final String PASSWORD = "P@ssw0rd";
  25. /**
  26. * 允许访问的IP
  27. */
  28. private static final String ALLOWIP = "127.0.0.1;XXX.XXX.XXX.XXX";
  29. public WebServiceInInterceptor() {
  30. /*
  31. * 拦截器链有多个阶段,每个阶段都有多个拦截器,拦截器在拦截器链的哪个阶段起作用,可以在拦截器的构造函数中声明
  32. * RECEIVE 接收阶段,传输层处理
  33. * (PRE/USER/POST)_STREAM 流处理/转换阶段
  34. * READ SOAPHeader读取
  35. * (PRE/USER/POST)_PROTOCOL 协议处理阶段,例如JAX-WS的Handler处理
  36. * UNMARSHAL SOAP请求解码阶段
  37. * (PRE/USER/POST)_LOGICAL SOAP请求解码处理阶段
  38. * PRE_INVOKE 调用业务处理之前进入该阶段
  39. * INVOKE 调用业务阶段
  40. * POST_INVOKE 提交业务处理结果,并触发输入连接器
  41. */
  42. super(Phase.PRE_INVOKE);
  43. }
  44. /**
  45. * 客户端传来的 soap 消息先进入拦截器这里进行处理,客户端的账目与密码消息放在 soap 的消息头<security></security>中,
  46. * 类似如下:
  47. * <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  48. * <soap:Header><security><username>admin</username><password>P@ssw0rd</password></security></soap:Header>
  49. * <soap:Body></soap:Body></soap:Envelope>
  50. * 现在只需要解析其中的 <head></head>标签,如果解析验证成功,则放行,否则这里直接抛出异常,
  51. * 服务端不会再往后运行,客户端也会跟着抛出异常,得不到正确结果
  52. *
  53. * @param message
  54. * @throws Fault
  55. */
  56. @Override
  57. public void handleMessage(SoapMessage message) throws Fault {
  58. System.out.println("PRE_INVOKE");
  59. HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
  60. String ipAddr=request.getRemoteAddr();
  61. System.out.println("客户端访问IP----"+ipAddr);
  62. if(!ALLOWIP.contains(ipAddr)) {
  63. throw new Fault(new IllegalArgumentException("非法IP地址"), new QName("0009"));
  64. }
  65. /**
  66. * org.apache.cxf.headers.Header
  67. * QName :xml 限定名称,客户端设置头信息时,必须与服务器保持一致,否则这里返回的 header 为null,则永远通不过的
  68. */
  69. Header authHeader = null;
  70. //获取验证头
  71. List<Header> headers = message.getHeaders();
  72. for(Header h:headers){
  73. if(h.getName().toString().contains("security")){
  74. authHeader=h;
  75. break;
  76. }
  77. }
  78. System.out.println("authHeader");
  79. System.out.println(authHeader);
  80. if(authHeader !=null) {
  81. Element auth = (Element) authHeader.getObject();
  82. NodeList childNodes = auth.getChildNodes();
  83. String username = null,password = null;
  84. for(int i = 0, len = childNodes.getLength(); i < len; i++){
  85. Node item = childNodes.item(i);
  86. if(item.getNodeName().contains("username")){
  87. username = item.getTextContent();
  88. System.out.println(username);
  89. }
  90. if(item.getNodeName().contains("password")){
  91. password = item.getTextContent();
  92. System.out.println(password);
  93. }
  94. }
  95. if(StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
  96. throw new Fault(new IllegalArgumentException("用户名或密码不能为空"), new QName("0001"));
  97. }
  98. if(!Sm3Utils.verify(USERNAME, username) || !Sm3Utils.verify(PASSWORD,password)) {
  99. throw new Fault(new IllegalArgumentException("用户名或密码错误"), new QName("0008"));
  100. }
  101. if (Sm3Utils.verify(USERNAME, username) && Sm3Utils.verify(PASSWORD,password)) {
  102. System.out.println("webService 服务端自定义拦截器验证通过....");
  103. return;//放行
  104. }
  105. }else {
  106. throw new Fault(new IllegalArgumentException("请求头security不合法"), new QName("0010"));
  107. }
  108. }
  109. // 出现错误输出错误信息和栈信息
  110. public void handleFault(SoapMessage message) {
  111. Exception exeption = message.getContent(Exception.class);
  112. System.out.println(exeption.getMessage());
  113. }
  114. }
  • src.pms.support下新建Sm3Utils加密类
  1. package pms.support;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.Security;
  4. import java.util.Arrays;
  5. import org.bouncycastle.crypto.digests.SM3Digest;
  6. import org.bouncycastle.crypto.macs.HMac;
  7. import org.bouncycastle.crypto.params.KeyParameter;
  8. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  9. import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
  10. /**
  11. * SM3加密
  12. * @author coisini
  13. * @date May 2020, 13
  14. */
  15. public class Sm3Utils {
  16. private static final String ENCODING = "UTF-8";
  17. static {
  18. Security.addProvider(new BouncyCastleProvider());
  19. }
  20. /**
  21. * sm3算法加密
  22. * @explain
  23. * @param paramStr
  24. * 待加密字符串
  25. * @return 返回加密后,固定长度=32的16进制字符串
  26. */
  27. public static String encrypt(String paramStr){
  28. // 将返回的hash值转换成16进制字符串
  29. String resultHexString = "";
  30. try {
  31. // 将字符串转换成byte数组
  32. byte[] srcData = paramStr.getBytes(ENCODING);
  33. // 调用hash()
  34. byte[] resultHash = hash(srcData);
  35. // 将返回的hash值转换成16进制字符串
  36. resultHexString = ByteUtils.toHexString(resultHash);
  37. } catch (UnsupportedEncodingException e) {
  38. e.printStackTrace();
  39. }
  40. return resultHexString;
  41. }
  42. /**
  43. * 返回长度=32的byte数组
  44. * @explain 生成对应的hash值
  45. * @param srcData
  46. * @return
  47. */
  48. public static byte[] hash(byte[] srcData) {
  49. SM3Digest digest = new SM3Digest();
  50. digest.update(srcData, 0, srcData.length);
  51. byte[] hash = new byte[digest.getDigestSize()];
  52. digest.doFinal(hash, 0);
  53. return hash;
  54. }
  55. /**
  56. * 通过密钥进行加密
  57. * @explain 指定密钥进行加密
  58. * @param key
  59. * 密钥
  60. * @param srcData
  61. * 被加密的byte数组
  62. * @return
  63. */
  64. public static byte[] hmac(byte[] key, byte[] srcData) {
  65. KeyParameter keyParameter = new KeyParameter(key);
  66. SM3Digest digest = new SM3Digest();
  67. HMac mac = new HMac(digest);
  68. mac.init(keyParameter);
  69. mac.update(srcData, 0, srcData.length);
  70. byte[] result = new byte[mac.getMacSize()];
  71. mac.doFinal(result, 0);
  72. return result;
  73. }
  74. /**
  75. * 判断源数据与加密数据是否一致
  76. * @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
  77. * @param srcStr
  78. * 原字符串
  79. * @param sm3HexString
  80. * 16进制字符串
  81. * @return 校验结果
  82. */
  83. public static boolean verify(String srcStr, String sm3HexString) {
  84. boolean flag = false;
  85. try {
  86. byte[] srcData = srcStr.getBytes(ENCODING);
  87. byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
  88. byte[] newHash = hash(srcData);
  89. if (Arrays.equals(newHash, sm3Hash))
  90. flag = true;
  91. } catch (UnsupportedEncodingException e) {
  92. e.printStackTrace();
  93. }
  94. return flag;
  95. }
  96. public static void main(String[] args) {
  97. // 测试二:account
  98. String account = "admin";
  99. String passoword = "P@ssw0rd";
  100. String hex = Sm3Utils.encrypt(account);
  101. System.out.println(hex);//dc1fd00e3eeeb940ff46f457bf97d66ba7fcc36e0b20802383de142860e76ae6
  102. System.out.println(Sm3Utils.encrypt(passoword));//c2de40449a2019db9936381fa9810c22c8548a8635ed2b7fb3c7ec362e37429d
  103. //验证加密后的16进制字符串与加密前的字符串是否相同
  104. boolean flag = Sm3Utils.verify(account, hex);
  105. System.out.println(flag);// true
  106. }
  107. }
  • StringUtils工具类
  1. package pms.support;
  2. /**
  3. * 字符串工具类
  4. * @author coisini
  5. * @date Nov 27, 2019
  6. */
  7. public class StringUtils {
  8. /**
  9. * 判空操作
  10. * @param value
  11. * @return
  12. */
  13. public static boolean isBlank(String value) {
  14. return value == null || "".equals(value) || "null".equals(value) || "undefined".equals(value);
  15. }
  16. }
  • cxf-webService.xml添加拦截器配置
  1. <!-- 在此处引用拦截器 -->
  2. <bean id="InInterceptor"
  3. class="pms.interceptor.WebServiceInInterceptor" >
  4. </bean>
  5. <cxf:bus>
  6. <cxf:inInterceptors>
  7. <ref bean="InInterceptor" />
  8. </cxf:inInterceptors>
  9. </cxf:bus>
  • SoapUI调用



  • java调用



    服务端拦截器到此结束,由上图可以看出拦截器配置生效

五、客户端拦截器

  • src.pms.support下新建AddHeaderInterceptor拦截器拦截请求,添加自定义认证头部
  1. package pms.support;
  2. import java.util.List;
  3. import javax.xml.namespace.QName;
  4. import org.apache.cxf.binding.soap.SoapHeader;
  5. import org.apache.cxf.binding.soap.SoapMessage;
  6. import org.apache.cxf.headers.Header;
  7. import org.apache.cxf.helpers.DOMUtils;
  8. import org.apache.cxf.interceptor.Fault;
  9. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  10. import org.apache.cxf.phase.Phase;
  11. import org.w3c.dom.Document;
  12. import org.w3c.dom.Element;
  13. public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
  14. private String userName;
  15. private String password;
  16. public AddHeaderInterceptor(String userName, String password) {
  17. super(Phase.PREPARE_SEND);
  18. this.userName = userName;
  19. this.password = password;
  20. }
  21. @Override
  22. public void handleMessage(SoapMessage msg) throws Fault {
  23. System.out.println("拦截...");
  24. /**
  25. * 生成的XML文档
  26. * <authHeader>
  27. * <userName>admin</userName>
  28. * <password>P@ssw0rd</password>
  29. * </authHeader>
  30. */
  31. // SoapHeader部分待添加的节点
  32. QName qName = new QName("security");
  33. Document doc = DOMUtils.createDocument();
  34. Element pwdEl = doc.createElement("password");
  35. pwdEl.setTextContent(password);
  36. Element userEl = doc.createElement("username");
  37. userEl.setTextContent(userName);
  38. Element root = doc.createElement("security");
  39. root.appendChild(userEl);
  40. root.appendChild(pwdEl);
  41. // 创建SoapHeader内容
  42. SoapHeader header = new SoapHeader(qName, root);
  43. // 添加SoapHeader内容
  44. List<Header> headers = msg.getHeaders();
  45. headers.add(header);
  46. }
  47. }
  • java调用,修改webServiceClientMain调用代码如下
  1. public class webServiceClientMain {
  2. public static void main(String[] args) {
  3. JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
  4. svr.setServiceClass(WebServiceInterface.class);
  5. svr.setAddress("http://localhost:8081/spring_webservice_server/webservice/webServiceInterface?wsdl");
  6. WebServiceInterface webServiceInterface = (WebServiceInterface) svr.create();
  7. // jaxws API 转到 cxf API 添加日志拦截器
  8. org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy
  9. .getClient(webServiceInterface);
  10. org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();
  11. //添加自定义的拦截器
  12. cxfEndpoint.getOutInterceptors().add(new AddHeaderInterceptor("dc1fd00e3eeeb940ff46f457bf97d66ba7fcc36e0b20802383de142860e76ae6", "c2de40449a2019db9936381fa9810c22c8548a8635ed2b7fb3c7ec362e37429d"));
  13. System.out.println(webServiceInterface.sayBye("honey,"));
  14. }
  15. }

  • SoapUI调用

六、代码示例

服务端:https://github.com/Maggieq8324/spring_webservice_server.git

客户端:https://github.com/Maggieq8324/spring_webservice_client.git

.end

WebService之Spring+CXF整合示例的更多相关文章

  1. Spring+CXF整合来管理webservice(服务器启动发布webservice)

    Spring+CXF整合来管理webservice    实现步骤:      1. 添加cxf.jar 包(集成了Spring.jar.servlet.jar ),spring.jar包 ,serv ...

  2. WebService学习之三:spring+cxf整合

    步骤一:spring项目(java web项目)引入CXF jar包 步骤二:创建webservice服务器 1)创建一个服务接口 package com.buss.app.login; import ...

  3. Struts2 Spring hibernate 整合示例 .

    示例工具:MyEclipse 8.5.Tomcat 6.0.MySql 步骤: 1.创建一个WEB工程,命名为BookShop(名字自己取,此处为示例工程名): 2.导入struts2的核心jar包, ...

  4. struts2+spring+hibernte整合示例

    简单实现添加用户功能,仅供初学者参考,可自行扩展程序功能(增删改查). 这里贴下代码,需要的可以下载看(因为比较懒). applicationContext.xml <?xml version= ...

  5. webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

    首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...

  6. CXF整合Spring开发WebService

    刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...

  7. Spring整合CXF步骤,Spring实现webService,spring整合WebService

    Spring整合CXF步骤 Spring实现webService, spring整合WebService >>>>>>>>>>>> ...

  8. WebService—CXF整合Spring实现接口发布和调用过程

    一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...

  9. 【WebService】——CXF整合Spring

    相关博客: [WebService]--入门实例 [WebService]--SOAP.WSDL和UDDI 前言: 之前的几篇博客基本上都是使用jdk来实现WebService的调用,没有使用任何框架 ...

随机推荐

  1. Java的IO流以及输入流与输出流的异同

    一:流的基本概念:           Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.J ...

  2. OData武装你的WEBAPI-分页查询

    本文属于OData系列 目录 武装你的WEBAPI-OData入门 武装你的WEBAPI-OData便捷查询 武装你的WEBAPI-OData分页查询 武装你的WEBAPI-OData资源更新 武装你 ...

  3. 关于字符串函数size()的问题

    首先如果你是一段语句 for(int i=0;i<a.size();i++)这个时候会报错 comparison between signed and unsigned integer expr ...

  4. 中国空气质量在线监测分析平台之JS加密、JS混淆处理

    中国空气质量在线监测分析平台数据爬取分析 页面分析:确定url.请求方式.请求参数.响应数据 1.访问网站首页:https://www.aqistudy.cn/html/city_detail.htm ...

  5. 3.5 Go布尔型

    1.Go布尔型 一个布尔类型的值只有两种:true 和 false. if 和 for 语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值. package main im ...

  6. 05 返回静态文件的多线程web框架

    05 返回静态文件的多线程web框架 服务器server端python程序(多线程版): import socket from threading import Thread,currentThrea ...

  7. java web基础第一次作业

    JAVA WEB基础 一.B/S架构 1.B/S架构简介: B是英文单词“Browser”的首字母,即浏览器的意思:S是英文单词“Server”的首字母,即服务器的意思.B/S就是“Browser/S ...

  8. kali中安装漏洞靶场Vulhub(超详细)

    前言 我们都知道,在学习网络安全的过程中,搭建漏洞靶场有着至关重要的作用.复现各种漏洞,能更好的理解漏洞产生的原因,提高自己的学习能力.下面我在kali中演示如何详细安装漏洞靶场Vulhub. 什么是 ...

  9. CentOS上安装配置Python3.7

    一.安装依赖包,这个具体的作用我也不清楚,感觉好像是在安装的时候会要用到的工具. yum install zlib-devel bzip2-devel openssl-devel ncurses-de ...

  10. Docker 入门:容器

    容器看着像机器,实际是进程,是一个运行时程序. 要操作一个 Docker 容器,只需要执行 docker container 命令. 可以通过 help 查看 run 运行容器 基础使用: docke ...