加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService之WSDL和SOAP实例(基于JAVA)

发布时间:2020-12-16 23:04:06 所属栏目:安全 来源:网络整理
导读:? SOAP Java WebService Servlet Web? 开发环境:jdk1.6 + Tomcat 6.0.18 + MyEclipse6.0 首先是使用WSDL协议实现: 这里使用XFire XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其
?
SOAP Java WebService Servlet Web?
开发环境:jdk1.6 + Tomcat 6.0.18 + MyEclipse6.0

首先是使用WSDL协议实现:这里使用XFire
XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其原理是以接口反射机制自动取得远程方法的
WSDL是一个用来描述Web服务和说明如何与Web服务通信的XML语言

准备:开发之前请先到官网(http://xfire.codehaus.org/Download)下载xfire-distribution-1.2.6.zip并解压缩

(1)、新建一个Web项目(服务端),名称为XFireWebService,其目的是为了测试WebService服务端
为工程添加XFire支持的类库,把xfire-1.2.6里lib所有jar和xfire-all-1.2.6.jar拷贝到工程lib里

(2)、把XFire加载到系统中来,增加web.xml的配置信息
Java代码

?

  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?????
  3. ??
  4. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  5. ??<servlet>??
  6. ????<servlet-name>XFireServlet</servlet-name>??
  7. ????<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>??
  8. ????<load-on-startup>0</load-on-startup>??
  9. ??</servlet>??
  10. ??<servlet-mapping>??
  11. ????<servlet-name>XFireServlet</servlet-name>??
  12. ????<url-pattern>/servlet/XFireServlet/*</url-pattern>??
  13. ??</servlet-mapping>??
  14. ??<servlet-mapping>??
  15. ????<servlet-name>XFireServlet</servlet-name>??
  16. ????<url-pattern>/services/*</url-pattern>??
  17. ??</servlet-mapping>??
  18. ??<welcome-file-list>??
  19. ????<welcome-file>index.jsp</welcome-file>??
  20. ??</welcome-file-list>??
  21. </web-app>??


(3)、创建Web服务接口,声明该Web服务对外暴露的接口
Java代码

?

  1. package?com.test.ws;??
  2. import?java.util.List;??
  3. /**?
  4. ?*?<p>Title:?IHelloService</p>?
  5. ?*?<p>Description:?定义接口</p>?
  6. ?*/??
  7. public?interface?IHelloService?{??????
  8. ????public?String?getTestString(String?str);??????
  9. ????public?ExceedVO?getTestObject(EnterVO?vo);????
  10. ????public?List?getTestList(List?list);??
  11. }??


(4)、创建Web服务实现类,为Web服务接口提供实现
Java代码

?

  1. package?com.test.ws;??
  2. import?java.util.ArrayList;??
  3. import?java.util.List;??
  4. /**?
  5. ?*?<p>Title:?HelloServiceImpl</p>?
  6. ?*?<p>Description:?接口实现</p>?
  7. ?*/??
  8. public?class?HelloServiceImpl?implements?IHelloService?{??
  9. ??????
  10. ????@Override??
  11. ????public?String?getTestString(String?str)?{??
  12. ????????return?"Hello"?+?str;??
  13. ????}??
  14. ??????
  15. ????@Override??
  16. ????public?ExceedVO?getTestObject(EnterVO?vo)?{??
  17. ????????ExceedVO?revo?=?new?ExceedVO();??
  18. ????????revo.setDescStr("名称:"+vo.getName()+"年龄:"+vo.getAge());??
  19. ????????return?revo;??
  20. ????}??
  21. ??????
  22. ????@Override??
  23. ????public?List?getTestList(List?list)?{??????
  24. ????????List<EnterVO>?users?=?new?ArrayList<EnterVO>();???????
  25. ????????for(int?i=0;?i<9;?i++){??
  26. ????????????EnterVO?user?=?new?EnterVO("姓名"+i,?i);??
  27. ????????????users.add(user);??
  28. ????????}??
  29. ????????return?users;??
  30. ????}??
  31. }??


(5)、这两个类是具体的业务实现类,对业务方法的具体实现放在里面
Java代码

?

  1. package?com.test.ws;??
  2. import?java.io.Serializable;??
  3. /**?
  4. ?*?<p>Title:?EnterVO</p>?
  5. ?*?<p>Description:?入参对象</p>?
  6. ?*/??
  7. public?class?EnterVO?implements?Serializable?{??
  8. ????private?static?final?long?serialVersionUID?=?1L;??????
  9. ????private?String?name;??????
  10. ????????private?int?age;?????
  11. ????public?String?getName()?{??
  12. ????????return?name;??
  13. ????}?????
  14. ????public?void?setName(String?name)?{??
  15. ????????this.name?=?name;??
  16. ????}?????
  17. ????public?int?getAge()?{??
  18. ????????return?age;??
  19. ????}?????
  20. ????public?void?setAge(int?age)?{??
  21. ????????this.age?=?age;??
  22. ????}?????
  23. ????public?EnterVO(String?name,?int?age)?{??
  24. ????????this.name?=?name;??
  25. ????????this.age?=?age;??
  26. ????}?????
  27. ????public?EnterVO()?{?}??
  28. }??
  29. ??
  30. package?com.test.ws;??
  31. import?java.io.Serializable;??
  32. /**?
  33. ?*?<p>Title:?ExceedVO</p>?
  34. ?*?<p>Description:?出参对象</p>?
  35. ?*/??
  36. public?class?ExceedVO?implements?Serializable?{??
  37. ????private?static?final?long?serialVersionUID?=?1L;??????
  38. ????private?String?descStr;??
  39. ????public?String?getDescStr()?{??
  40. ????????return?descStr;??
  41. ????}??
  42. ????public?void?setDescStr(String?descStr)?{??
  43. ????????this.descStr?=?descStr;??
  44. ????}??
  45. }??


(6)、在src目录下新建一个META-INF文件夹里包含xfire/service.xml该文件是XFire框架的服务发布文件
Java代码

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <!--?服务发布文件?-->??
  3. <beans?xmlns="http://xfire.codehaus.org/config/1.0">??
  4. ????<service>?<!--?service标签和它所包含的xml内容为发布成Web服务的POJO提供完整的描述?-->??
  5. ????????<name>HelloService</name>?<!--?Web服务被发布时所采用的唯一名称?-->??
  6. ????????<namespace>http://test/HelloService</namespace>?<!--?Web服务发布时所使用的命名空间?-->??
  7. ????????<serviceClass>com.test.ws.IHelloService</serviceClass>?<!--?Web服务接口类的全名?-->??
  8. ????????<implementationClass>com.test.ws.HelloServiceImpl</implementationClass>?<!--?Web服务实现类的全名?-->??
  9. ????????<!--?不需要接口时,把业务写在serviceClass标签中?-->??
  10. ????</service>??
  11. </beans>??


(7)、注意:当用到List等集合类型时,需要定义Mapping关系
必须与接口同名后缀.aegis.xml,而且要与接口同一位置
Java代码

?

  1. <mappings?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  2. ??xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">??
  3. ????<!--?XFire可以支持基本类型,但针对集合类型时需要特殊配置?-->??
  4. ????<mapping>??
  5. ?????????<method?name="getTestList">?<!--?需要配置的方法名?-->??
  6. ????????????<!--?index="0"代表方法的参数的序号0即第一个参数,componentType属性代表集合参数内包含的类型?-->??
  7. ????????????<parameter?index="0"?componentType="java.lang.String"?/>???
  8. ????????????<!--?配置返回类型,componentType属性代表返回的集合中所包含的类?-->??
  9. ????????????<return-type?componentType="com.test.ws.EnterVO"?/>???
  10. ????????</method>??????????
  11. ???</mapping>?????
  12. </mappings>??
???
web.xml和service.xml都可以通过IDE自动生成,也可以手写

(8)、到这步webService服务端就基本完成
部署项目,启动Tomcat,测试一下wsdl,访问http://localhost:8080/XFireWebService/services/HelloService?wsdl
如果能正确显示wsdl文件,说明刚才的部署成功了!!!

(9)、再建一个Web项目(客户端),名称为XFireWebClient,其目的是用来调用一个webService服务
将XFire的库文件拷贝到Web项目的WEB-INFlib目录下,同时需要将服务器端发布的服务打包发布给客户端,发布给客户端的代码只需要打包接口和参数类即可,实现类不必打包到客户端
这里发布的jar包名称为IHelloService.jar,里面包含IHelloService、EnterVO、ExceedVO这三个类

(10)、在这个Web项目里面新建一个Servlet作为测试的Servlet,名称为ClientTestServlet.java
在web.xml里面配置好这个Servlet后,就可以在Servlet里面写webService调用的代码了
Java代码

?

  1. package?com.test.ws;??
  2. import?java.io.IOException;??
  3. import?java.net.MalformedURLException;??
  4. import?java.util.ArrayList;??
  5. import?java.util.List;??
  6. import?javax.servlet.ServletException;??
  7. import?javax.servlet.http.HttpServlet;??
  8. import?javax.servlet.http.HttpServletRequest;??
  9. import?javax.servlet.http.HttpServletResponse;??
  10. import?org.codehaus.xfire.XFire;??
  11. import?org.codehaus.xfire.XFireFactory;??
  12. import?org.codehaus.xfire.client.XFireProxyFactory;??
  13. import?org.codehaus.xfire.service.Service;??
  14. import?org.codehaus.xfire.service.binding.ObjectServiceFactory;??
  15. /**?
  16. ?*?<p>Title:?ClientTestServlet</p>?
  17. ?*?<p>Description:?测试Servlet</p>?
  18. ?*/??
  19. public?class?ClientTestServlet?extends?HttpServlet?{??
  20. ??
  21. ????private?static?final?long?serialVersionUID?=?1L;??
  22. ??
  23. ????public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)??
  24. ????????????throws?ServletException,?IOException?{??
  25. ??????????
  26. ????????request.setCharacterEncoding("UTF-8");????
  27. ????????Service?serviceModel?=?new?ObjectServiceFactory().create(IHelloService.class);?????????
  28. ????????XFire?xfire?=?XFireFactory.newInstance().getXFire();??
  29. ????????XFireProxyFactory?factory?=?new?XFireProxyFactory(xfire);???????
  30. ????????String?serviceUrl?=?"http://localhost:8080/XFireWebService/services/HelloService";??
  31. ????????IHelloService?client?=?null;??
  32. ????????try?{??
  33. ????????????client?=?(IHelloService)?factory.create(serviceModel,?serviceUrl);??
  34. ????????}?catch?(MalformedURLException?e)?{??
  35. ????????????e.printStackTrace();??
  36. ????????}??????
  37. ??????????
  38. ????????String?str?=?client.getTestString("Beijing");??
  39. ????????request.setAttribute("str",?str);??
  40. ??????????
  41. ????????EnterVO?enterVO?=?new?EnterVO();??
  42. ????????enterVO.setName("Yaodi");??
  43. ????????enterVO.setAge(26);??
  44. ????????ExceedVO?vo?=?client.getTestObject(enterVO);??
  45. ????????request.setAttribute("vo",?vo);??
  46. ??????????
  47. ????????List<String>?al?=?new?ArrayList<String>();???
  48. ????????al.add("111");???
  49. ????????al.add("222");??
  50. ????????al.add("333");??
  51. ????????List?list?=?client.getTestList(al);??
  52. ????????request.setAttribute("list",?list);???????
  53. ??????????
  54. ????????request.getRequestDispatcher("/result.jsp").forward(request,?response);??
  55. ????}??
  56. ??
  57. ????public?void?doPost(HttpServletRequest?request,?IOException?{??
  58. ????????doGet(request,response);??
  59. ????}??
  60. ??????
  61. }??


客户端的web.xml如下所示:
Java代码

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <web-app?version="2.5"???
  3. ????xmlns="http://java.sun.com/xml/ns/javaee"???
  4. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  5. ????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  6. ????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  7. ??<servlet>??
  8. ????<servlet-name>ClientTestServlet</servlet-name>??
  9. ????<servlet-class>com.test.ws.ClientTestServlet</servlet-class>??
  10. ??</servlet>??
  11. ??<servlet-mapping>??
  12. ????<servlet-name>ClientTestServlet</servlet-name>??
  13. ????<url-pattern>/ClientTest.do</url-pattern>??
  14. ??</servlet-mapping>??
  15. ??<welcome-file-list>??
  16. ????<welcome-file>ClientTest.do</welcome-file>??
  17. ??</welcome-file-list>??
  18. </web-app>??


(11)、注意:XFireWebService项目里的IHelloService.aegis.xml文件,也要放到XFireWebClient项目中来,位置与ClientTestServlet.java同级

(12)、Servlet返回的结果页面:result.jsp
Java代码

?

  1. <%@?page?language="java"?pageEncoding="UTF-8"%>??
  2. <%@?taglib?prefix="c"?uri="http://java.sun.com/jsp/jstl/core"%>??
  3. <%@?page?isELIgnored="false"%>??
  4. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
  5. <html>??
  6. ??<head>??
  7. ????<title>测试客户端</title>??
  8. ??</head>????
  9. ??<body>??
  10. ????测试客户端!!!<br>??
  11. ????String:${str}?<br>??
  12. ????Object:${vo.descStr}?<br>??
  13. ????List:<br>??
  14. ????<c:forEach?items="${list}"?var="list">??
  15. ????????${list.name}?---?${list.age}?<br>??
  16. ????</c:forEach>??
  17. ??</body>??
  18. </html>??


(13)、同样将这个Web项目发布,同时启动XFireWebService和XFireWebClient这两个应用,然后在地址栏里面输入http://localhost:8080/XFireWebClient/
此时会调用客户端的Servlet,然后调用其doGet方法,如果正常的话,可以看到页面输出结果了(*^__^*)


问题:在项目中使用XFire发布服务,在本地测试一切正常,但是传到服务器上,发现List的第一个元素是没有内容的,后面的元素内容显示正常,
通过调试服务端没有问题,是往客户端之间传输时丢失的,目前的解决办法比较2,是在List前面加了一条垃圾数据,故意把List的第一个元素挤下来。
希望有人能帮我解答!!!谢谢


其次是使用SOAP协议实现:有时需要其它语言做服务端,java做客户端,就要用到SOAP获取WebService了
SOAP简单对象访问协议是一种轻量的、简单的、基于 XML 的协议,它被设计成在WEB上交换结构化的和固化的信息

这里演示的例子服务端和客户端都是java

首先从网站http://xml.apache.org/soap/index.html下载soap,解压得到soap.war
把soap.war放到Tomcatwebapps目录下

(1)、新建一个Web项目(服务端)名为SoapService

(2)、编写服务端代码HelloWorldService.java
Java代码

?

  1. package?HelloWorld;??
  2. /**?
  3. ?*?<p>Title:?HelloWorldService</p>?
  4. ?*?<p>Description:?服务端</p>?
  5. ?*/??
  6. public?class?HelloWorldService?{??
  7. ????public?String?getMessage(){??
  8. ????????return?"Hello?World!!!";??
  9. ????}?????
  10. ????public?String?getMessage(String?str1,?String?str2)?{???
  11. ????????return?"Hello?World!?"?+?str1?+?"&"?+?str2;???
  12. ????}???
  13. }??

编写完成后,将HelloWorldService发布jar到Tomcatlib目录中

(3)、SOAP服务的发布
启动Tomcat自动将soap.war解压,访问http://localhost:8080/soap/admin/,会出现soap的管理页面
注意:这里会出现错误是因为在Tomcatlib目录下缺少sun的mail.jar
进入Deploy,填写如下信息:
ID: hello
Scope: Request
Methods getMessage
Provider Type: Java
Java Provider Provider Class: HelloWorld.HelloWorldService
Java Provider Static: NO
确认发布,可以点List查看已发布服务!

(4)、再建一个Web项目(客户端)名为SoapClient
为工程增加4个jar文件:xerces、soap、activation、mail

(5)、在这个Web项目里面新建一个Servlet作为测试的Servlet,名称为HelloWorldClientServlet.java
在web.xml里面配置好这个Servlet后,就可以在Servlet里面写webService调用的代码了
Java代码

?

  1. package?HelloWorld;??
  2. import?java.io.IOException;??
  3. import?java.net.URL;??
  4. import?java.util.Vector;??
  5. import?javax.servlet.ServletException;??
  6. import?javax.servlet.http.HttpServlet;??
  7. import?javax.servlet.http.HttpServletRequest;??
  8. import?javax.servlet.http.HttpServletResponse;??
  9. import?org.apache.soap.Constants;??
  10. import?org.apache.soap.Fault;??
  11. import?org.apache.soap.SOAPException;??
  12. import?org.apache.soap.rpc.Call;??
  13. import?org.apache.soap.rpc.Parameter;??
  14. import?org.apache.soap.rpc.Response;??
  15. /**?
  16. ?*?<p>Title:?HelloWorldClientServlet</p>?
  17. ?*?<p>Description:?测试Servlet</p>?
  18. ?*/??
  19. public?class?HelloWorldClientServlet?extends?HttpServlet?{??
  20. ????private?static?final?long?serialVersionUID?=?1L;??
  21. ????public?void?doGet(HttpServletRequest?request,?IOException?{??
  22. ????????request.setCharacterEncoding("UTF-8");????????????
  23. ????????String?endPoint?=?"http://localhost:8080/soap/servlet/rpcrouter";?//url是固定的,带参数绑定??
  24. ????????Call?call?=?new?Call();?//创建一个RPC?Call??
  25. ????????call.setTargetObjectURI("hello");?//远程的服务名??
  26. ????????call.setMethodName("getMessage");?//访问方法??
  27. ????????call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);?//设置编码风格?????????
  28. ????????//发布带参数的服务??
  29. ????????Vector?params?=?new?Vector();??
  30. ????????Parameter?p1?=?new?Parameter("name",?String.class,?"关羽",?null);???
  31. ????????Parameter?p2?=?new?Parameter("name2",?"张飞",?null);???
  32. ????????params.addElement(p1);??
  33. ????????params.addElement(p2);???
  34. ????????call.setParams(params);???????
  35. ????????URL?url?=?new?URL(endPoint);?//SOAP服务的网址,开始发送RPC请求,并返回服务端的应答??
  36. ????????Response?resp?=?null;??
  37. ????????try?{?//检查应答报中文是否有错(有错就打印出错信息,没错就打印返回信息)??
  38. ????????????resp?=?call.invoke(url,?"");??
  39. ????????}?catch?(SOAPException?e)?{??
  40. ????????????e.printStackTrace();??
  41. ????????}???
  42. ????????if(resp.generatedFault()){??
  43. ????????????Fault?fault?=?resp.getFault();??
  44. ????????????System.out.println("The?Following?Error?Occured:");??
  45. ????????????System.out.println("Fault?Code="?+?fault.getFaultCode());??
  46. ????????????System.out.println("Fault?String="?+?fault.getFaultString());??
  47. ????????}?else?{??
  48. ????????????Parameter?result?=?resp.getReturnValue();??
  49. ????????????System.out.println(result.getValue());??
  50. ????????????request.setAttribute("str",?result.getValue());??
  51. ????????}?????????
  52. ????????request.getRequestDispatcher("/result.jsp").forward(request,?response);???????
  53. ????}?????
  54. ????public?void?doPost(HttpServletRequest?request,response);??
  55. ????}??
  56. }??

