第三章  配置更高效的web service开发环境 

 

 

上一章通过AXIS2实现一个简单的web service

 

本章主要内容:本章主要介绍了如何配置一个高效的web service 开发环境。

 

1.自动把类文件存放到Axis

         到目前为止,对web servicejava源码做的任何更改,都要重新拷贝到Axis服务器更改才能生效。这是一件很麻烦的事情。解决这个问题,可以通过配置eclipse使得类文件修改后自动存放在Axis服务器中:

 

         然而,有一个难题:因为在eclipse工程中只能有一个文件夹作为输出(output)文件夹。幸运的是,为突破这个限制,eclipse提供了一种解决方案,通过链接到外部文件夹:

 

         如何设置链接外部文件夹呢?右键单击工程并选择”New|Folder”.按照下图进行设置:

 

         接下来我们设置输出文件夹(output folder),在Eclipse右键单击工程,选择”Properties”,然后选择”Java Build Path”,再选择”Source”tab页:

 

         单击”Browse”并选择”out”文件夹。若提示删除已存在的”bin”文件夹时,选择”OK”. 即删除默认的输出文件夹“bin”,因其不再被使用。

         现在类文件被放入到了正确的位置。接下来要使得META-INF 文件夹在正确的位置建立,只需要在”src” 文件夹中创建一个”META-INF”文件夹即可:

 

         把项目中”resources”文件夹重命名为META-INF,然后将其移到”src”文件夹中即完成了META-INF文件夹的创建。为验证,环境建立是否正确。只需要更改下代码,将输出结果字符串转换为大写字符:

 

代码
public class SimpleServiceSkeleton implements SimpleServiceSkeletonInterface {

public com.ttdev.ss.ConcatResponse concat(

        com.ttdev.ss.ConcatRequest concatRequest0) {

  String result 
= concatRequest0.getS1()+concatRequest0.getS2();

  ConcatResponse response 
= new ConcatResponse();

  response.setConcatResponse(result.toUpperCase());

  return response;

  }

}

 

         现在启动Axis2服务器。运行客户端,输出如下图:

 

2.使改变立刻生效

         让我们把刚才对代码的修改,撤销。如下图所示:

 

         Axis服务器运行时,代码更改后,输出结果会立刻生效吗?不会的。它将依然输出为:ABC123.这是因为默认情况下AXIS服务器只加载一次web service,它不会监视web service 文件的变化。但是方式是可配置的。按照下列方式更改配置文件c:\axis\conf\axis2.xml:

 

         通过配置文件,认真的你可能已经发现除了热部署选项外还有热更新选项。它们之间有什么不同呢?下图进行了解释说明:

 

         需要重启Axis服务器热更新选项才会生效。然后如下更改Java代码:

 

代码
public class SimpleServiceSkeleton implements SimpleServiceSkeletonInterface {

public com.ttdev.ss.ConcatResponse concat(

              com.ttdev.ss.ConcatRequest concatRequest0) {

       String result 
= concatRequest0.getS1()+concatRequest0.getS2();

       ConcatResponse response 
= new ConcatResponse();

       response.setConcatResponse(
"hello: "+result);

       
return response;

      }

}

 

 

        保存代码。将会看到Axis服务器重新部署你的服务:

 

         运行客户端,输出如下:

 

         这里需要注意的是,Axis server10秒检测一次文件变化。所以在web service 从新部署前需要一些时间。

         3.调试web service

         Eclipse 中调试web service,需要在Axis Server 启动前设置一下环境变量:

 

         在这种方式下,axis服务器在Jvm调试模式下运行。JVM将监听8000端口的连接。以后,你可以设置eclipse连接这个端口。现在,设置一个断点:

 

         选择”Open Debug Dialog”:

 

         将看到如下窗口:

 

         右键单击”Remote Java Application” 并选择 “new”.把这个配置命名为”Debug Axis”.选中SimpleService工程并设置端口为8000,如下图所示:

 

         单击”Debug”连接到运行Axis 服务器的JVM。现在运行客户端访问web serviceEclipse会在断点处停止:

 

         单击变量或者其他调试快捷键,进行程序的单步跟踪。在Debug窗口中单击关闭图标可退出debug模式:

 

         进入debug模式必须在启动axis服务前设置环境变量。如果频繁的启动服务器,每次设置环境变量是很麻烦的。可以创建一个batch文件 c:\axis\bin\debug.bat:

 

         有了新建立的batch文件,以后进入debug模式,直接运行此文件即可!O(_)O~

 

