您的位置:首页 > 编程语言 > Java开发

Java WebService入门实例

2016-07-01 16:32 344 查看
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类 

package com.yjpeng.hello;    

   

import javax.jws.WebService;    

import javax.jws.WebMethod;    

import javax.xml.ws.Endpoint;    

    

@WebService    

public class HelloService {    

        

    @WebMethod    

    public String sayHello(String message){    

        return "Hello ," + message;    

    }    

        

    public static void main(String[] args) {    

        //create and publish an endPoint    

        HelloService hello = new HelloService();    

      Endpoint endPoint = Endpoint.publish("http://localhost:8080/helloService", hello);    

  }    

}    

package com.yjpeng.hello;  

  

import javax.jws.WebService;  

import javax.jws.WebMethod;  

import javax.xml.ws.Endpoint;  

  

@WebService  

public class HelloService {  

      

    @WebMethod  

    public String sayHello(String message){  

        return "Hello ," + message;  

    }  

      

    public static void main(String[] args) {  

        //create and publish an endPoint  

        HelloService hello = new HelloService();  

        Endpoint endPoint = Endpoint.publish("http://localhost:8080/helloService", hello);  

    }  

}  

 

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

package com.yjpeng.hello; 

 

import com.yjpeng.webservice.HelloServiceService; 

 

public class HelloClient { 

    public static void
main(String[] args) { 

        HelloServiceService helloServiceService = new HelloServiceService(); 

        com.yjpeng.webservice.HelloService helloService = helloServiceService.getHelloServicePort(); 

        System.out.println(helloService.sayHello("你好")); 

    } 

 



package com.yjpeng.hello;  

  

import com.yjpeng.webservice.HelloServiceService;  

  

public class HelloClient {  

    public static void main(String[] args) {  

        HelloServiceService helloServiceService = new HelloServiceService();  

        com.yjpeng.webservice.HelloService helloService = helloServiceService.getHelloServicePort();  

        System.out.println(helloService.sayHello("你好"));  

    }  

  

}  

运行结果在控制台输出 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接口

package com.yjpeng.hello; 

 

public interface IHello { 

    public String sayHello(String message); 



package com.yjpeng.hello;  

  

public interface IHello {  

