原创文章,鼓励转载,请务必注明出处,作者:李佳
前段时间一直在研究axis2实现web services,今天,研究下weblogic 实现web services,实际看起来也比较简单,只是一些对ant脚本的编写,费话不多说,把我的实现例子分享给大家。
1.准备工作
下载开发环境:
eclipse3.2,weblogic9.2,apache-ant-1.6.5
2.创建项目目录webserviceWeblogic9
建立source folder:src 和 output/clientclasses
建立lib目录,在其中加入jaxrpc.jar
3.编写实现 Web Service 的 JWS 文件
package com.services;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import weblogic.jws.WLHttpTransport;
@WebService(name = "HelloWorldPortType", serviceName = "HelloWorldService")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
@WLHttpTransport(contextPath = "HelloWorldEar", serviceUri = "HelloWorldService", portName = "HelloWorldPort")
public class HelloWorldEar {
@WebMethod()
public String sayHelloWorld(String message) {
System.out.println("sayHelloWorld:" + message);
return "Here is the message: '" + message + "'";
}
}
@WebService批注指定部署webservice的必须信息,这里需要在class_path中加入C:/apps_pub/bea/weblogic92/server/lib/weblogic.jar
4.编写build.xml脚本文件
<project name="webservices-hello_world" default="all">
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="127.0.0.1" />
<property name="wls.port" value="7001" />
<property name="bea.root" value="C:/apps_pub/bea/weblogic92" />
<property name="weblogic-jar" value="${bea.root}/server/lib">
</property>
<property name="wls.server.name" value="AdminServer" />
<property name="ear.deployed.name" value="HelloWorldEar" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/HelloWorldEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}" />
<pathelement path="${java.class.path}" />
<pathelement path="bin"/>
<pathelement path="lib/jaxrpc.jar"/>
<fileset dir="${weblogic-jar}">
<include name="weblogic.jar" />
</fileset>
</path>
<path id="class.path">
<pathelement path="${java.class.path}" />
<pathelement path="lib/jaxrpc.jar" />
<fileset dir="${weblogic-jar}">
<include name="weblogic.jar" />
</fileset>
</path>
<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" classpathref="class.path" />
<taskdef name="clientgen" classname="weblogic.wsee.tools.anttasks.ClientGenTask" classpathref="class.path" />
<taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy" classpathref="class.path" />
<target name="all" depends="clean,build-service,deploy,client" />
<target name="clean" depends="undeploy">
<delete dir="${example-output}" />
</target>
<target name="build-service">
<jwsc srcdir="src" destdir="${ear-dir}" classpathref="class.path">
<module>
<jws file="com/services/HelloWorldEar.java" />
</module>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}" source="${ear-dir}" user="${wls.username}" password="${wls.password}" verbose="true" adminurl="t3://${wls.hostname}:${wls.port}" targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}" failοnerrοr="false" user="${wls.username}" password="${wls.password}" verbose="true" adminurl="t3://${wls.hostname}:${wls.port}" targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen wsdl="http://${wls.hostname}:${wls.port}/HelloWorldEar/HelloWorldService?WSDL" destDir="${clientclass-dir}" packageName="com.clientgenerate" classpathref="class.path" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" _fcksavedurl=""class.path"" />
<javac srcdir="${clientclass-dir}" destdir="${clientclass-dir}" includes="**/*.java" classpathref="class.path" />
<javac srcdir="src" destdir="${clientclass-dir}" includes="com/clients/**/*.java" classpathref="class.path" />
</target>
<target name="run">
<java classname="com.clients.ClientTest" fork="true" failοnerrοr="true">
<classpath refid="client.class.path" />
<arg line="http://${wls.hostname}:${wls.port}/HelloWorldEar/HelloWorldService" />
</java>
</target>
</project>
5.编译build.xml
首先需要启动weblogic服务,我一切都是使用默认的设置,hostname=127.0.0.1,port=7001,username=weblogic,password=weblogic
在命令行中输入ant,注意,第一次编译时候会有错误,因为在生成代理类的时候,调用服务的客户类还没生成(仔细读一下build.xml就明白了)。等生成完全代理后,会在项目目录webserviceWeblogic9中生成output目录及一些文件,这些是调用web services 的代理。
6.编写客户端调用程序
package com.clients;
import com.clientgenerate.HelloWorldPortType;
import com.clientgenerate.HelloWorldService;
import com.clientgenerate.HelloWorldService_Impl;
public class ClientTest {
// public static String webserviceWeblogic9 = "http://127.0.0.1:7001/HelloWorldEar/HelloWorldService";
public static void main(String[] args) throws Exception {
// HelloWorldService service = new HelloWorldService_Impl(webserviceWeblogic9 + "?WSDL");
HelloWorldService service = new HelloWorldService_Impl(args[0] + "?WSDL");
HelloWorldPortType port = service.getHelloWorldPort();
String str = port.sayHelloWorld("Hello World!!!");
System.out.println(str);
}
}
7.再次编译build.xml
在命令行中输入ant,编译成功。
8.察看web服务
进入weblogic console,会在Deployments处发现部署的服务HelloWorldEar
打开ie,访问http://127.0.0.1:7001/HelloWorldEar/HelloWorldService?wsdl,可以看见web服务提供的方法。
9.调用web服务
在命令行中输入ant run,能够看见返回的结果。
总结:
1.以上的方式是直接把服务部署到weblogic上去,也可以写ant脚本,打成war包部署,其实都大同小异 ,主要的工作还是在写ant脚本上。
2.个人感觉这种方式不如axis2简单,因为毕竟写ant脚本比较烦躁。但是,weblogic对axis2的支持并不那么优秀,我在tomcat上部署好的简单服务可以移植到weblogic上,但是加入wss4j.jar的安全支持后就不能移植到weblogic上了,现在还在处理这个问题。