当前位置: 代码迷 >> Web前端 >> xfire开发WebService范例
  详细解决方案

xfire开发WebService范例

热度:89   发布时间:2012-11-05 09:35:12.0
xfire开发WebService实例

参照文献:http://www.360doc.com/content/07/0523/20/27452_516946.shtml#

打开MyEclipse新建一个WebService Project,为你的项目命名,我选择了Java EE5.0,项目在你的WorkSpace目录下。下一步:看到了这个界面?
在这里Eclipse为你创建了webService的配置文件services.xml(主意文件名是有“s”的),并进行了Xfire的Servlet基本配置告诉项目你使用了Xfire改信息将体现在项目的web.xml文件中。继续下一步,加载Xfire相关的jar包

在这个项目里我勾选了Xfire1.2 Core Libraries;HTTP Client Libraries;XML Beans Libraries。

然后编写要发布的java 方法

首先编写一个接口IBankingService

package test;

public interface IBankingService {

	public String transferFunds(String fromAccount,String toAccount,double amount,String currency);
}

?

接着实现这个接口BankingService

package test;

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class BankingService implements IBankingService {

	public BankingService(){}
	public String transferFunds(String fromAccount, String toAccount,
			double amount, String currency) {
		String statusMessage = "";    
		                           
		       //调用业务逻辑执行操作.    
		        //建立并返回状态信息.    
		        try {    
		            NumberFormat formatter = new DecimalFormat("###,###,###,###.00");           
		            statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+     
		            " was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;    
		        } catch (Exception e){    
		            statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString();    
		       }    
	        return statusMessage; 
	}

}

?

你可以看到BankingService是一个普通的Java类,没有任何代码告诉我们它将会在Web Services中使用。只是要有默认的构造函数,类型是public。这是必须的。否则,XFire不能够初始化这个类。好的,这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。?
Web应用的部署描述符?
  在Java中,Web应用程序通常需要至少一个部署描述符(叫做web.xml)对其进行配置。XFire本身是一个基于servlet的应用程序。因此,我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。在使用Eclipse工具构建工程的时候我们已经完成了这项配置

?

接着就是要将这个写好的方法给发布出去,让别人调用,在services.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">

   <service>
    <name>Banking</name>
    <namespace>myBank</namespace>
    
    <serviceClass>test.IBankingService</serviceClass>
    <implementationClass>test.BankingService</implementationClass>
   </service>

</beans>

?

Web Services的定义包含在元素中,它还含有一些子元素。?
第一个子元素是Banking,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如,在服务准备好以后,你将在浏览器上使用这个名字来查看WSDL。?
下一个子元素是。任何合法的XML名字都是可以的。用来唯一标识你的服务的各个参数。(注释@)?
注释@:Namespace派什么用?namespace的作用是要避免命名冲突。如果我建立一项Web?
Service,其中的WSDL文件包含一个名为"foo"的元素,而你想要使用我的服务与另一项服务连接作为补充,这样的话另一项服务的WSDL文件就不能包含名为"foo"的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时,才可以取相同的名字。如果有了表示区别的namespace,我的网络服务里的"foo"就可以表示完全不同于另一个网络服务里"foo"的含义。在你的客户端里,你只要加以限制就可以引用我的"foo"。?

元素包含了Java类的名字,它指定了方法签名。在我们的例子中,它是接口IBankingService。如果Java类没有实现任何接口,你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。?
  保存了实现方法的Java类名。这是一个可选元素。如果上一个元素包含了一个接口,那么相应的实现类必须在这里指定。

这样就基本搞定了,不过我们的试一下我们的程序发布成功没有。

将系统发布到tomcat下,然后在浏览器中输入

http://localhost:8080/项目名称/services/类名称(和services.xml中的name名称一致)?WSDL。

如果出现wsdl文件就算成功了。

结着我们可以写一个客户端来模拟调用一下,看是否正确,我的名称是BankingClient.java

package test;

import java.net.MalformedURLException;

import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class BankingClient {

	
	
	 public static void main(String[] args) {    
	   // TODO Auto-generated method stub    
	      BankingClient bc= new BankingClient();
	      try {
			bc.callWebService("张三", "李四", 250.00, "EUR");
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }    
	  
	    public String callWebService(    
	        String fromAccount, String toAccount, double amount, String currency)     
	        throws MalformedURLException, Exception {    
	             
        //Create a metadata of the service  创建一个service的元数据        
	        Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);            
	        
	       //Create a proxy for the deployed service 为XFire获得一个代理工厂对象    
	         XFire xfire = XFireFactory.newInstance().getXFire();    
	        XFireProxyFactory factory = new XFireProxyFactory(xfire);          
	        //得到一个服务的本地代理    
	         String serviceUrl = "http://localhost:8080/xfire/services/Banking";    
	             
	        IBankingService client = null;    
	        try {    
            client = (IBankingService) factory.create(serviceModel, serviceUrl);    
	         } catch (MalformedURLException e) {    
                   System.out.println("WsClient.callWebService(): EXCEPTION: " + e.toString());    
	        }        
	                   
	         //Invoke the service 调用服务 返回状态结果信息    
	       String serviceResponse = "";    
	        try {     
             serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);    
	        } catch (Exception e){    
	                           
	             serviceResponse = e.toString();    
	        }            
	        System.out.println("WsClient.callWebService(): status=" + serviceResponse);                  
	    
	        //Return the response    
	        return serviceResponse;    
	    } 
	
}

?我做项目一直也写webservice,不过一直是知其然不知其所以然,很是不爽,反了些资料弄明白了。附上自己跑的小例子供大家参考。

  相关解决方案