Grails 加上Xfire plugin 搭建web Service 环境.总体上来说还是比较方便的.没有直接使用j2ee+xfire那么多的繁琐xml配置.Grails再一次体现了敏捷开发的便捷性.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
首先要给自己的Grails Application 应用工程装上Xfire 的插件.可以选择先下载zip包再安装也可以直接由网络安装.
Type this command in your Grail application directory //在你的应用程序目录下执行 $> grails install-plugin xfire or if you have a plugin archive locally. //如果插件已经下载到了本地,就用这个方法 $> grails install-plugin /path/to/grails-xfire-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0.7.3.zip
|
OK只要正确执行完上面的方法,那么在你的Grails Applications目录下面就会多出一个Plugins 目录.
如图:
然后到 %GRAILS_APPLICATION%/conf目录下面去修改一下UrlMappings.groovy文件,记得一定要改.
static mappings = { "/$controller/$action?/$id?"{ constraints { controller(matches:/.*[^(services)].*/) } } } //红色字体为新添加的部分 |
接下来就是直接写属于你自己需要的业务服务类了,这里我假设我的服务类名为Test,在CMD模式下输入:
%GRAILS_HOME%$> grails create-service Test |
那么在%GRAILS_APPLICATION%/grails-app/services 目录下就会生成一个TestService.groovy 文件,这就是我们要的服务文件. 我们要做的就是修改这个文件变成我们的业务逻辑服务即可.加上Groovy语法特有的闭类性质.和Spring的注入(POGO)特性,这个服务类将会显得很强大…嘿嘿
这里我先做个测试: 文件内容如下
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService;
@WebService(name="Test",serviceName="Test", targetNamespace="http://www.oksonic.cn/xfire") class TestService {
static expose=['xfire']
String otherMethod2(@WebParam String name) { return "Hello! ${name}"; }
@WebMethod @WebResult int add(@WebParam int intOne,@WebParam int intTwo) { return intOne+intTwo; }
} |
这里定义了2个方法otherMethod2 根据用户传入的姓名对用户说hello,以及一个
简单的加法 add
好了!当你写完这个方法的时候,那么这个服务也就写完了.接着就是直接启动服务来验证了.在CMD中输入
%GRAILS_HOME%$> grails run-app |
等待 1 分钟…没办法,这是我目前觉得Grails 与 Ruby 相比唯一不足的地方,就是启动太慢,但是想想,Grails在启动的时候把文件直接编译成java class ,而Ruby却没有.
或许编译时的等待正式为了换取运行时的效率吧.
OK!打开浏览器查看Test服务的wsdl吧,如过你能看到,就证明你已经成功一半了.用IE看吧,我试过用K-Meleon查看居然什么都看不到~汗.
http://localhost:8080/%Grails_Application%/services/Test?wsdl |
如图:
恩,这样环境就搭建好了,是不是很简单?如果你还觉得繁琐,你可以去查查一半xfire+java web程序的搭建方案.保管光xml配置你就看的不爽了.
环境达好了,那服务怎么访问呢? MS 为他们的程序员准备的VS可以很方便的根据wsdl自动生成访问类.那java fans欧斯搞列(怎么办呢).
我想到了Apache,翻倒一番终于看到了Axis这个webService 服务器,这是一个服务器我晕,居然还可以在运行的时候动态替换服务类文件.呵呵~可惜的是这只是一个单独的服务器,而不同与Grails是一个框架解决方案. Axis 可以根据 wsdl 自动生成调用webService的java类文件.
我们可以先到Axis/lib目录下面,用CMD执行
java -classpath ".;commons-logging-1.0.4.jar;axis.jar;commons-discovery-0.2.jar;jaxrpc.jar;wsdl4j-1.5.1.jar; " org.apache.axis.wsdl.WSDL2Java -o "abcdefg" http://localhost:8080/DerbyDemo/services/Test?wsdl
这些都是在一行里面 千万不要分行要不会报错的 -o 指定输出目录 后面跟上服务地址的 wsdl地址即可 |
这个在Axis/lib目录下就会多出abcdefg 目录 ,下面变是为这个Test服务生成的调用java类文件.我们只要把这个类文件直接复制到java IDE中,
然后写一个简单的测试类:
public static void main(String[] args) { try { Test_Service adcInterface = new Test_ServiceLocator(); Test_PortType test = adcInterface.getTestHttpPort();
//以下就要调用的方法 System.out.println(test.otherMethod2("asd")); System.out.println(test.add(33,11));
} catch (Exception e) { e.printStackTrace(); } |
OK就会看到结果了.当然把这些类直接放到Grails中的 %Grails_Application%/src/java目录下,那么在Groovy脚本中也就能这么调用了.