soap学习

来源:互联网 发布:js地图效果 点击省份 编辑:程序博客网 时间:2024/05/17 01:21
其次是使用SOAP协议实现:有时需要其它语言做服务端,java做客户端,就要用到SOAP获取WebService了
SOAP简单对象访问协议是一种轻量的、简单的、基于 XML 的协议,它被设计成在WEB上交换结构化的和固化的信息 

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

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

(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到Tomcat\lib\目录中 

(3)、SOAP服务的发布 
启动Tomcat自动将soap.war解压,访问http://localhost:8080/soap/admin/,会出现soap的管理页面 
注意:这里会出现错误是因为在Tomcat\lib\目录下缺少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, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.         request.setCharacterEncoding("UTF-8");            
  24.         String endPoint = "http://localhost:8080/soap/servlet/rpcrouter"; //url是固定的,带参数绑定  
  25.         Call call = new Call(); //创建一个RPC Call  
  26.         call.setTargetObjectURI("hello"); //远程的服务名  
  27.         call.setMethodName("getMessage"); //访问方法  
  28.         call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //设置编码风格         
  29.         //发布带参数的服务  
  30.         Vector params = new Vector();  
  31.         Parameter p1 = new Parameter("name", String.class"关羽"null);   
  32.         Parameter p2 = new Parameter("name2", String.class"张飞"null);   
  33.         params.addElement(p1);  
  34.         params.addElement(p2);   
  35.         call.setParams(params);       
  36.         URL url = new URL(endPoint); //SOAP服务的网址,开始发送RPC请求,并返回服务端的应答  
  37.         Response resp = null;  
  38.         try { //检查应答报中文是否有错(有错就打印出错信息,没错就打印返回信息)  
  39.             resp = call.invoke(url, "");  
  40.         } catch (SOAPException e) {  
  41.             e.printStackTrace();  
  42.         }   
  43.         if(resp.generatedFault()){  
  44.             Fault fault = resp.getFault();  
  45.             System.out.println("The Following Error Occured:");  
  46.             System.out.println("Fault Code=" + fault.getFaultCode());  
  47.             System.out.println("Fault String=" + fault.getFaultString());  
  48.         } else {  
  49.             Parameter result = resp.getReturnValue();  
  50.             System.out.println(result.getValue());  
  51.             request.setAttribute("str", result.getValue());  
  52.         }         
  53.         request.getRequestDispatcher("/result.jsp").forward(request, response);       
  54.     }     
  55.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  56.             throws ServletException, IOException {  
  57.         doGet(request,response);  
  58.     }  
  59. }  

客户端的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服务了!

————————————————————————————————————————————

问题1:严重: Servlet.service() for servlet rpcrouter threw exception
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

主要原因是 

 

javax.mail和javax.activation这两个包已经在javaEE5当中属于基础包了,就是JDK中自带了已经,但是里面的方法与现在外面的mail.jar和activation.jar有一些出入,所以初学者在直接copy别人代码的时候往往会出现上面的错误。 
废话不多说下面是解决方法 
进到

X:/Program Files/MyEclipse 6.5/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806/data/libraryset/EE_5

这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下)

删掉之后运行下面的代码,经行简单的修改以后就可以实现接收邮件的功能了!我已经测试过完全可行。

——————————————————————————————————————————————————

问题2:StandardWrapper.Throwable

mail.jar和activation.jar拷贝到tomcat/common/lib中解决

————————————————————————————————————————————————————————

问题3:Fault Code=SOAP-ENV:Server.BadTargetObjectURI

工程发布jar到Tomcat\lib\目录中

这个错误简直笑死了,竟然把方法在配置时多了个空格!!!!


0 0
原创粉丝点击