您的位置:首页 > 其它

Web Service学习总结

2013-12-23 16:29 260 查看
一、我认为在学习web service 之前首先应该弄清楚几个概念: 

           1.xfire 是个什么东西:XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简  单,  可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。

           2.axis 是什么东西:axis全称Apache EXtensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器。

          3.soap又是什么东西:是简单对象访问协议,是基于xml的简单协议,可使应用程序在HTTP之上进行信息交换。或者更简单的说:soap是用于访问网络服务的协议。

    所以,xfire和Axis在实施Web Service 能达到同样的效果,但XFire更加简洁高效,并且XFire 对Spring提供了强大的支持。

 

二、现在开始描述开发步骤:本人用的的开发环境是:

    1)jdk:1.5版本

    2)Tomcat:6.0

    3)MyElicpse:6.0

三、

    1)在MyEclipse中新建Web工程,名为webservice_helloworld。选择该工程后,点击右键选择MyEclipse-->Add Web Service Capabilities,弹出Add Web Service Capabilities对话框,弹出Project Library Configuration对话框,默认选择Core Libraries,点击“Finish”按钮,完成XFire核心包的添加。



 

为了后续的客户端的测试,还需读者加入commons- httpclient-3.0.1.jar包到WEB-INF/lib下。

2)web Service 编写 helloWorld的简单例子,首先得在WEB-INF下配置ApplicationContext.xml (Spring配置文件)和 xfire-servlet.xml(配置xfire的相关bean)

1.web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <!-- begin Spring配置 -->

  <context-param>

   <param-name>contextConfigLocation</param-name>

   <param-value>/WEB-INF/ApplicationContext.xml,/WEB-INF/xfire-servlet.xml</param-value>

  </context-param>

  <listener>

   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  <listener>

   <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

  </listener>

  <!-- end Spring 配置 -->

  <!-- begin XFire 配置 -->

  <servlet>

   <servlet-name>xfire</servlet-name>

   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  </servlet>

  <servlet-mapping>

 <servlet-name>xfire</servlet-name>

 <url-pattern>*.ws</url-pattern>

  </servlet-mapping>

 

 

  <!-- 配合Spring容器中XFire一起工作的Servlet-->

  <servlet>

    <servlet-name>XFireServlet</servlet-name>

    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>

    <load-on-startup>0</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

<!-- end XFire 配置 -->

</web-app>

2.Web Service的接口类SayHelloworld.java和对应的实现类SayHelloworldImpl.java

 

为了用Web Service完成HelloWorld功能,我们首先在src/webservice目录下建立接口类SayHelloworld.java。它仅包含一个sayHelloWorld(String name)的方法,其详细内容如下:

SayHelloworld.java:

package webservice;

public interface SayHelloworld {

 public String sayHelloWorld(String name);

}

 

实现类SayHelloworldImpl.java:

package webservice;

public class SayHelloworldImpl implements SayHelloworld{

 public String sayHelloWorld(String name){

  String helloword="hello "+name;

  return helloword;

 }

}

3.ApplicationContext.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="HelloWorldBean" class="webservice.SayHelloworldImpl"/>

</beans>

4.xfire-servlet.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<!-- 引入XFire预配置信息 -->

<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />

<!-- 定义访问的url -->

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="urlMap">

<map>

 <entry key="/HelloWorldService.ws">

  <ref bean="HelloWorldService" />

 </entry>

</map>

</property>

</bean>

<!-- 使用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" />

</bean>

<bean id="HelloWorldService" parent="baseWebService">

<!-- 业务服务bean -->

<property name="serviceBean" ref="HelloWorldBean" />

<!-- 业务服务bean的窄接口类 -->

<property name="serviceClass" value="webservice.SayHelloworld" />

</bean>

</beans>

3)编写完毕,开始Web Service测试

在浏览器中输入地址:http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl,我们可以看到HelloWorldService对应的WSDL信息,阅读这个WSDL文档,我们可以知道HelloWorld的sayHelloWorld方法已经被成功地发布为Web Service了。只要拿到这个WSDL就可以开发相应的客户端调用程序了。

XFire为访问服务端Web Service提供了各种方便的方式:我们一般根据服务地址和窄接口类创建客户调用程序。

  在不能获得服务窄接口类的情况下,XFire允许我们通过WSDL文件生成客户端调用程序,通过指定服务接口的方式调用服务。

1)通过WSDL文件生成客户端调用程序

首先我们通过http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl我们可以获得WSDL文件HelloWorldService.wsdl,并将其放在src目录下面,接着我们通过程序访问该WSDL文件,并调用需测试的方法。此时测试类WebServiceClientTest.java的内容如下所示:

package test;

import org.codehaus.xfire.client.Client;

import org.springframework.core.io.ClassPathResource;

import org.springframework.core.io.Resource;

import webservice.SayHelloworld;

public class WebServiceClientTest {

 SayHelloworld sayHelloworld=null;

 public void testClient() throws Exception{

  //对应的wsdl文件

  String wsdl="HelloWorldService.wsdl";

  Resource resource=new ClassPathResource(wsdl);

  //根据WSDL创建客户实例

  Client client= new Client(resource.getInputStream(),null);

  Object[] objArray=new Object[1];

  objArray[0]="毛爷爷";

  //调用特定的web service 方法

  Object[] results=client.invoke("sayHelloWorld", objArray);

  System.out.println("result:"+results[0]);

  

 }

 public static void main(String[] args) throws Exception{

  WebServiceClientTest test=new WebServiceClientTest();

  test.testClient();

  

  

 }

}

运行该类 结果是:result:hello 毛爷爷

 

2)根据服务地址创建客户端调用程序

接着让我们来看一个根据服务地址创建客户端调用程序的例子。我们可以通过测试类来测试Web Service的正确性,下面让我们来看一个简单的测试类,首先我们在src/test目录建立WebServiceClientTest.java文件,并在src目录下建立客户端调用的Spring配置文件client.xml。在client.xml配置文件中我们定义了一个testWebService的bean,该bean访问wsdlDocumentUrl为http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl的WSDL。该xml文件的详细内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="testWebService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean">

<property name="serviceClass">

<value>webservice.HelloWorld</value>

</property>

<property name="wsdlDocumentUrl">

<value>http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl</value>

</property>

</bean>

</beans>

在WebServiceClientTest.java文件中获得HelloWorld,并调用它的sayHelloWorld方法来完成测试,该类的详细内容如下所示:

package test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import webservice.HelloWorld;

/** *//**

*HelloWorld的webservice的测试类.

*/

publicclass WebServiceClientTest {

HelloWorld helloWorld = null;

publicstaticvoid main(String[] args) {

WebServiceClientTest test = new WebServiceClientTest();

test.testClient();

}

publicvoid testClient() {

ApplicationContext ctx = new ClassPathXmlApplicationContext(

"client.xml");

helloWorld = (HelloWorld) ctx.getBean("testWebService");

System.out.println(helloWorld.sayHelloWorld("毛爷爷"));

}

}

在启动webservice_helloworld工程的情况下,运行WebServiceClientTest类,可看到控制台包含如下信息:

hello  毛爷爷

由此可看出调用Web Service成功。

报错指导:

如果报Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/httpclient/methods/RequestEntity ,很有可能是你的

commons- httpclient.jar有问题

 

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