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)。
浙公网安备 33010602011771号