一.介绍
服务器端
服务器端类图如下:
ServiceHandler:
Service处理类,所有客户端的请求都会提交给该类处理,通过servcieName查找到相应的Web服务处理类,执行业务操作。
Service:
Service接口,所有用户自己开发的Web服务,必须实现该接口中的service方法
ServiceConfig:
Service配置类,读取WebService配置文件,生成Web服务映射MAP
ServiceModule
Service模块类,每一个用户自己开发的WebService程序,都对应一个模块配置
oa-service.xml
Service配置文件,所有用户自己开发的Servier必须在此xml中配置,需要指定查找的service名称和对应的Service类名。该文件支持多XML Module配置,当多人开发时,每个人编写自己的配置文件,并最终在oa-service.xml文件中登记。
以上类位于com.oa.service.basic包中
客户端
客户端的类除ServiceHandlerProxy和ServiceHandlerException是自己编写的外,其它是通过WSDL(WebService Define Language)由JBX自动生成地。
ServiceHandlerProxy
客户端使用该类完成WebService的调用
ServiceHandlerException
WebService调用异常类
二.配置
服务器端
1. 拷贝oa-service.jar到WEB-INF的lib目录下
2. 拷贝oa-servier.xml到WEB-INF的classes目录下
3. 拷贝server-config.wsdd到WEB-INF目录下
4. 配置Web.XML,在其中加入如下配置
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAP Monitor Service</display-name>
<servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>loadInitlet</servlet-name>
<servlet-class>com.oa.servlet.LoadInitlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
<!-- WebService Servlet -->
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
测试:
在IE中输入http://192.168.0.199:8002/appModule/services/ServiceHandler?wsdl
注意,将IP地址,端口,WebModule名修改成你自己的,如果可以看到wsdl文件,则表示配置成功
客户端
1. 拷贝oa-service.jar到classpath下,完成路径添加
三. 开发示例
下面以一个常用的Hello,Word程序为示例,演示WebService的简捷开发过程
服务器端
1. 新建一个类:com.oa.service.test. HelloService.java
代码如下,注意:必须实现Service接口
package com.oa.service.test;
import com.oa.service.basic.*;
import com.oa.utils.Tools;
public class HelloService implements Service {
public Object service(Object[] args) throws ServiceException {
StringBuffer buffer = new StringBuffer();
for (int i = 0; args != null && i < args.length; i++) {
buffer.append("/r/n客户端传入参数")
.append(i)
.append(":")
.append(args[i]);
}
Tools.log.info(buffer.toString());
//从oa-service.xml中载入 HelloName
String helloName = "";
try {
helloName =
ServiceConfig.config().find("helloService").getInitParamValue("HelloName", "World");
} catch (ServiceNotFoundException e) {
Tools.log.error(e.toString());
}
//将"Hello,"+helloName作为返回值
return "Hello,"+helloName;
}
}
2. 登录该类到oa-service.xml中
<?xml version="1.0" encoding="UTF-8"?>
<ServiceConfig>
<Service className="com.oa.service.test.HelloService" name="helloService">
<init-param>
<param-name>mapping</param-name>
<param-value>bean2map</param-value>
</init-param>
<init-param>
<param-name>HelloName</param-name>
<param-value>World</param-value>
</init-param>
</Service>
</ServiceConfig>
客户端
1.编写一个测试类,你仅仅要作的,就是:
1) new 一个ServiceHandlerProxy,并在构造函数中指定WebService服务器端的URL地址,
2) 调用service方法,其中第一个参数为服务器端WebService实现类的配置名,这里是helloService,第个参数Object[]是参数列表
测试的代码如下
package com.oa.service.test;
import com.oa.service.client.*;
import junit.framework.*;
public class TestHelloService extends TestCase {
private ServiceHandlerProxy serviceHandlerProxy = null;
protected void setUp() throws Exception {
super.setUp();
/**@todo verify the constructors*/
//这里设置服务器端地址
String serviceURL = "http://192.168.0.199:8002/OAApp2/services/ServiceHandler";
serviceHandlerProxy = new ServiceHandlerProxy(serviceURL);
}
protected void tearDown() throws Exception {
serviceHandlerProxy = null;
super.tearDown();
}
public void testService() throws ServiceHandlerException {
String serviceName = "helloService";
Object[] args = new String[]{"参数1", "参数2", "参数3"};
Object[] actualReturn = serviceHandlerProxy.service(serviceName, args);
System.out.println("服务器端返回值:"+actualReturn);
/**@todo fill in the test code*/
}
}
运行代码,执行结果如下
服务器端:
客户端:
相关文件: oa-service.rar
几分稚气,几分洒脱
埋首程序间,怡然自得时。
相关评论:
prodige 于 2004-07-22 21:13:59 发表评论
写的不错!鼓励!
任卫军 于 2004-07-22 21:15:55 发表评论
以前看过之后,发现这个东东还是比较实用的,me有一点喜欢了:)
陈建江 于 2004-07-22 21:21:46 发表评论
对于复杂的Object的传递,可以采用Bean->Map->Bean的方法实现,
关于Bean->Map->Bean可以通过common包里的BeanUtils的describe和populate方法实现