java调用java web service,
分享于 点击 43891 次 点评:178
java调用java web service,
java调用java写的web service基本包括两大步:第一步就是创建一个web service
第二部就是创建一个客户端,以调用上面创建好的web service
具体步骤如下:
[color=red]如何创建一个Web Services[/color]
1、创建一个服务接口(跟普通的接口没有任何区别)
2、创建一个Java类,继承上面定义的服务接口。并保证该类和默认构造函数确保为public
3、增加XFire servlet相关条目到web.xml中
包括:
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
4、创建services.xml,把它放到WEB-INF/classes/META-INF/xfire目录下
如:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>Banking</name>
<namespace>mybank</namespace>
<serviceClass>globalzt.service.IBankingService</serviceClass>
<implementationClass>globalzt.serviceImpl.BankingServiceImpl</implementationClass>
</service>
</beans>
[code="java"]
让我们看看这里都包含了什么内容。Web Services的定义包含在元素中,它还含有一些子元素。第一个子元素是,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如,在服务准备好以后,你将在浏览器上使用这个名字来查看WSDL。
下一个子元素是<namespace>。任何合法的XML名字都是可以的。<namespace>用来唯一标识你的服务的各个参数。
<serviceClass>元素包含了Java类的名字,它指定了方法签名。在我们的例子中,它是接口IBankingService。如果Java类没有实现任何接口,你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。
<implementationClass>保存了实现方法的Java类名。这是一个可选元素。如果上一个元素<serviceClass>包含了一个接口,那么相应的实现类必须在这里指定。
就是这样。我们的Web Services配置完成了。
[/code]
5、增加XFire和第三方包到你的Web应用的WEB-INF/lib文件夹中
• activation-1.0.2.jar
• commons-codec-1.3.jar
• commons-httpclient-3.0.jar
• commons-logging-1.0.4.jar
• jaxen-1.1-beta-8.jar
• jdom-1.0.jar
• log4j-1.2.x.jar
• mail-1.3.3_01.jar
• spring-1.2.x.jar
• stax-api-1.0.jar
• wsdl4j-1.5.2.jar
• wstx-asl-2.9.jar
• xbean-2.1.0.jar
• xbean-spring-2.2.jar
• xfire-all-1.0.jar
• XmlSchema-1.0.jar
服务接口代码如下:
public interface IBankingService {
public String transferFunds(
String fromAccount, String toAccount, double amount, String currency);
}
服务实现类代码如下:
public class BankingService implements IBankingService {
//Default constructor.
public BankingService(){
}
/** Transfers fund from one account to another.
*/
public String transferFunds(
String fromAccount, String toAccount, double amount, String currency){
String statusMessage = "";
//Call business objects and other components to get the job done.
//Then create a status message and return.
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;
}
}
[color=red]如何创建一个客户端:[/color]
你可以使用任何的SOAP工具创建客户端,例如,.Net或者Apache Axis,有很多种方法:使用从WSDL产生的stubs,使用动态代理,等等。在例子中,我们使用一个动态代理,以一个简单的Servlet形式,叫做WsClient.java。为了保持代码两最小,所有在屏幕显示的元素都放在了doGet()方法中。对Web Service的实际调用由callWebService()方法完成,它相当地简单。和下面的类似:
/* Call the Web service
*
*/
public String callWebService(
String fromAccount, String toAccount, double amount, String currency)
throws MalformedURLException, Exception {
//Create a metadata of the service
Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);
log.debug("callSoapServiceLocal(): got service model." );
//Create a proxy for the deployed service
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);
String serviceUrl = "http://localhost:8080/websvc/services/Banking";
IBankingService client = null;
try {
client = (IBankingService) factory.create(serviceModel, serviceUrl);
} catch (MalformedURLException e) {
log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());
}
//Invoke the service
String serviceResponse = "";
try {
serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);
} catch (Exception e){
log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());
serviceResponse = e.toString();
}
log.debug("WsClient.callWebService(): status=" + serviceResponse);
//Return the response
return serviceResponse;
}
这个代码是如何工作的呢?我来解释一下:首先,我们创建一个服务模型,它包含服务的说明——换句话说,就是服务的元数据。我们使用XFire的ObjectServiceFactory从IBankingService.class接口创建这个模型。
接着,为XFire获得一个代理工厂对象,它包含了常规的代码,也相当地简单和易懂。这一步中没有任何特定应用的东西。从这个proxyFactory,使用服务模型和服务端点URL(用来获得WSDL),我们可以得到一个服务的本地代理。就是它了。这个代理就是实际的客户端。现在,我们可以调用它的transferFunds()方法来得到我们需要的Web Service。
详细代码和jar包见附件
参考文章地址:[url]http://hi.baidu.com/yaolihui/blog/item/28f0c903b0f005723912bb80.html[/url]
相关文章
- 暂无相关文章
用户点评