WebService服务端和客户端的几种常见创建方式

一、WebService发布方式:

1.利用JDK中JAX-WS规范发布WebService服务(jdk1.6.0_21以后版本)

步骤:

a.新建web项目(Dynamic Web project)

b.新建一个用于发布的服务类Hello.java代码如下,项目结构如下:

代码Hello.java:

package com.sherlon.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
 * @WebService :将指定的类发布为webservice 
 * *Endpoint :此类为端点服务类,它的方法publish用于将一个
 *已经添加了@WebService注解的对象绑定到一个地址的端口上。
 */
@WebService
public class Hello{
	public String sayHi(String name){
		return "this messge comes from webservice:"+name;
	}
	@WebMethod(exclude=true)//当为true时,发布该类时不发布该方法
	public String sayHi2(String name){
		return "this messge comes from webservice:"+name;
	}
	
	public static void main(String[] args) {
		/**
		 * 
		 * Endpoint.publish(param1 param2)
		 * param1:服务的发布地址 (注意端口不能被其他服务占用)
		 * param2:服务的实现者(要发布的类) 
		 * 
		 */
		Endpoint.publish("http://localhost:8089/HelloService/services", new Hello());
		System.out.println("服务发布成功");
	}
}

c.发布完成后测试,浏览器输入发布地址+?wsdl

http://localhost:8089/HelloService/services?wsdl

看到如下WSDL文档则证明发布成功,如下图:

2.利用eclipse自带的插件axis框架创建webservice

步骤:

a.新建web项目(Dynamic Web project)

b.新建一个用于发布的服务类HiService.java代码如下:

package com.sherlon.ws;
public class HiService {
	public String sayHi(String name){
		return "hi:"+name;
	}
}

该类很简单,只是做一个简单的实例,没有用接口。

c.新建一个webservice,如下图,在需要发布的类上右键选择Web Services-->Create Web Service,

 

出现如下图所示界面,Service implementation:找到要发布的类的路径,注意Configuration下的配置。

点击next-->选择要发布的Methods-->Finish。

发布完成后可以看到项目中lib包下多了几个jar包,

axis.jar

commons-discovery-0.2.jar

commons-logging.jar

jaxrpc.jar

saaj.jar

wsdl4j.jar

还有server-config.wsdd文件,里面包含了要发布的信息,web.xml自动配置了servlet。

还有wsdl包下自动生成了HiService.wsdl文件。如下图所示:

 

d.发布完成后测试,http://localhost:8089/HelloService2/services

url根据自己项目而定,即http://ip:port/serviceName/services

看到如下WSDL文档则证明发布成功:

 3.利用XFire框架发布webservice

步骤:

a.新建web项目(Dynamic Web project)

b.新建要发布的接口及其实现类,IHello.javaHelloImpl.java内容和上面方法2介绍的一样,写一个接口,然后写一个实现类实现该接口就ok了,就不贴图了。项目结构如下图:

c.WEB-INF下新建META-INFO包(包名不可变),META-INFO下新建xfire包(包名不可变),

xfire下新建services.xml(文件名不可变),内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    <!-- 配置service -->
    <service>
        <!-- 服务名 -->
        <name>HelloXfire</name> 
        <!-- 命名空间,按理说可以按你的意愿去命名,注意并不是发布url路径 -->
        <namespace>http://localhost:8080/HelloXfire</namespace>
        <!-- 服务类接口 -->
        <serviceClass>com.xfire.services.IHello</serviceClass>
        <!-- 服务接口实现类 -->
        <implementationClass>com.xfire.services.HelloImpl</implementationClass>
    </service>
</beans>

d.配置web.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>XFire</display-name>
<!-- 配置xfire -->
<servlet>
    <servlet-name>Xfires</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Xfires</servlet-name>
    <url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Xfires</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!-- 可以根据自己需要配置多个 servlet-mapping-->
<servlet-mapping>
    <servlet-name>Xfires</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

e.导入xfire所有关联的包

下载xfire压缩包,本人为xfire-distribution-1.2.6(附下载链接),解压后目录如下图:

xfire-all-1.2.6.jar包和lib包下所有文件拷到项目中lib包下,项目搭建完毕,将项目部署到tomcat后启动。

f.测试http://localhost:8080/XFire/services,出现如下图:则发布成功!

可以看出,显示为Generated by XFire,由XFire生成wsdl文档。

4.利用Spring集成XFire框架发布webservice

