手把手教你如何玩转WebService(包含项目实践)

SpringBoot调用WebService的实践 按步骤写完第四步的朋友,应该会发现EntityUtil类不存在的报错【狗头保命】,不要紧,接下来咱们来贴上这个类的代码就好了。作者也是抄的,不过这个类不错,以后就是大家的了。如:MES与SAP的交互,MES与WMS的交换,MES与SRM的交互,MES与IOT的交互等。对了,关于这段XSDL的文档,参考soapui中的自动生成的xml文档。如有想了解的,可以私信作者。整体思路:通过xml调用MES系统提供的服务,将MES系统返回的信息流先转换成字符串,再反射到java的对象中。如有疑问,欢迎私信骚扰。 阅读详情

情景引入:

时间:早晨 8 : 00 am

小白:起床起床,,,公司又来需求了,你还在睡觉,快点起来~!

我:大惊小怪,又怎么了呢?小白,别一惊一乍的,打扰我的美梦

小白:公司给了个新需求,你还记得,咱们上次做的那个项目吗?

我:记得,怎么了呢?不是都已经上线了吗?

小白:对呀,但是,与我们合作的那个公司,他们想把我们项目里面的物流查询功能,放到他们自己开发的一个系统里面去,说这样方便他们自己进行查询,要不然,老是需要额外登录我们的系统,挺麻烦的,而还要特别的给他们一个账号进行管理。所以,他们的需求就是:让物流查询的功能提供给他们。 

我:意思是他们想跨平台用我们的物流功能呢?

小白:是的,,,快,赶紧想想办法,咱们,总不能又给他们写一套一样的代码嵌入吧,这效率太低了。

我:当然不行了,这样写的话,有很多问题的,而且系统与系统进行了多重嵌入会影响整体的执行。

小白:对呀,所以,那咱们怎么办呢?

我:容我思考思考,针对这样的跨平台问题,其实也挺好解决的,那就是采取WebService的方式,我们将物流查询作为一个WebService,这样只需要他们那边进行相应的规则处理就好了。

小白:WebService??这是一个什么东西呢?有这么神奇,还可以跨平台的吗?

我:当然,这在很多地方其实都用到的,比如天气查询功能,你觉得每个公司都会去写一套这样的代码吗?当然不会。

小白:对哦,要不然这多麻烦,你看像微信公众号里面的那么多服务,都是别人写好的,我们开发都是用一定的规则去解析的。

我:对的,那下面,我来说说,到底什么是WebService和它的功能。

一:WebService简介

(1)简介----百度百科(注意标识的重点)

        Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。 [1] 
       Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

(2)WebService三元素

UDDI:UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。---简单点说,就是一套规则,方便使用;

WSDL:Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。----简单点说,就是使用规则,方便人和机器进行阅读;

SOAP协议:基于Http,基于XML,SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。----简单点说,就是传输协议,方便进行传输;

(3)WebService与Socket的区别(两种通信的方式)

(1) Socket是基于TCP/IP的传输层协议。 
    Webservice是基于HTTP协议传输数据,http是基于tcp的应用层协议。 
    Webservice采用了基于http的soap协议传输数据。
(2)Socket接口通过流传输,不支持面向对象。 
    Webservice 接口支持面向对象,最终webservice将对象进行序列化后通过流传输。 
    Webservice采用soap协议进行通信,不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。
(3)Socket适用于高性能大数据的传输,传输的数据需要手动处理,socket通信的接口协议需要自定义。

二:属于自己的第一个WebService程序

1)服务端代码(Java工程项目即可,而不需要是web项目,因为webservice已经作为了java SE里面自带的内容):


  
  1. package com.hnu.scw.webservice;
  2. import javax.jws.WebService;
  3. import javax.xml.ws.Endpoint;
  4. /**
  5. * <p>Title: MyFirstWebService.java</p>
  6. * <p>Description: </p>
  7. * <p>Company: 湖南大学</p>
  8. * @author scw
  9. * @date 2018年5月3日
  10. */
  11. @WebService
  12. public class MyFirstWebService {
  13. /**
  14. * 定义webservice服务器中的方法
  15. * @param content
  16. * @return
  17. */
  18. public String testWebService(String content){
  19. System.out.println( "我收到了你发的信息:" + content);
  20. return "服务器:我转发信息给你";
  21. }
  22. public static void main(String[] args){
  23. //定义自己的webservice服务器发布的地址
  24. String address = "http://localhost:9090/MyFirstWebService"; //这个9090端口随便定义,只要不冲突即可
  25. //通过该方法进行发布
  26. Endpoint.publish(address, new MyFirstWebService());
  27. //打印一句话,表示一下服务器进行了开启
  28. System.out.println( "my webservcie starting");
  29. }
  30. }

温馨提示:1:必须加@WebService注解或者@WebServiceProvider

2:至少有一个方法是public,并且不可以用static 和 final进行修饰;原因很明显,因为webservice就是提供给别人各自进行使用的,而不是保持同一个,所以不能是static ,而对于final修饰的话就是不可继承,这也是没有意义的。大家可以试试,将方法进行修改,看会不会报错。