客户端的web.xml如下所示:
Java代码

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <web-app?version="2.5"???
  3. ????xmlns="http://java.sun.com/xml/ns/javaee"???
  4. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  5. ????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  6. ????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  7. ??<servlet>??
  8. ????<servlet-name>HelloWorldClientServlet</servlet-name>??
  9. ????<servlet-class>HelloWorld.HelloWorldClientServlet</servlet-class>??
  10. ??</servlet>??
  11. ??<servlet-mapping>??
  12. ????<servlet-name>HelloWorldClientServlet</servlet-name>??
  13. ????<url-pattern>/HelloWorldClientServlet.do</url-pattern>??
  14. ??</servlet-mapping>??
  15. ??<welcome-file-list>??
  16. ????<welcome-file>HelloWorldClientServlet.do</welcome-file>??
  17. ??</welcome-file-list>??
  18. </web-app>??


(6)、Servlet返回的结果页面:result.jsp
Java代码

?

  1. <%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
  2. <%@?taglib?prefix="c"?uri="http://java.sun.com/jsp/jstl/core"%>??
  3. <%@?page?isELIgnored="false"%>??
  4. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
  5. <html>??
  6. ??<head>??
  7. ????<title>SOAP测试客户端</title>??
  8. ??</head>??
  9. ????
  10. ??<body>??
  11. ????SOAP测试客户端!!!<br>??
  12. ????String:${str}?<br>??
  13. ??</body>??
  14. </html>??


(7)、运行客户端,测试是否通过
同时启动SoapService和SoapClient这两个应用,访问http://localhost:8080/SoapClient/
应该可以看到返回的内容,则证明配置和测试成功,以后就可以发布自己的SOAP服务了!
  • XFireWebService.rar (18 KB)
  • 下载次数: 646
  • SoapWebService.rar (13.1 KB)
  • 下载次数: 933

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读