步骤:

a.新建一个maven工程,选择war(本例通过maven来管理项目)如下图:

finish后发现项目报错,是因为缺少web.xml,右键项目下Deployment Descriptor:spring-xfire,选择Generate Deployment Descriptor Stub,如下图,错误解决,WEB-INFO下会出现web.xml配置文件。

b.导包:

spring-webmvc:3.2.8.RELEASE

xfire-distribution:1.2.6:zip

双击项目下pom.xml,选择底部Dependencies窗口,出现如下图所示界面,

 

点击add按钮,如下:

在黄标位置输入项目需要的jar包,如果搜不到可以去maven中央仓库(或者阿里云仓库maven.ayiyun.com)搜索对应的包,将坐标粘贴到pom.xml里面保存即可。(连网情况下)

c.完成后,写好服务类和对应的接口,项目结构如下图:

d.配置web.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>spring-xfire</display-name>
    <!-- 指定spring配置文件位置及名称
  	写了classpath就自动去src/main/resource下找 
  	注:spring 配置文件默认路径/WEB-INF/applicationContext.xml,
  	名称路径都不可变-->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>/WEB-INF/xfire-servlet.xml</param-value>
  </context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- XFire 配置使用xfire的XFireSpringServlet作为xfire的处理类,
  可以直接使用接口类名来访问开放的服务,也可以查看所有开放的服务接口 -->
  <servlet>
      <!-- 配合Spring容器中XFire一起工作的Servlet -->
      <servlet-name>XFire</servlet-name>
      <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>XFire</servlet-name>
      <!-- 在这个URI下开放Web Service服务 -->
      <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
</web-app>

注意:配置contextConfigLocation,配置后spring容器会自动去执行/WEB-INF下的xfire-servlet.xml文件。

e.配置xfire-servlet.xml.

在WEB-INF下新建xfire-servlet.xml此路径是根据contextConfigLocation配置的,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 引入xfire.xml -->
    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
    <!-- 使用XFire导出器 我们通过XFireExporter将业务类导出为Web Service,	
    对于任何导出器,我们都需要引入XFire环境,即serviceFactory和xfire,这是标准的配置。    
    ServiceFactory是XFire的核心类,它可以将一个POJO生成为	一个Web Service。在本实例中,我们通    
    过定义一个baseWebService,其余的webService配置都将该bean作为父bean,这样可以简化Spring的 
    配置,不需要多次引入serviceFactory和xfire。-->
    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" 
                              lazy-init="false" abstract="true">
        <!-- 引用xfire.xml中定义的工厂 -->
        <property name="serviceFactory" ref="xfire.serviceFactory" />
        <!-- 引用xfire.xml中的xfire实例 -->
        <property name="xfire" ref="xfire" />
        <!-- 安全验证,本例没有用到-->
        <!-- <property name="inHandlers" ref="AuthenticationHandler"></property> -->
    </bean>

    <!-- 安全认证 -->
    <!--   <bean id="AuthenticationHandler" class="com.AuthenticationHandler"></bean> -->
    <!-- 服务实现类 -->
    <bean id="HelloWorldServiceImpl" class="com.sherlon.xfire.HelloWorldServiceImpl" />

    <bean id="HelloWorldService" parent="baseWebService">
        <!-- 业务服务bean -->
        <property name="serviceBean" ref="HelloWorldServiceImpl" />
        <!-- 业务服务bean的接口类 -->
        <property name="serviceClass" value="com.sherlon.xfire.HelloWorldService" />
    </bean>
</beans>

注意:需要使用XFire导出器XFireExporter,这里配置一个baseWebService bean,其他服务bean继承此baseWebService即可,不需要重复多次写serviceFactoryxfire。

f.到此项目搭建完毕,将项目部署到服务器上(此处用tomcat)启动tomcat,浏览器输入地址:http://localhost:8080/spring-xfire/services测试,看如下界面则证明发布成功:

以上为webservice发布几种方法,下面介绍webservice搭建客户端的方法。(看到这可能已经有点累了,建议先放松下QAQ

 

二、webservice客户端创建方式

1.JDK自带的JAX-WS规范创建客户端

步骤:

a.新建一个web工程(Dynamic Web project)作为webservice客户端

b.选中客户端,新建一个Web Service Client,如下图步骤-->next,:

↓:

将wsdl路径复制到Service definition中,如下图:

检查一下configuration有没有问题,-->next,选择输出路径为该项目src下,如下图:

finish完成,刷新项目会发现src下多了如下图的包结构及代码,这些代码就是服务端发布的代码信息。

c.在com.sherlon.xfire包下新建测试类TestClient.java,代码如下:

package com.sherlon.xfire;
public class ClientTest {
	public static void main(String[] args) {
		try {
			HelloWorldServicePortType hello = 
			new HelloWorldServiceLocator().getHelloWorldServiceHttpPort();
			String result = hello.sayHello("myself");
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行该java类,会发现控制台输出helloword:myself(如图:此处helloworld是在服务端方法中定义),调用成功!

注:用JAX-WS生成客户端也可用dos命令自动生成。

命令如下:wsimport -s D:\\workspace\\jax-ws-client\\src -p com.sherlon.xfire

 -keep http://localhost:8080/spring-xfire/services/HelloWorldService?wsdl

解释命令:

-s:项目src所在路径

-p:生成代码所在包(src下)

-keep:服务端发布的wsdl文件url

回车,会看到如图所示信息则成功,刷新项目会发现src下多了以下包和类

将测试类中HelloWorldServiceLocator()改为HelloWorldService()即可

2.XFire客户端:

步骤:

a.新建XFire客户端(Dynamic Web project)

b.导包:导入xfire相关联所有jar包,本例用xfire-distribution-1.2.6.zip,

下载并解压改压缩包,将解压后lib下所有文件和xfire-all-1.2.6.jar一起粘贴到项目lib包下,也可以通过maven来管理,比较方便。

c.新建客户端接口,接口名字任意,但是方法需要和服务端完全一致,IHelloWorld.java接口代码如下:

package com.sherlon.xfire;
public interface IHelloWorld {
	public String sayHello(String name);
}

d.新建测试类XFrieTest.java,代码如下:

package com.sherlon.xfire;

import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class XFrieTest {
    public static void main(String[] args) {
        try {
            // webservice类的发布路径。HelloWorldService为发布接口或实现类wsdl文件
            // <wsdlsoap:address location="http://localhost:8080/spring-xfire/services/HelloWorldService" />
            String url = "http://localhost:8080/spring-xfire/services/HelloWorldService";
            //创建一个xfire的service
            Service service = new ObjectServiceFactory().create(IHelloWorld.class);
            //xfire代理工厂实例
            XFireProxyFactory factory = new XFireProxyFactory();
            //实例化发布的服务类
            IHelloWorld hello = (IHelloWorld) factory.create(service, url);
            //调用发布的方法
            String result = hello.sayHello("sherlon");
            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行测试类,控制台输出helloworld:sherlon,测试通过!

3.Axis客户端:

步骤:

a.新建XFire客户端(Dynamic Web project)

b.导包:

axis.jar

commons-discover-0.2.jar

commons-logging.jar

jaxrpc.jar

saaj.jar

wsdl4j.jar

c.新建客户端接口,接口名字任意,但是方法需要和服务端完全一致,IHelloWorld.java接口代码如下:

package com.sherlon.xfire;

public interface IHelloWorld {
    public String sayHello(String name);
}

d.新建测试类AxisTest.java:

import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;

    public class AxisTest {

        public static void main(String[] args) {
            try {
                //webservice类的发布路径。HelloWorldService为发布的接口或者实			现类
                String endpoint = "http://localhost:8080/spring-xfire/services/HelloWorldService";
//实例化axis的一个service
                Service service = new Service();
                //创建call
                Call call = (Call) service.createCall();
                call.setTargetEndpointAddress(endpoint);
                //设置发布的方法名
                call.setOperationName("sayHello");
                //设置参数的个数,有几个就写几句
                all.addParameter("parameter1", org.apache.axis.encoding.XMLType.XSD_DATE, javax.xml.rpc.ParameterMode.IN);
                //call.addParameter("parameter2",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;  
                //设置返回值类型
                call.setReturnType(XMLType.XSD_STRING);
                //设置是否使用SOAP
                call.setUseSOAPAction(true);
                //invoke方法里传入object对象,参数放在object里面
                String result = (String) call.invoke(new Object[]{"wxl"});
                System.out.println(result);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

运行测试类,控制台输出helloword:wxl,证明测试通过!

DONE!

PS:以上是个人对webservice服务端及客户端创建的一些总结,纯手打,本人也是新手,如有错误请大家及时指正!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值