(2)解析WebService服务器的内容

操作:在cmd命令行中执行:wsimport -s . http://localhost:9090/MyFirstWebService


结果:这样的话,就会在你执行这句话的目录下面生成对应的服务器的代码(包括.class文件和.java文件)


(3)客户端代码(Java工程项目即可):

步骤:

1:首先是把上面得到的代码中的.java文件(请注意,.class文件就不需要)拷贝到我们新建的一个客户端的java项目中

2:编写我们的测试方法


  
  1. package com.hnu.scw.webservice;
  2. import org.junit.Test;
  3. /**
  4. * <p>Title: MyTestWebService.java</p>
  5. * <p>Description: 用于进行测试webservice服务器的客户端代码</p>
  6. * <p>Company: 湖南大学</p>
  7. * @author scw
  8. * @date 2018年5月3日
  9. */
  10. public class MyTestWebService {
  11. @Test
  12. public void testWebService(){
  13. //获取webservice服务器对象(这里的类名,其实是从wsdl文件中的servicename标签中进行获取的)
  14. MyFirstWebServiceService myFirstWebServiceService = new MyFirstWebServiceService();
  15. //获取到我们自定义的webservice的对象
  16. MyFirstWebService myFirstWebServicePort = myFirstWebServiceService.getMyFirstWebServicePort();
  17. //调用service服务器中的方法
  18. String receivedInfo = myFirstWebServicePort.testWebService( "您好,webservice 服务器");
  19. //打印从服务器的方法中得到的返回值,测试表示收到了服务器返回的内容
  20. System.out.println( "服务器返回的内容是:" + receivedInfo);
  21. }
  22. }

温馨提示:可以通过浏览器输入:http://localhost:端口号/发布的服务器名字?wsdl     -----------来查看定义service的wsdl文档

这时候,我们只需要首先运行服务器端的java项目,然后再运行我们客户端的@Test方法,这样就可以得到从服务器中获取到的消息内容了。

三:与WebService服务器进行交互的方式

(1)普通客户端调用

这个的话就不多说了,因为在我们上面的第一个WebService的代码中,就已经是这样的一种调用方式。

(2)ajax调用


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Insert title here </title>
  6. <script type="text/javascript">
  7. /*
  8. 思路:
  9. 1.创建一个XMLHTTP对象
  10. 2.打开链接open("POST",url)
  11. 3.设置请求头Content-Type
  12. 4.设置回调函数,处理返回值
  13. 5.从返回的XML中解析我们要的内容
  14. */
  15. var xmlHttpReqquest = new ActiveXObject( "Microsoft.XMLHTTP");
  16. //alert(xmlHttpReqquest);
  17. //发送SOAP请求
  18. function sendMsg(){
  19. //获取用户输入的内容
  20. var name = document.getElementById( "name").value;
  21. var url = "http://localhost:9090/MyFirstWebService";
  22. //下面的这种格式主要是通过Eclipse下载了一个webservice调式工具,这样就可以看到对应的xml格式内容
  23. var requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://webservice.scw.hnu.com/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
  24. + "<soapenv:Body><q0:testWebService><arg0>"+name+ "</arg0></q0:testWebService></soapenv:Body></soapenv:Envelope>";
  25. xmlHttpReqquest.open( "POST", url);
  26. xmlHttpReqquest.setRequestHeader( "Content-Type", "text/xml;charset=utf-8");
  27. xmlHttpReqquest.onreadystatechange = _back;
  28. xmlHttpReqquest.send(requestBody);
  29. }
  30. //接收SOAP返回,从返回XML中解析
  31. function _back(){
  32. //处理完毕,处理成功
  33. if(xmlHttpReqquest.readystate== 4){ //处理完
  34. if(xmlHttpReqquest.status== 200){ //成功
  35. var xml = xmlHttpReqquest.responseXML;
  36. //alert(xml);
  37. //获取return标签的第一个
  38. var ele = xml.getElementsByTagName( "return")[ 0];
  39. alert(ele.text);
  40. } else{
  41. alert( 0);
  42. }
  43. }
  44. }
  45. </script>
  46. </head>
  47. <body>
  48. <input type="text" id="name" name="name" value=""/>
  49. <input type="button" name="send" value="send" οnclick="sendMsg();"/>
  50. </body>
  51. </html>

