WebService-Java中WebService实例

 

Java与WCF交互(二):WCF客户端调用Java web service
 

中国万睡

Java中WebService实例  

2013-04-11 15:19:01|  分类:
WebService
|  标签:
|举报
|字号大中小 订阅

Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。

Web Service的关键技术和规则:

1.XML:描述数据的标准方法.

2.SOAP:表示信息交换的协议(简单对象访问协议).

3.WSDL:Web服务描述语言.

4.UDDI:通用描述、发现与集成,他是一种独立于平台,基于XML语言的用于在互联网上描述商务的协议。

 

一、利用JDK web服务api实现,这里使用基于SOAP message的Web Service:

1.首先创建一个Web Services项目,作为Web services Endpoint.

2.创建一个HelloService.java类

[c-sharp] view plaincopy

  1. package com.yjpeng.hello;  
  2.   
  3. import javax.jws.WebService;  
  4. import javax.jws.WebMethod;  
  5. import javax.xml.ws.Endpoint;  
  6.   
  7. @WebService  
  8. public class HelloService {  
  9.       
  10.     @WebMethod  
  11.     public String sayHello(String message){  
  12.         return "Hello ," + message;  
  13.     }  
  14.       
  15.     public static void main(String[] args) {  
  16.         //create and publish an endPoint  
  17.         HelloService hello = new HelloService();  
  18.         Endpoint endPoint = Endpoint.publish("http://localhost:8080/helloService", hello);  
  19.     }  
  20. }  

3.使用apt编译HelloService.java(例如: apt -d bin(bin存放编译后的文件目录) scr/com/yjpeng/hello/HelloService.java)后,会生成jaxws目录。

4.使用java com.yjpeng.hello.HelloService执行HelloService.java文件,在浏览器中输入http://localhost:8080/helloService?wsdl出现如下图

5.使用wsimport命令生成客户端:wsimport -p com.yjpeng.webservice -keep http://localhost:8080/helloService?wsdl 这时会在当前目录中生成如下文件:

6.编写好客户端文件HelloClient.java

[c-sharp] view plaincopy

  1. package com.yjpeng.hello;  
  2.   
  3. import com.yjpeng.webservice.HelloServiceService;  
  4.   
  5. public class HelloClient {  
  6.     public static void main(String[] args) {  
  7.         HelloServiceService helloServiceService = new HelloServiceService();  
  8.         com.yjpeng.webservice.HelloService helloService = helloServiceService.getHelloServicePort();  
  9.         System.out.println(helloService.sayHello("你好"));  
  10.     }  
  11.   
  12. }  

运行结果在控制台输出 hello,你好  证明利用JDK web服务API实现web service成功!

 

 

二、使用xfire框架,我这里使用的是MyEclipse集成的xfire进行测试,利用xfire开发WebService可以有三种方法:

a.一种是从JavaBean中生成。

b.一种是从wsdl文件中生成。

c.一种是自己建立webservice。

 

具体实现步骤如下:

1.用Myeclipse建立webService工程(注意:Web Service&J2EE Details中的Framework选XFire),目录结构如下:

2.创建IHello.java接口

[c-sharp] view plaincopy

  1. package com.yjpeng.hello;  
  2.   
  3. public interface IHello {  
  4.     public String sayHello(String message);  
  5. }  

3.创建IHelloImpl.java实现IHello.java接口

[c-sharp] view plaincopy

  1. package com.yjpeng.hello;  
  2.   
  3. public class IHelloImpl implements IHello {  
  4.   
  5.     public String sayHello(String message) {  
  6.         return message;  
  7.     }  
  8. }  

4.修改Service.xml文件,加入以下代码

 <service>
 <!-- 为该Service起一个名字 -->
  <name>HelloService</name>
  <!-- service的接口类 -->
  <serviceClass>
  com.yjpeng.hello.IHello
  </serviceClass>
  <!-- service的接口实现类-->
  <implementationClass>
  com.yjpeng.hello.IHelloImpl
  </implementationClass>
  <!-- wsdl的样式-->
  <style>wrapped</style>
  <use>literal</use>
  <scope>application</scope>
 </service>

5.把该Web Service项目部署到tomcat里面启动tomcat在浏览器地址栏输入http://localhost:8080/TestWebServices/services/Hello?wsdl 出现如下图

6.然后在展开HelloService后面的wsdl可以看到

7.创建一个客户端HelloClient.java类

