Java Webservice的创建以及VS中引用此Webservice

首先,参看 http://www.java-forums.org/blogs/web-service/1145-how-create-java-web-service.html

仅使用JAX-WS 来构建webservice,如下:

 1 package com.awu.services;
 2 
 3 import javax.jws.WebMethod;
 4 import javax.jws.WebService;
 5 
 6 /***
 7  * Table service
 8  * provide interface for table data exchange
 9  * @author Awu
10  *
11  */
12 @WebService
13 public class CTabletService {    
14     @WebMethod
15     public String ServiceName(){
16         return "TabletService";
17     }
18     
19     @WebMethod
20     public Boolean PreOrder(int tableNo){
21         //throw new NotImplementedException();
22         if(tableNo == 0)
23             return false;
24         else {
25             return true;
26         }
27     }
28 }

 

 

由于它服务端采用的main方法启动,在web中不方便。web中采用Listener,在其contextInitialized中进行 Endpoint.publish(),即可实现服务随web启动而启动。

 1 package com.awu.listeners;
 2 
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5 import javax.servlet.annotation.WebListener;
 6 import javax.xml.ws.Endpoint;
 7 
 8 import com.awu.services.TabletService;
 9 
10 /**
11  * Application Lifecycle Listener implementation class InitServiceListener
12  *
13  */
14 @WebListener
15 public class InitServiceListener implements ServletContextListener {
16 
17     /**
18      * Default constructor. 
19      */
20     public InitServiceListener() {
21         // TODO Auto-generated constructor stub
22     }
23 
24     /**
25      * @see ServletContextListener#contextInitialized(ServletContextEvent)
26      */
27     public void contextInitialized(ServletContextEvent arg0) {
28         System.out.println("init services start");
29         Endpoint.publish("http://localhost:9898/TabletService", new TabletService());
30     }
31 
32     /**
33      * @see ServletContextListener#contextDestroyed(ServletContextEvent)
34      */
35     public void contextDestroyed(ServletContextEvent arg0) {
36         System.out.println("init services destroyed");
37     }
38     
39 }

 当我们的web应用启动后,就可以访问此webservices了。上文代码中,我们发布的webservice为:http://localhost:9898/TabletService,访问时需要在后面增加?wsdl,即:http://localhost:9898/TabletService?wsdl

VS创建的C#工程引用服务时,使用以上地址,即可引用成功。调用示例代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using TestJavaWs.ServiceReference1;
 6 
 7 namespace TestJavaWs
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             CTabletService table = new CTabletServiceClient();
14             PreOrderResponse result = table.PreOrder(new PreOrderRequest(0));
15             if (result.@return)
16             {
17                 Console.WriteLine("true");
18             }
19             else
20             {
21                 Console.WriteLine("false");
22             }
23 
24             result = table.PreOrder(new PreOrderRequest(1));
25 
26             if (result.@return)
27             {
28                 Console.WriteLine("true");
29             }
30             else
31             {
32                 Console.WriteLine("false");
33             }
34         }
35     }
36 }

1.CTabletService是我们创建的服务类名称,但在引用后,它在本地成为一个接口,本地具体的服务类变为CTabletServiceClient。

2.WebMethod的参数和返回值都在本地增加一个类进行包装,如示例中的方法public Boolean PreOrder(int tableNo),在本地引用后,变为public PreOrderResponse PreOrder(PreOrderRequest obj)。

在对象浏览器中,我们可以看到PreOrderRequest中包括:

public PreOrderRequest()

public PreOrderRequest(int arg0)

public int arg0

而PreOrderResponse包括:

public PreOrderResponse()

public PreOrderResponse(bool return)

public bool return

可以很明显的看到,除了相应包装用的构造函数外,还有一个public的变量,包装参数的类中,这个变量就是webmethod的实际类型变量(示例代码中为int),而在包装返回值的类中,这个变量就是webmethod的返回值的实际类型变量(示例代码中为bool)。

 

posted on 2014-08-12 17:08  阿呜的边城  阅读(278)  评论(0)    收藏  举报

导航