(3)URLConnection的调用方式


  
  1. //创建url地址
  2. URL url = new URL( ""http: //localhost:9090/MyFirstWebService");
  3. //打开连接
  4. URLConnection conn = url.openConnection();
  5. //转换成HttpURL
  6. HttpURLConnection httpConn = (HttpURLConnection) conn;
  7. //打开输入输出的开关
  8. httpConn.setDoInput( true);
  9. httpConn.setDoOutput( true);
  10. //设置请求方式
  11. httpConn.setRequestMethod( "POST");
  12. //设置请求的头信息
  13. httpConn.setRequestProperty( "Content-type", "text/xml;charset=UTF-8");
  14. //拼接请求消息
  15. String data = "<soapenv:Envelope xmlns:soapenv=" +
  16. "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
  17. "xmlns:q0=\"http://server.rl.com/\" " +
  18. "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
  19. "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
  20. + "<soapenv:Body>"
  21. + "<q0:testWebService>"
  22. + "<arg0>my name is scw</arg0> "
  23. + "</q0:testWebService>"
  24. + "</soapenv:Body>"
  25. + "</soapenv:Envelope>";
  26. //获得输出流
  27. OutputStream out = httpConn.getOutputStream();
  28. //发送数据
  29. out.write(data.getBytes());
  30. //判断请求成功
  31. if(httpConn.getResponseCode() == 200){
  32. //获得输入流
  33. InputStream in = httpConn.getInputStream();
  34. //使用输入流的缓冲区
  35. BufferedReader reader = new BufferedReader( new InputStreamReader( in));
  36. StringBuffer sb = new StringBuffer();
  37. String line = null;
  38. //读取输入流
  39. while((line = reader.readLine()) != null){
  40. sb.append(line);
  41. }
  42. //创建sax的读取器
  43. SAXReader saxReader = new SAXReader();
  44. //创建文档对象
  45. Document doc = saxReader.read( new StringReader(sb.toString()));
  46. //获得请求响应return元素
  47. List<Element> eles = doc.selectNodes( "//return");
  48. for(Element ele : eles){
  49. System. out.println(ele.getText());
  50. }
  51. }

(4)QName调用------------推荐这种方式


  
  1. package com.hnu.scw.test;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4. import javax.xml.namespace.QName;
  5. import javax.xml.ws.Service;
  6. import org.junit.Test;
  7. import com.hnu.scw.webservice.MyFirstWebService;
  8. /**
  9. * <p>Title: MyTestQNameWebService.java</p>
  10. * <p>Description: 通过QName的一种调用方式</p>
  11. * <p>Company: 湖南大学</p>
  12. * @author scw
  13. * @date 2018年5月4日
  14. */
  15. public class MyTestQNameWebService {
  16. @ Test
  17. public void test() throws MalformedURLException{
  18. //创建一个连接(地址对应的就是webservice服务器中的地址)
  19. URL wsdlDocumentLocation = new URL( "http://localhost:9090/MyFirstWebService?wsdl");
  20. //这个参数,主要是根据我们设定的webService的接口来进行的
  21. QName serviceName = new QName( "http://webservice.scw.hnu.com/", "MyFirstWebServiceService");
  22. Service ws = Service.create(wsdlDocumentLocation , serviceName );
  23. //获取到调用的对象内容
  24. MyFirstWebService port = ws.getPort( MyFirstWebService. class);
  25. //方法的调用
  26. String result = port.testWebService( "my name is scw");
  27. System.out. println(result);
  28. }
  29. }

温馨提示:(1)这个方式大体和我们之间进行的客户端调用类型,但是注意一点,在我们的客户端的方式的时候,我们是把所解析得到的.java所有文件都拷贝到客户端程序,而如果用QName的形式,我们只需要保留我们对应WebService类的接口那个即可。比如,如下:

客户端的情况:


QName的情况:


(2)当我们只保留上面的java文件的时候,会出现错误,只需要根据下面进行修改即可;


(3)QName对象的参数是如何知道的?那么久看我们保留的那个接口类中;


(4)通过QName的方式可以很明显的感觉比第一种客户端要好,因为,可以对于端口和链接都有灵活性,而且拷贝的代码也相对较少;

四:关于WebService的部分注解


五:初识CXF框架

     官网:http://cxf.apache.org/

    Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

      Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

六:利用CXF框架来搭建我们的WebService

步骤:

(1)首先去官网下载一个版本http://cxf.apache.org/,现在的话,都是3.2.X版本了,这个根据需要即可;

(2)下载之后,里面就有一个lib的目录,就是关于CXF架构的一些依赖包;

可以去官网下载(或者去博文最后的百度云中下载):http://cxf.apache.org/

(3)创建一个web项目(注意:这时候用了web项目,而之前的开发都是用的Java项目),并且把依赖包都复制到项目中的lib目录中(就和正常的开发web项目一样,在拷贝所有的之后,要把里面的WHICH_JARS这个文件删除,否则会报错)

服务端代码:


  
  1. package com.hnu.scw;
  2. import org.apache.cxf.frontend.ServerFactoryBean;
  3. /**
  4. * 基于CXF框架的服务端代码
  5. * @author Administrator
  6. *
  7. */
  8. public class FirstCXFService {
  9. /**
  10. * web服务的方法
  11. * @param name
  12. * @return
  13. */
  14. public String printReciveInfo(String name){
  15. System.out.println( "客户端发送过来信息:" + name);
  16. return "服务器转发给你了"+ name;
  17. }
  18. public static void main(String[] args){
  19. ServerFactoryBean serverFactoryBean = new ServerFactoryBean();
  20. //设置访问地址
  21. serverFactoryBean.setAddress( "http://localhost:9090/firstService");
  22. //设置实现类
  23. serverFactoryBean.setServiceClass(FirstCXFService.class);
  24. //启动服务
  25. serverFactoryBean.create();
  26. }
  27. }

温馨提示:不要运行配置的服务器,而是直接运行main函数即可。。。。。这样就开启可服务器

客户端代码:(同样的还是通过cmd中的命令:wsimport -s .  XXXXXXXXXX (SOAP1.1版本)或者wsdl2java –d . XXXXXXXXXX(SOAP1.2版本) 来生成代码),然后再创建一个工程项目,并把生成的.java文件拷贝进去。


  
  1. package com.hnu.scw.test;
  2. import org.junit.Test;
  3. import com.hnu.scw.FirstCXFService;
  4. import com.hnu.scw.FirstCXFServicePortType;
  5. /**
  6. * 测试CXF框架的客户端
  7. * @author Administrator
  8. *
  9. */
  10. public class CXFClientTest {
  11. @Test
  12. public void printTest(){
  13. FirstCXFService firstCXFService = new FirstCXFService();
  14. FirstCXFServicePortType firstCXFServicePort = firstCXFService.getFirstCXFServicePort();
  15. String result = firstCXFServicePort.printReciveInfo( "my name is scw");
  16. System.out.println(result);
  17. }
  18. }


七:面向接口的编写WebService服务

接口:


  
  1. package com .hnu .scw;
  2. import javax .jws .WebMethod;
  3. import javax .jws .WebParam;
  4. import javax .jws .WebResult;
  5. import javax .jws .WebService;
  6. import javax .xml .ws .BindingType;
  7. import javax .xml .ws .soap .SOAPBinding;
  8. @ WebService( serviceName=" HelloServer")
  9. @BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
  10. public interface FirstServer {
  11. @ WebMethod( operationName=" sayHello")
  12. @WebResult(name= "returnMsg")
  13. public String printReciveInfo(@WebParam(name= "name")String name);
  14. }

服务器端实现类:


  
  1. package com.hnu.scw;
  2. import org.apache.cxf.frontend.ServerFactoryBean;
  3. /**
  4. * 基于CXF框架的服务端代码
  5. * @author Administrator
  6. *
  7. */
  8. public class FirstCXFService implements FirstServer{
  9. /**
  10. * web服务的方法
  11. * @param name
  12. * @return
  13. */
  14. public String printReciveInfo(String name){
  15. System.out.println( "客户端发送过来信息:" + name);
  16. return "服务器转发给你了"+ name;
  17. }
  18. public static void main(String[] args){
  19. ServerFactoryBean serverFactoryBean = new ServerFactoryBean();
  20. //设置访问地址
  21. serverFactoryBean.setAddress( "http://localhost:9090/firstService");
  22. //设置接口
  23. serverFactoryBean.setServiceClass(FirstServer.class);
  24. //设置实现类
  25. serverFactoryBean.setServiceBean( new FirstCXFService());
  26. //启动服务
  27. serverFactoryBean.create();
  28. }
  29. }

客户端类型的方法就不多说了,只是需要重新编译下载服务端的代码即可。

八:在WebService服务端添加输入输出监控日志

 方法:其实很简单,就是添加一些默认的拦截器就可以了

服务端代码:


  
  1. package com.hnu.scw;
  2. import org.apache.cxf.frontend.ServerFactoryBean;
  3. /**
  4. * 基于CXF框架的服务端代码
  5. * @author Administrator
  6. *
  7. */
  8. public class FirstCXFService {
  9. /**
  10. * web服务的方法
  11. * @param name
  12. * @return
  13. */
  14. public String printReciveInfo(String name){
  15. System.out.println( "客户端发送过来信息:" + name);
  16. return "服务器转发给你了"+ name;
  17. }
  18. public static void main(String[] args){
  19. ServerFactoryBean serverFactoryBean = new ServerFactoryBean();
  20. //设置访问地址
  21. serverFactoryBean.setAddress( "http://localhost:9090/firstService");
  22. //设置实现类
  23. serverFactoryBean.setServiceClass(FirstCXFService.class);
  24. //拦截器
  25. serverFactoryBean.getInInterceptors().add( new LoggingInInterceptor()); //拦截请求的链接,打印相关信息(谁调用)
  26. serverFactoryBean.getOutInterceptors().add( new LoggingOutInterceptor()); //拦截响应的链接,打印相关信息(返回)
  27. //启动服务
  28. serverFactoryBean.create();
  29. }
  30. }

九:设置WebService的版本是采取SOAP1.2版本

   在前面有说过,JDK是默认支持SOAP1.1版本的,而现在也有1.2版本,那如何将我们的WebService转变成1.2版本的呢?其实很简单,只需要添加一个注解即可:(如果采取的是接口编程,那么就放在接口名上即可)

@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
  

小知识:SOAP1.1和SOAP1.2的区别:

1)命名空间