[c-sharp] view plaincopy

  1. import java.net.MalformedURLException;  
  2. import java.net.URL;  
  3.   
  4. import org.codehaus.xfire.XFireFactory;  
  5. import org.codehaus.xfire.client.Client;  
  6. import org.codehaus.xfire.client.XFireProxyFactory;  
  7. import org.codehaus.xfire.service.Service;  
  8. import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
  9.   
  10. import com.yjpeng.hello.IHello;  
  11.   
  12. public class HelloClient {  
  13.     public static void main(String[] args) {  
  14.         Service s = new ObjectServiceFactory().create(IHello.class);  
  15.         XFireProxyFactory xf = new XFireProxyFactory(XFireFactory.newInstance().getXFire());  
  16.         String url="http://192.168.122.128:8080/TestWebServices/services/HelloService";  
  17.         IHello hello;  
  18.         try {  
  19.             hello = (IHello)xf.create(s, url);  
  20.             System.out.println(hello.sayHello("你好"));  
  21.         } catch (MalformedURLException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.         try {  
  25.             //这个是在java端调用.net写的远程Web Service 如果调用本机写的只需要把URL中的地址换成本机能访问的地址即可  
  26.             Client c = new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));  
  27.             Object[] o = c.invoke("qqCheckOnline", new String[]{"271751507"});  
  28.             System.out.println(o.length);  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33. }  

运行HelloClient.java类可以输出 你好            1.

三、使用axis1.4开发webservice方法

首先下载axis1.4包和tomcat服务器,并将解压后的axis1.4包下面的webapps下的axis目录复制到tomcat服务器的webapps文件夹中。axis支持三种Web Service的部署和开发,分别为:

a.Dynamic Invocation Interface(DII)

b.Stubs 方式

c.Dynamic Proxy方式

1.编写DII(Dynamic Invocation Interface)方式Web Service

a.编写服务程序HelloClient.java

[c-sharp] view plaincopy

  1. public class HelloClient  
  2. {  
  3.     public String getName(String name){  
  4.         return "hello," + name;  
  5.     }  
  6. }  

b.将HelloClient.java文件拷贝到axis_home下,重命名为HelloClient.jws.

c.访问链接http://localhost:8080/axis/HelloClient.jws?wsdl页面显示axis自动生成的wsdl文件

d.编写访问服务的客户端TestHelloClient.java需要导入相应的axis.jar包,在下载的axis的WEB-INF/lib/目录下。

[c-sharp] view plaincopy

  1. package com.yjpeng.webservice;  
  2.   
  3. import java.net.URL;  
  4. import javax.xml.namespace.QName;  
  5. import org.apache.axis.client.Call;  
  6. import org.apache.axis.client.Service;  
  7.   
  8. public class TestHelloClient {  
  9.     public static void main(String[] args){  
  10.         try{  
  11.             String endpoint = "http://localhost:8080/axis/HelloClient.jws";  
  12.             Service service = new Service();  
  13.             Call call = (Call)service.createCall();  
  14.             call.setOperationName(new QName(endpoint, "getName"));  
  15.             call.setTargetEndpointAddress(new URL(endpoint));  
  16.             String result = (String) call.invoke(new Object[]{"张三"});  
  17.             System.out.println(result);  
  18.         }catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

运行TestHelloClient.java在控制台输出hell,张三,测试成功.

2.编写Dynamci Proxy方式访问服务

a.编写部署服务端程序,用上边DII方式使用的HelloClient.java

[c-sharp] view plaincopy

  1. public class HelloClient  
  2. {  
  3.     public String getName(String name){  
  4.         return "hello," + name;  
  5.     }  
  6. }  

b.编写代理接口HelloClientInterface.java需要扩展java.rmi.Remote类

[c-sharp] view plaincopy

  1. package com.yjpeng.dynamic.proxy;  
  2.   
  3. import java.rmi.Remote;  
  4. import java.rmi.RemoteException;  
  5.   
  6. public interface HelloClientInterface extends Remote {  
  7.     public String getName(String name) throws RemoteException;  
  8. }  

c.编写访问服务的客户端TestHelloClient.java

[c-sharp] view plaincopy

  1. package com.yjpeng.dynamic.proxy;  
  2.   
  3. import java.net.URL;  
  4.   
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.rpc.Service;  
  7. import javax.xml.rpc.ServiceFactory;  
  8.   
  9. public class TestHelloClient {  
  10.     public static void main(String[] args){  
  11.         try{  
  12.             String wsdlUrl = "http://localhost:8080/axis/HelloClient.jws?wsdl";  
  13.             String nameSpaceUrl = "http://localhost:8080/axis/HelloClient.jws";  
  14.             String serviceName = "HelloClientService";  
  15.             String portName = "HelloClient";  
  16.             ServiceFactory serviceFactory = ServiceFactory.newInstance();  
  17.             Service afService = serviceFactory.createService(new URL(wsdlUrl), new QName(nameSpaceUrl, serviceName));  
  18.             HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUrl, portName),  
  19.                     HelloClientInterface.class);  
  20.             System.out.println(proxy.getName("张三"));  
  21.         }catch (Exception e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.     }  
  25. }  

运行TestHelloClient.java在控制台输出hell,张三,测试成功.

 

四、使用axis2开发webservice

研究中....

 

五、在java web项目中开放一个webservice接口实例

1.引入需要的jar包 
 

2.创建一个接口类IAddNumbers.java

[c-sharp] view plaincopy

  1. package com.yjpeng.webservice;  
  2.   
  3. public interface IAddNumbers {  
  4.     public int addNumbers(int a, int b);  
  5. }  

3.创建一个AddNumberImpl.java实现IAddnumbers.java接口类

[c-sharp] view plaincopy

  1. package com.yjpeng.webservice;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. import com.sun.xml.ws.transport.http.servlet.WSServlet;  
  6.   
  7. @WebService(targetNamespace="http://webservice.yjpeng.com", serviceName="AddNumberImplService",  
  8.         portName="AddNumberImpl")  
  9. public class AddNumberImpl implements IAddNumbers {  
  10.     public int addNumbers(int a, int b) {  
  11.         return a + b;  
  12.     }  
  13. }  

4.在WEN-INF目录下创建一个sun-jaxws.xml文件

[c-sharp] view plaincopy

  1. <?xml version="1.0"?>  
  2. <endpoints version="2.0"  
  3.   xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">  
  4.   <endpoint name="AddNumberImpl"   
  5.      implementation="com.yjpeng.webservice.AddNumberImpl"  
  6.      url-pattern="/addNumberImpl"/>  
  7.  </endpoints>  
  8.         

5.在web.xml文件中增加

[c-sharp] view plaincopy

  1. <servlet>  
  2.     <servlet-name>AddNumberService</servlet-name>  
  3.     <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.     <servlet-name>AddNumberService</servlet-name>  
  8.     <url-pattern>/addNumberImpl</url-pattern>  
  9. </servlet-mapping>  
  10. <listener>  
  11.     <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>  
  12. </listener>  

6.部署web项目 启动相应部署服务器。访问http://localhost:8080/TestJaxWebService/addNumberImpl?wsdl 这样每次启动web服务器就开放了一个web
service的接口。

时间: 2024-10-26 15:59:56

WebService-Java中WebService实例的相关文章

工厂模式-java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别

问题描述 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 java中工厂实例就是工厂对象对吗,和普通实例普通对象有什么区别 解决方案 工厂实例就是这个工厂类的一个对象,跟普通实例对象没有什么区别的. 主要就是这个工厂实例的作用就是创建某种类型的对象的.即生产什么的工厂.

java-Java中子类实例可以调用父类方法吗

问题描述 Java中子类实例可以调用父类方法吗 20C 通常情况子类覆写父类方法如果是构造函数,直接用super()如果是普通方法用super.method() 但是如果创建了子类实例,比如A类中覆写了Object的equals()方法A a = new A();a怎么调用Object的equals()方法 A没有显示继承其他类 解决方案 PHP类中子类调用父类方法java中子类继承父类方法及调用规则java中子类,父类的方法调用及属性值 解决方案二: 因为你A类中重写了equals方法了,所以

PHP调用JAVA的WebService简单实例

 本篇文章主要是对PHP调用JAVA的WebService简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 使用PHP调用JAVA语言开发的WebService. 客户端提交两个String类型的参数,服务端返回一个对象类型. 服务端使用AXIS-1.4作为SOAP引擎.客户端为PHP5.2.9,使用NuSOAP作为SOAP引擎.   服务端   对象类    代码如下: import java.io.Serializable;   public class Person imp

Java 调用天气Webservice详解及实例代码_java

Java调用天气Webservice的小应用 废话不多说,直接贴代码:  CityReq.java package com.weather; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="getWeatherbyCityName",namespace="http://WebXml.com.cn

Java访问WebService返回XML数据的方法

  本文实例讲述了Java访问WebService返回XML数据的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

100分求救:.NET调用java的webservice的字段类型问题!

问题描述 通过.NET调用java的webservice,目前已经能够调用,但是java的接口中定义了一个BigDecimal类型的字段,通过导入wsdl的方式生成了.NET的接口代码中定义为decimal类型,C#中目前没有BigDecimal类型字段:给decimal类型字段赋值之后,java服务端无法读取该字段,而java的服务端代码我这边看不了.现在是怀疑两个字段类型的长度不一导致的.有没有朋友遇到过此问题,请指教!希望高手能够提供解决思路,多谢了! 解决方案 解决方案二:C#Decim

java调用webservice接口发送xml报文

问题描述 java调用webservice接口发送xml报文 1.webservice接口是axis1发布的 2.请求报文格式如下 <?xml version="1.0" encoding="gbk"?><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XM

java以webservice形式向发送远程数据,发送时出现重复数据,如何解决?

问题描述 java以webservice形式向发送远程数据,发送时出现重复数据,如何解决? 我是用java从本地数据库中(oracle)提取数据后,封装,发送给远程服务器,然后远程服务器会返回发送结果代码. 我在主表中的每条数据都有一个字段显示其发送次数,还有一个字段显示发送结果.再有一张结果表,专门存储每条数据每次发送的结果和错误原因等详细信息.两张表是一对多关系.主表对每条数据是唯一的,当发送完,次数字段会增加1,发送结果也会更新 最新一次数据发送的结果.平时数据量小的时候完全没有问题,比如

Java发布webservice如何使.NET客户端使用out关键字

问题描述 事情是这样的,别家公司要求我公司开发一个javaWebService供其客户端进行调用并规定了接口,问题是该接口的一个函数使用.NET的out关键字,java中并没有该关键字比如客户端需要调用test函数stringerr;test(outerr); 我们服务端使用cxf或是xfire写的WebService如何写该接口呢?各位大神,求教啊! 解决方案 解决方案二:你不用在意out你直接test(Stringerr)解决方案三:引用1楼rui888的回复: 你不用在意out你直接tes