4.更加自动化的代码生成

         目前,我们通过Code Generator向导从WSDL文件生成代码。如果我们更改了WSDL文件,我们必须重新运行一次Code Generator向导。这样是不是很麻烦呢?我们需要一个更自动化的代码生成过程。通过编辑build.xml,我们可以使工作更轻松(build.xml文件也是由Code Generator 生成的)。首先让我们来了解下build.xml的结构。一个build.xml文件包含了一个工程,这类似于Java文件中的一个类。一个工程包含一个或者多个目标(target).一个目标(target)类似于java类中的一个方法。一个目标(target)包含一个或者多个任务(tasks)。一个任务(task)类似于一个java方法中一个语句:

         现在让我们编辑build.xml 文件:

         接下来,你想用Ant运行文件build.xml。然而任务<wsdl2code>不是Ant内置的任务,因此Ant不知道如何去执行这个任务。这个任务的实现类是AntCodegenTask,这个实现类在c:\axis\lib\axis2-ant-plugin-1.3.jar中。告诉Ant <wsdl2code>任务是如何实现的,如下更改build.xml文件:p3-22

         定义环境变量AXIS2_HOME,可以在Windows环境变量中定义也可以在Eclipse中定义。我们这里是在eclipse中定义的。选择”Window|Preferences|Ant|Runtime”,然后选择”Properties”标签页:

         单击”Add Property”按钮,按照以下所示输入:

  

         现在我们可以运行Ant了。为验证是否正常工作,重命名文件SimpleServiceSkeleton.java SimpleServiceImpl.java然后删除包中的其他java文件。同时也删除文件夹META-INF.

         BUG提示:在Axis2  1.3中有一个bug。安装之后不能再eclipse中运行Ant。解决方法是,在上面的Ant Runtime窗口中,选择”Classpath”标签页并单击”Ant Home”,然后选择org.apache.ant 文件夹(c:\eclipse\plugins):

         运行Ant,右键单击build.xml文件然后选择”Run As|Ant Build….”:

         然后选择”generate-service”目标并单击”Run”:

         在控制台中可以看到构建消息:

         这时,刷新工程将会看到生成的java文件和文件夹META-INF下面的文件。现在,如果要更改了WSDL文件,我们紧紧需要运行一次build.xml文件即可。然而默认情况下,<wsdl2code>任务不会覆盖已经存在的文件。设置可覆盖,需要如下设置:

 

代码
<project ...>

...

<target name="generate-service">

<wsdl2code

wsdlfilename="SimpleService.wsdl"

serverside
="true"

generateservicexml
="true"

skipbuildxml
="true"

serversideinterface
="true"

namespacetopackages
="http://ttdev.com/ss=com.ttdev.ss"

targetsourcefolderlocation
="src"

targetresourcesfolderlocation
="src/META-INF"

overwrite
="true"/>

</target>

</project>

 

 

         但是这样做同时也引入了一个新的问题:如果你在SimpleServiceSkeleton中写入了一些服务代码,当你运行build.xml,这个文件也会被覆盖,那么你的实现代码就没有啦。如何解决呢?方法是,不在使用SimpleServiceSkeleton这个类。创建类SimpleServiceImple作为相同接口实现的替代类:

         为了使用自定义的SimpleServiceImpl类作为web service的实现,需要了解下Axis服务器是如何知道哪个类是web service的实现类的。它是通过在service.xml中查找类名实现的:

         你可以手工修改services.xml文件,当文件重新生成时,但是每次手工修改太麻烦并且容易忘记。最好的方法是让Ant自动完成这件事情:

         运行Ant并刷新工程,检查service.xml文件,文件应该使用了自定义类SimpleServiceImple:

 

代码
<serviceGroup>

<service name="SimpleService">

<messageReceivers>

<messageReceiver mep="http://www.w3.org/ns/wsdl/in-out"

class
="com.ttdev.ss.SimpleServiceMessageReceiverInOut" />

</messageReceivers>

<parameter name="ServiceClass">com.ttdev.ss.SimpleServiceImpl</parameter>

<parameter name="useOriginalwsdl">true</parameter>

<parameter name="modifyUserWSDLPortAddress">true</parameter>

<operation name="concat"

mep
="http://www.w3.org/ns/wsdl/in-out">

<actionMapping>

http://ttdev.com/ss/NewOperation

</actionMapping>

<outputActionMapping>

http://ttdev.com/ss/SimpleService/concatResponse

</outputActionMapping>

</operation>

</service>

</serviceGroup>

 

 

5. 自动化生成客户端代码

         生成客户端代码,跟生成服务端代码非常的类是:

         删除client包中的所有文件除了自己创建的SimpleClient.java文件。运行build.xml并选择”generate-client”目标(target)。刷新工程你将看到生成的客户端代码。

         为保证一切工作正常,启动Axis并运行客户端程序。应该能正常工作。

6.本章总结

         通过在eclipse中设置输出文件夹(链接方式),省去了每次手工拷贝类文件到服务器上的麻烦。

         可以通过配置Axis服务器使之可以实现热更新。即在服务器运行时,对代码的更改可以立即生效。

         若调试web service,首先要使Axis server运行在JVM的调试模式下。在eclipse中配置debug并连接到JVM.

         WSDL文件中自动化生成代码过程,可以使用<wsdl2code>Ant 任务。一般情况下你想覆盖已经存在的文件。为了防止覆盖你自己的代码,自动生成的代码最好不要手工修改。创建自己的服务实现类并修改service.xml文件告知Axis 服务器使用这个类。

作者: 韩连生 发表于 2011-01-25 17:45 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架