2)标签变化

温馨提示:在开发中如果使用SOAP1.2实现WebService,在生成本地调用代码时,应该使用CXF提供wsdl2java命令。如果使用SOAP1.1实现WebService,在生成本地调用代码时,应该使用jdk提供wsimport命令。在实际项目中目前尽量使用SOAP1.1版本;

十:CXF和Spring框架的整合(重点知识)

步骤:

(1)导包:将下载下来的CXF中的lib目录中jar导入到web项目中的WEB-INF目录下的lib中(同样,还是需要将其中的WHICH_JARS这个文件删除,否则会报错),不需要额外导入Spring的包,因为在CXF的lib中已经包含有Spring的jar包,这个自己可以进行查看;

(2)创建WebService的类;

比如:


  
  1. package com.hnu.scw.webservice;
  2. import javax.jws.WebService;
  3. /**
  4. * 创建一个webservice服务类
  5. * @author scw
  6. *
  7. */
  8. @WebService
  9. public class MyWebService {
  10. /**
  11. * 创建WebService的调用方法
  12. * @param content
  13. * @return
  14. */
  15. public String hiMyService(String content){
  16. System. out.println( "客户端发送过来了:" + content);
  17. return "服务器返回:"+ content ;
  18. }
  19. }

(3)在WEB-INF目录下面创建一个cxf-servlet.xml-------------------这个就是对于webservice的管理


  
  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. xsi:schemaLocation= " http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  9. <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  10. <!-- 加载提供的服务 -->
  11. <jaxws:endpoint id="helloService" address="/mywebservice" implementor="com.hnu.scw.webservice.MyWebService"> </jaxws:endpoint>
  12. </beans>