    public String sayHello(String message);  

}  

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

package com.yjpeng.hello; 

 

public class IHelloImpl implements
IHello { 

 

    public String sayHello(String message) { 

        return message; 

    } 



package com.yjpeng.hello;  

  

public class IHelloImpl implements IHello {  

  

    public String sayHello(String message) {  

        return message;  

    }  

}  

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类

import java.net.MalformedURLException; 

import java.net.URL; 

 

import org.codehaus.xfire.XFireFactory; 

import org.codehaus.xfire.client.Client; 

import org.codehaus.xfire.client.XFireProxyFactory; 

import org.codehaus.xfire.service.Service; 

import org.codehaus.xfire.service.binding.ObjectServiceFactory; 

 

import com.yjpeng.hello.IHello; 

 

public class HelloClient { 

    public static void
main(String[] args) { 

        Service s = new ObjectServiceFactory().create(IHello.class); 

        XFireProxyFactory xf = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); 

        String url="http://192.168.122.128:8080/TestWebServices/services/HelloService"; 

        IHello hello; 

        try { 

            hello = (IHello)xf.create(s, url); 

            System.out.println(hello.sayHello("你好")); 

        } catch (MalformedURLException e) { 

            e.printStackTrace(); 

        } 

        try { 

            //这个是在java端调用.net写的远程Web Service 如果调用本机写的只需要把URL中的地址换成本机能访问的地址即可 

            Client c = new Client(new
URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl")); 

            Object[] o = c.invoke("qqCheckOnline", new
String[]{"271751507"}); 

            System.out.println(o.length); 

        } catch (Exception e) { 

            e.printStackTrace(); 

        } 

    } 



import java.net.MalformedURLException;  

import java.net.URL;  

  

import org.codehaus.xfire.XFireFactory;  

import org.codehaus.xfire.client.Client;  

import org.codehaus.xfire.client.XFireProxyFactory;  

import org.codehaus.xfire.service.Service;  

import org.codehaus.xfire.service.binding.ObjectServiceFactory;  

  

import com.yjpeng.hello.IHello;  

  

public class HelloClient {  

    public static void main(String[] args) {  

        Service s = new ObjectServiceFactory().create(IHello.class);  

        XFireProxyFactory xf = new XFireProxyFactory(XFireFactory.newInstance().getXFire());  

        String url="http://192.168.122.128:8080/TestWebServices/services/HelloService";  

        IHello hello;  

        try {  

            hello = (IHello)xf.create(s, url);  

            System.out.println(hello.sayHello("你好"));  

        } catch (MalformedURLException e) {  

            e.printStackTrace();  

        }  

        try {  

            //这个是在java端调用.net写的远程Web Service 如果调用本机写的只需要把URL中的地址换成本机能访问的地址即可  

            Client c = new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));  

            Object[] o = c.invoke("qqCheckOnline", new String[]{"271751507"});  

            System.out.println(o.length);  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

    }  

}  

运行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

public class HelloClient 



    public String getName(String name){ 

        return "hello,"
+ name; 

    } 



public class HelloClient  

{  

    public String getName(String name){  

        return "hello," + name;  

    }  

}  

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/目录下。

package com.yjpeng.webservice; 

 

import java.net.URL; 

import javax.xml.namespace.QName; 

import org.apache.axis.client.Call; 

import org.apache.axis.client.Service; 

 

public class TestHelloClient { 

    public static void
main(String[] args){ 

        try{ 

            String endpoint = "http://localhost:8080/axis/HelloClient.jws"; 

            Service service = new Service(); 

            Call call = (Call)service.createCall(); 

            call.setOperationName(new QName(endpoint, "getName")); 

            call.setTargetEndpointAddress(new URL(endpoint)); 

            String result = (String) call.invoke(new Object[]{"张三"}); 

            System.out.println(result); 

        }catch (Exception e) { 

            e.printStackTrace(); 

        } 

    } 



package com.yjpeng.webservice;  

  

import java.net.URL;  

import javax.xml.namespace.QName;  

import org.apache.axis.client.Call;  

import org.apache.axis.client.Service;  

  

public class TestHelloClient {  

    public static void main(String[] args){  

        try{  

            String endpoint = "http://localhost:8080/axis/HelloClient.jws";  

            Service service = new Service();  

            Call call = (Call)service.createCall();  

            call.setOperationName(new QName(endpoint, "getName"));  

            call.setTargetEndpointAddress(new URL(endpoint));  

            String result = (String) call.invoke(new Object[]{"张三"});  

            System.out.println(result);  

        }catch (Exception e) {  

            e.printStackTrace();  

        }  

    }  

}  

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

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

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

public class HelloClient 



    public String getName(String name){ 

        return "hello,"
+ name; 

    } 



public class HelloClient  

{  

    public String getName(String name){  

        return "hello," + name;  

    }  

}  

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

package com.yjpeng.dynamic.proxy; 

 

import java.rmi.Remote; 

import java.rmi.RemoteException; 

 

public interface HelloClientInterface
extends Remote { 

    public String getName(String name) throws RemoteException; 



package com.yjpeng.dynamic.proxy;  

  

import java.rmi.Remote;  

import java.rmi.RemoteException;  

  

public interface HelloClientInterface extends Remote {  

    public String getName(String name) throws RemoteException;  

}  

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

package com.yjpeng.dynamic.proxy; 

 

import java.net.URL; 

 

import javax.xml.namespace.QName; 

import javax.xml.rpc.Service; 

import javax.xml.rpc.ServiceFactory; 

 

public class TestHelloClient { 

    public static void
main(String[] args){ 

        try{ 

            String wsdlUrl = "http://localhost:8080/axis/HelloClient.jws?wsdl"; 

            String nameSpaceUrl = "http://localhost:8080/axis/HelloClient.jws"; 

            String serviceName = "HelloClientService"; 

            String portName = "HelloClient"; 

            ServiceFactory serviceFactory = ServiceFactory.newInstance(); 

            Service afService = serviceFactory.createService(new URL(wsdlUrl), new
QName(nameSpaceUrl, serviceName)); 

            HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUrl, portName), 

                    HelloClientInterface.class); 

            System.out.println(proxy.getName("张三")); 

        }catch (Exception e) { 

            e.printStackTrace(); 

        } 

    } 



package com.yjpeng.dynamic.proxy;  

  

import java.net.URL;  

  

import javax.xml.namespace.QName;  

import javax.xml.rpc.Service;  

import javax.xml.rpc.ServiceFactory;  

  

public class TestHelloClient {  

    public static void main(String[] args){  

        try{  

            String wsdlUrl = "http://localhost:8080/axis/HelloClient.jws?wsdl";  

            String nameSpaceUrl = "http://localhost:8080/axis/HelloClient.jws";  

            String serviceName = "HelloClientService";  

            String portName = "HelloClient";  

            ServiceFactory serviceFactory = ServiceFactory.newInstance();  

            Service afService = serviceFactory.createService(new URL(wsdlUrl), new QName(nameSpaceUrl, serviceName));  

            HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUrl, portName),  

                    HelloClientInterface.class);  

            System.out.println(proxy.getName("张三"));  

        }catch (Exception e) {  

            e.printStackTrace();  

        }  

    }  

}  

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

四、使用axis2开发webservice

研究中....

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

1.引入需要的jar包 



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

package com.yjpeng.webservice; 

 

public interface IAddNumbers { 