(4)修改web.xml文件内容,将WebService的cxf-servlet.xml进行管理


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  3. <display-name>cxf </display-name>
  4. <!-- 配置cxf框架 cxf-servlet.xml -->
  5. <servlet>
  6. <servlet-name>cxf </servlet-name>
  7. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>cxf </servlet-name>
  11. <!-- 这里配置只针对/cxf/的这样链接进行管理,因为如果也配置成/*这样的话,也是可以,这只是更加便于管理而已 -->
  12. <url-pattern>/cxf/* </url-pattern>
  13. </servlet-mapping>
  14. </web-app>

(5)启动tomcat项目,测试CXF的配置是否成功


(6)配置Spring的配置文件中的beans.xml,专门进行bean的内容的管理(在项目的src下即可,这和Spring开发没什么不同)

主要是为了将WebService的类放入到Spring中进行管理


  
  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" xmlns:mvc= "http://www.springframework.org/schema/mvc"
  4. xmlns:context= "http://www.springframework.org/schema/context"
  5. xmlns:aop= "http://www.springframework.org/schema/aop" xmlns:tx= "http://www.springframework.org/schema/tx"
  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/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
  16. <bean id="myWebService" class="com.hnu.scw.webservice.MyWebService"> </bean> <!--这就是我的webservice类的路径-->
  17. </beans>

(7)修改之前的cxf-servlet.xml中的内容

原因:因为现在我们的bean放入到了Spring中进行管理,所以,我们直接引用Spring中的bean即可


  
  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. xsi:schemaLocation= " http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  9. <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  10. <!-- 加载提供的服务 ,注意看此时的implementor标签的写法,#表示的是引用Spring中的bean内容-->
  11. <jaxws:endpoint id="helloService" address="/mywebservice" implementor="#myWebService"> </jaxws:endpoint>
  12. </beans>

(8)修改web.xml内容,将Spring放入到容器进行管理


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  3. <display-name>cxf </display-name>
  4. <!-- 配置spring框架 beans.xml -->
  5. <context-param>
  6. <param-name>contextConfigLocation </param-name>
  7. <param-value>classpath:beans.xml </param-value>
  8. </context-param>
  9. <listener>
  10. <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
  11. </listener>
  12. <!-- 配置cxf框架 cxf-servlet.xml -->
  13. <servlet>
  14. <servlet-name>cxf </servlet-name>
  15. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>cxf </servlet-name>
  19. <!-- 这里配置只针对/cxf/的这样链接进行管理,因为如果也配置成/*这样的话,也是可以,这只是更加便于管理而已 -->
  20. <url-pattern>/cxf/* </url-pattern>
  21. </servlet-mapping>
  22. </web-app>

(9)启动tomcat,进行测试是否整合成功


总结:通过上面的步骤,我们的整合已经成功了,但是大家可能发现有很多地方不是很好,比如我们的cxf-servlet.xml是放在WEB-INF目录下,那么我们应该也像配置Spring的配置文件一样,放在src下这样的话将会更加好,所以,我们进行下面的修改

 (10)修改cxf-servlet.xml的加载路径----------这样我们就可以把这个xml放到src目录下了


  
  1. <!-- 配置cxf框架 cxf-servlet.xml -->
  2. <servlet>
  3. <servlet-name>cxf </servlet-name>
  4. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class>
  5. <!-- 配置cxf-servlet.xml的寻找的位置 -->
  6. <init-param>
  7. <param-name>config-location </param-name>
  8. <param-value>classpath:cxf-servlet.xml </param-value>
  9. </init-param>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>cxf </servlet-name>
  13. <!-- 这里配置只针对/cxf/的这样链接进行管理,因为如果也配置成/*这样的话,也是可以,这只是更加便于管理而已 -->
  14. <url-pattern>/cxf/* </url-pattern>
  15. </servlet-mapping>

--------------------------------------------------------------------------------------------

项目整体结构如下:


------------------------------------------------------------------------------------------------

十一:项目实践

前提内容:这是一个比较经典的物流供应项目,网上可以找到源码的。只不过,既然我们学得是WebService,那么肯定就要进行相应的改造的,所以,针对里面的一个物流查询模块,来设计成为一个能够让其他系统都能调用的功能(这样,情景引入的问题是不是就解决了)。

描述:针对项目中的,物流查询模块改造成一个WebService服务,方便其他的模块或者系统进行相应的使用,实现一种跨平台的功能。

步骤:

环境:eclipse + maven + mysql (其他的编辑器什么的都行,这个完全根据自身习惯即可,没有要求)

(1)导入项目内容--------这个不多说,就是导入maven项目,然后把相应的数据库内容在本地生成即可(都在我的百度云里面了)

(2)查看原始内容(重点关注我标识的部分,也就是我们要进行改造的类)



我们就改造下面这个方法:这个方法的功能就是,通过物流的ID,来查询到它的物流信息


提示:大家稍微看一下这个类,基本了解是干嘛的就可以了哈~~

改造其类为WebService类步骤(重点来了):

(1)将需要修改为WebService的类,添加注解 @WebService进行标识


(2)添加操作对应的DAO类的额外bean依赖


  
  1. //给WebService使用
  2. @WebMethod(exclude= true)
  3. public void setExportDao(ExportDao exportDao) {
  4. this.exportDao = exportDao;
  5. }

分析:

1:添加@WebMethod(exclude=true)的作用:防止给调用者看到这个方法,因为这个方法只是给spring来进行注入bean依赖的;

2:大家可能注意到一个问题了,在spring开发中,

我们一般是这样。

但是,千万注意一下,这个也是要的,而为什么又多了一个set注入,是因为,这是专门用户webservice注入的,所以,一定要区分开原因,所以这两者都是需要存在的。也就是下面的这样的代码:


  
  1. //给spring service使用dao
  2. @Resource
  3. ExportDao exportDao;
  4. //给WebService使用
  5. @WebMethod(exclude= true)
  6. public void setExportDao(ExportDao exportDao) {
  7. this.exportDao = exportDao;
  8. }

(3)将其他不进行提供webservice调用的方法进行注解屏蔽,而只保留webservice能够调用的方法。如下所示:


  
  1. @WebMethod(exclude=true)
  2. public List<Export> find(Map paraMap) {
  3. return exportDao.find(paraMap);
  4. }
  5. //WebService调用
  6. public Export get(String id) {
  7. return exportDao. get(id);
  8. }

(4)添加cxf-servlet.xml文件

目录:

cxf-servlet.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. xsi:schemaLocation= " http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  9. <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  10. <!-- 发布WebService 参数:访问地址address,实现类 implementor -->
  11. <bean id="exportService" class="cn.itcast.jk.service.impl.ExportServiceImpl">
  12. <property name="exportDao" ref="exportDaoImpl"/>
  13. </bean>
  14. <jaxws:endpoint address="/ExportServiceImpl" implementor="#exportService"/>
  15. </beans>

分析:现在再回头看一下第(2)步中,额外添加的set注入,是不是就明白原因了呢?这上面的知识都是我上面讲过的,所以,不懂的就回头再去看看吧。

(5)修改web.xml,添加对cxf-servlet.xml的加载


  
  1. <!-- 3.webService CXF -->
  2. <servlet>
  3. <servlet-name>cxf </servlet-name>
  4. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class>
  5. <init-param>
  6. <param-name>config-location </param-name>
  7. <param-value>classpath:cxf-servlet.xml </param-value>
  8. </init-param>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>cxf </servlet-name>
  12. <url-pattern>/cxf/* </url-pattern>
  13. </servlet-mapping>

(6)在pom.xml中添加对CXF框架的依赖


  
  1. <!-- 整合CXF WebService框架 -->
  2. <dependency>
  3. <groupId>org.apache.cxf </groupId>
  4. <artifactId>cxf-rt-frontend-jaxws </artifactId>
  5. <version>3.0.2 </version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.cxf </groupId>
  9. <artifactId>cxf-rt-transports-http </artifactId>
  10. <version>3.0.2 </version>
  11. </dependency>

分析:通过上面的步骤,基本上就改造完成了,那么下面就来进行实际的使用:(这里通过ajax的形式来进行,也是我们开发中用的相对较多的方式)

(7)ajax来调用webservice类的形式

具体的内容:大家就看代码中:src\main\webapp\WEB-INF\pages\cargo\export目录下的ajaxExport.jsp页面内容吧

(8)进行测试。(当然,这个最好是在整合完成CXF和Spring,即改造完webservice类的时候就测试一下比较好)

针对这个项目的话,我把最初的项目源码和改造后的代码以及数据库内容,两个版本的都放入了百度云,而且把该博文中相关的代码都放入了这里面,供大家进行下载。

链接:https://pan.baidu.com/s/1_exUqQeg3h2OwGFhDa2dmg          密码:60fq

总结:我想没有比这篇博文更加详细的介绍了的吧。^_^~!WebService其实开发起来并不难,而且功能还是非常强大,对于如果存在着异构系统之间的调用的话,还是挺实用的。所以,对于这部分的内容,就介绍到这里了,欢迎大家的关注哦~

Web项目调用webservice服务 一、发布WebService服务(服务端) 1.创建一个java工程,不需要导入jar包。工程完全完成后的结构如图: 2. 创建接口,即HelloWorld.java文件,代码如下: package com.test; import javax.jws.WebService; @WebService public interface HelloWorld { 阅读详情

相关推荐

PCIe设备内存访问实战:从ioremap到DMA映射的完整流程解析

本文深入解析了PCIe设备内存访问的完整流程,涵盖从CPU通过ioremap访问设备寄存器,到设备通过DMA映射高效读写主机内存的核心机制。详细探讨了虚拟地址、物理地址与总线地址的转换关系,对比了一致性与流式DMA映射的适用场景及同步要点,并阐述了IOMMU在安全与效率中的作用,为驱动开发者提供了实战代码与关键陷阱分析。

weixin_29201933的博客 505

WebService 入门教程(Java)

服务发布 文件结构 Dog类 package com.test.TestApp; public class Dog { public String name; } App类 package com.test.TestApp; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class App { //该方法就是要暴露给其他应用程序调用的方法 public String

qq_25775675的博客 2878

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

关于WebService中用到的QName详解

Implements: Serializable zh_cn QName 表示 XML 规范中定义的限定名称:XML 模式第二部分:Datatypes specification、Namespaces in XML、Namespaces in XML 勘误表。 QName 的值包含名称空间 URI、本地部分和前缀。 QName 中包括前缀,以保留词汇信息

涂作权的博客 3万+

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 390

量子城域网建设设备系列(三):网络管理系统(NMS)

本文对量子网络中的网络管理系统进行了初步的介绍。

量子领域相关话题 2013

利用WebService进行数据更新[转]

*****************************************************     基本思路     *****************************************************     客户端为Access数据库,服务器端为Oracle。当客户端取出需要传输的数据集(DataSet)后,调用服务器端的WebService的...

weixin_34375233的博客 330

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

webservice的基础知识以及入门案例1

一 webService 1.1 webservcie webservice是一种跨操作系统和跨语言的数据调用、数据交换的一种服务技术。用于网络通信,多台机器之间的数据交互。 最大优点:webservice最大的好处是客户端与服务端语言的兼容性及交互时候可以传递对象。 1.2 webservice与socket的区别 1. socket是在网络中的数据传输层,采用的是TCP/UDP协议,webservice是属于应用层,采用的是http协议 2. socket建立是长连接,webservice.

健康平安的活着的专栏 2387

科研绘图系列:R语言circos图(circos plot)

科研绘图系列:R语言circos图(circos plot)

专注生信领域 3433

手把手教你学Simulink--基于车联网与智能交通系统的场景实例:基于车联网(V2X)的实时路况信息共享与处理

《基于Simulink的车联网(V2X)实时路况共享系统仿真》摘要:本文详细介绍使用Simulink构建V2X智能交通系统的完整方法。系统包含交通路网建模、V2X通信实现(支持DSRC/C-V2X标准)、多源路况信息融合、动态路径规划等核心模块。通过对比实验,验证V2X可使平均车速提升52%,行程时间缩短34%,显著提升交通效率。文章还探讨了AI预测调度、车辆编队等高级应用,为智慧交通系统开发提供实用参考。所需工具包括Simulink、SimEvents及无线通信工具箱等。

MHD0815的博客 739

手把手教你如何快速玩转 WebService(包含项目实践)

情景引入: 时间:早晨 8 : 00 am 小白:起床起床,,,公司又来需求了,你还在睡觉,快点起来~! 我:大惊小怪,又怎么了呢?小白,别一惊一乍的,打扰我的美梦 小白:公司给了个新需求,你还记得,咱们上次做的那个项目吗? 我:记得,怎么了呢?不是都已经上线了吗? 小白:对呀,但是,与我们合作的那个公司,他们想把我们项目里面的物流查询功能,放到他们自己开发的一个系统里面去,说这样方便他们自己进行查询,要不然,老是需要额外登录我们的系统,挺麻烦的,而还要特别的给他们一个账号进行管理。所以,他们的

dream317 1075

Windows VHD的新玩法——设置任意挂载点

vhd 挂载隐藏的虚拟分区 详细过程 分别使用CreateVirtualDisk和OpenVirtalDisk来创建和打开虚拟磁盘文件。 使用AttachVirtualDisk,必须具有管理员权限才能成功执行此步骤。 初始化设备(延时Sleep),获取附加 VHD 的 UNC 路径:\\.\PhysicalDrive# 。 使用FindFirstVolume/FindNextVolume枚举已安装的卷以查找虚拟磁盘上的卷。 使用SetVolumeMountPoint将卷挂载到文件夹或者设

圣三一 2587

WebService 教程(包含项目实践)

情景引入: 时间:早晨 8 : 00 am 小白:起床起床,,,公司又来需求了,你还在睡觉,快点起来~! 我:大惊小怪,又怎么了呢?小白,别一惊一乍的,打扰我的美梦 小白:公司给了个新需求,你还记得,咱们上次做的那个项目吗? 我:记得,怎么了呢?不是都已经上线了吗? 小白:对呀,但是,与我们合作的那个公司,他们想把我们项目里面的物流查询功能,放到他们自己开发的一个系统里面去,说这样方便...

林中静月下仙的博客 1137

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

手把手教你SSM框架开发WebService服务

手把手教你SSM框架中开发WebService服务手把手教你SSM框架中开发WebService服务一、Webservice简单介绍二、Webservice相关术语三、SSM框架下整合cxf四、客户端五、使用CXF时因缺少对应jar包而报错问题汇总总结 手把手教你SSM框架中开发WebService服务 最近在做一个智能门禁的项目,需要把组织架构和人员信息同步到门禁系统,所以需要开发一个webservice服务供数据平台这边来调用同步数据~ 一、Webservice简单介绍 WebService,顾名思义

技术心路 1665

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

手把手教你如何创建Webservice并发布,部署到iis,客户端调用

手把手教你如何创建Webservice并发布,部署到iis,客户端调用 一、WebService基本介绍: 1.什么是WebService? WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 2.WebService有什么好处? 可以跨编程语言、可以跨操作系统、可以远程调用。 二、WebService开发: 1.新建项目: 添加web服务: 在添加的web服务中添加一个求和的方法:(注:必须在方法上面添加 [WebMethod]才会在网页上显示出来...

hewusheng10的专栏 5393

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

springboot整合搭建webservice项目

webservice分为客户端可服务端。服务端顾名思义就是对外提供服务接口的。而客户端是调用服务端提供的服务的,是根据服务端提供的服务和定义生成客户端代码,然后调用服务端的接口,而具体底层调用处理我们无须关注这些代码,因为将有插件生成这些代码。

weixin_43831997的博客 4703

玩转WebService -- 用Intellij IDEA + java搭建WebService项目并演示请求响应

上篇博客给大家整理了WebService的基本概念及组成元素,对概念或原理还不太清楚的可以去看看。 这篇我们用Intellij IDEA来搭建一个WebService,并看看如何请求。 首先,new project, 选择WebService项目,并选择Apache Axis: 点击next,随便去个项目名称,比如webservice。 finish之后,会有一些示例文件,默认有...

一只猿的自我修养 2881

用 Eclipse 开发 WebService 项目

用 Eclipse 开发 WebService 项目 一、创建 Service 1. 在 Eclipse 下新建一个动态Web项目   2. 在项目中新建一个 “SayHello” 类   3. 编写 SayHello 类的代码 package org.sunny.service; //包不要引用错了 import javax.jws.WebService; import ja...

iw1210的专栏 4370

教你创建一个简单的WebService项目

1、什么是WebService? Web service简单来说是跨平台调用的些应用程序。 2、WebService的优缺点有哪些? ----------------优点----------------- (1).可操作分布式应用程序,可实现跨平台的可互操作性 (2).普遍性、使用HTTP和XML进行通信 (3).穿越防火墙通信 (4).通过 SOAP 协议实现异地调用 -----...

weixin_39309402的博客 5596

手把手教你如何使用IDEA开发WebService服务器端,顺便填了一些莫名其妙的坑

PS:后面有github地址,如有不懂或者想复制配置文件和代码,可看demo 我的JDK是1.8,开发环境是windows7,使用的IDEA版本是   按下图先新建项目 此步骤下来生成的web/WEB-INF/web.xml是不完整的,此处有坑,请大家修改如下:   &lt;?xml version="1.0" encoding="UTF-8"?&gt; &l...

weixin_41045798的博客 518

Retrofit WebService 实践

前言 作为 Android 开发,平时和后端聊得最多的除了喝酒就是接口。常用语:Restful 和 WebService,前者现在聊得多,后者以前聊得多。 默认含义分别为: Restful:HTTP 协议 和 JSON 格式 WebService:特指 Soap 协议 和 XML 格式 针对基于 HTTP 协议且格式为 JSON 的 Restful 接口,Android 客户端一般采用 Retrofit + Gson/Moshi 的方案解决。 而针对 Soap 协

1 3237

idea启动webservice_手把手教你如何使用IDEA开发WebService服务器端,顺便填了一些莫名其妙的坑(原创)...

PS:后面有github地址,如有不懂或者想复制配置文件和代码,可看demo我的JDK是1.8,开发环境是windows7,使用的IDEA版本是按下图先新建项目此步骤下来生成的web/WEB-INF/web.xml是不完整的,此处有坑,请大家修改如下:在HelloWorld.java编写代码如下:import javax.jws.WebService;@WebServicepublic class...

weixin_34673225的博客 630
上一篇: 基于大数据体系构建数据仓库——第一节——认识数据仓库
下一篇: Winform 窗体控件最大化自适应
Summer_Chun
博客等级 码龄7年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值