    public int addNumbers(int
a, int b); 



package com.yjpeng.webservice;  

  

public interface IAddNumbers {  

    public int addNumbers(int a, int b);  

}  

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

package com.yjpeng.webservice; 

 

import javax.jws.WebService; 

 

import com.sun.xml.ws.transport.http.servlet.WSServlet; 

 

@WebService(targetNamespace="http://webservice.yjpeng.com", serviceName="AddNumberImplService", 

        portName="AddNumberImpl") 

public class AddNumberImpl implements
IAddNumbers { 

    public int addNumbers(int
a, int b) { 

        return a + b; 

    } 



package com.yjpeng.webservice;  

  

import javax.jws.WebService;  

  

import com.sun.xml.ws.transport.http.servlet.WSServlet;  

  

@WebService(targetNamespace="http://webservice.yjpeng.com", serviceName="AddNumberImplService",  

        portName="AddNumberImpl")  

public class AddNumberImpl implements IAddNumbers {  

    public int addNumbers(int a, int b) {  

        return a + b;  

    }  

}  

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

<?xml version="1.0"?> 

<endpoints version="2.0" 

  xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"> 

  <endpoint name="AddNumberImpl"  

     implementation="com.yjpeng.webservice.AddNumberImpl" 

     url-pattern="/addNumberImpl"/> 

</endpoints> 

       

<?xml version="1.0"?>  

<endpoints version="2.0"  

  xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">  

  <endpoint name="AddNumberImpl"   

     implementation="com.yjpeng.webservice.AddNumberImpl"  

     url-pattern="/addNumberImpl"/>  

 </endpoints>  

        

5.在web.xml文件中增加

<servlet> 

    <servlet-name>AddNumberService</servlet-name> 

    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> 

    <load-on-startup>1</load-on-startup> 

</servlet> 

<servlet-mapping> 

    <servlet-name>AddNumberService</servlet-name> 

    <url-pattern>/addNumberImpl</url-pattern> 

</servlet-mapping> 

<listener> 

    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> 

</listener> 

<servlet>  

    <servlet-name>AddNumberService</servlet-name>  

    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>  

    <load-on-startup>1</load-on-startup>  

</servlet>  

<servlet-mapping>  

    <servlet-name>AddNumberService</servlet-name>  

    <url-pattern>/addNumberImpl</url-pattern>  

</servlet-mapping>  

<listener>  

    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>  

</listener>  

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

相关:

cxf:源码:https://github.com/apache/cxf


axis1 和 axis2 的简单使用


利用AXIS开发Webservice(一) —— 如何发布自己的webservice

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: