润乾报表基于 Axis2 实现 WebService 实例

润乾报表基于 Axis2 实现 Web Service 实例说明

前言

web service 的原理及概念

一、web service

    所谓 web service 就是定义了一套标准的调用过程:

a 服务器首先用一套标准的方法向外界描述它所提供的服务的内容,就属于 WSDL。

b 客户端需要以一种标准的协议来调用此服务,这属于 SOAP。

c 服务提供者将服务内容放在一个公共的网址让大家查询,就属于 UDDI。

二、命名空间

命名空间其主要目的通过加一个命名属性,使名称保持唯一性。WSDL 有大量的使用命名空间的地方。本质上 WSDL 是一个 XML 文件,作为一个 XML 文件,为了区别同名的元素,就需要采用命名空间的概念。

三、WSDL 的本质: 服务内容的标准化描述

WSDL 的全称是 web service Description Language, 是一种基于 XML 格式的关于 web 服务的描述语言。其主要目的在于 web service 的提供者将自己的 web 服务的所有相关内容, 如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。使用者可以通过这个 WSDL 文档,创建相应的 SOAP 请求消息,通过 HTTP 传递给 web service 提供者;web 服务在完成服务请求后,将 SOAP 返回消息传回请求者,服务请求者再根据 WSDL 文档将 SOAP 返回消息解析成自己能够理解的内容。

四、SOAP 的本质:标准的传输协议

SOAP 是 web service 的标准通信协议,SOAP 为 simple object access protocoll 的缩写,简单对象访问协议. 它是一种标准化的传输消息的 XML 消息格式。

五、UDDI 的本质: 服务的公共网址

将 web service 进行 UDDI 注册发布,UDDI 是一种创建注册表服务的规范, 以便大家将自己的 web service 进行注册发布供使用者查找. 然而当服务提供者想将自己的 web service 向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的 web service 注册到相应的 UDDI 商用注册网站,目前全球有 IBM 等 4 家 UDDI 商用注册网站。因为 WSDL 文件中已经给定了 web service 的地址 URI,外部可以直接通过 WSDL 提供的 URI 进行相应的 web service 调用。所以 UDDI 并不是一个必需的 web service 组件,服务方完全可以不进行 UDDI 的注册。

项目背景

Axis2 是目前比较流行的 Web Service 引擎。Web Service 被应用在很多不同的场景。例如,可以使用 Web Service 来发布服务端 Java 类的方法,以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。Web Service 还经常被使用在 SOA 中,用于 SOA 各个部分交换数据。 润乾报表是一款纯 JAVA 的报表产品,因此本文重点说明润乾报表基于 Axis2 实现的 Web Service 功能。

下面对结合一个简单开发实例进行说明。也可以下载附件 Web Service 代码本地发布运行查看效果。附件程序是一个基于 axis 开发 Web Service 应用,包含有几个简单的方法,其中有一个方法是调用报表引擎计算报表返回结果的,通过这些可以看到润乾报表基于 Axis2 开发 Web Service 的简单过程。下面是 java axis Web Service 开发实例。

简单开发实例

一、首先创建个 WEB 工程

http://ws.Apache.org/axis/网站下载 Axis 安装包,在 MyEclipse 中建立了一个 web 项目。并将润乾报表相关的 jar 包也拷贝到项目 lib 文件夹下。所有的 jar 包列表如下:

整个项目工程目录结构如下:

二、修改 server-config.wsdd 文件,该文件和 web.xml 文件一个目录下               // 此处是你的方法。可以添加自己的方法                 //号表示允许所有方法               三、WEB.XML 可以直接从你下载的 axis 项目中拿来到自己工程就好,或者自己添加:              AxisServlet         org.apache.axis.transport.http.AxisServlet                   AxisServlet         /services/     

另外,将润乾报表必要部分也添加集成进来,如下:

reportServlet

com.runqian.report4.view.ReportServlet

configFile

/WEB-INF/reportConfig.xml

2

reportServlet

/reportServlet

/WEB-INF/runqianReport4.tld

/WEB-INF/runqianReport4.tld

四、服务端提供的方法:

服务器上提供了几个方法,提供 WebService 上的服务。列举一个报表服务方法如下:   package server;

import java.util.ArrayList;

import java.util.List;

import com.runqian.report4.model.ReportDefine;

import com.runqian.report4.usermodel.Context;

import com.runqian.report4.usermodel.Engine;

import com.runqian.report4.usermodel.IReport;

import com.runqian.report4.usermodel.ParamMetaData;

import com.runqian.report4.util.ReportUtils;

import com.runqian.report4.view.html.HtmlReport;

/**

* 调用润乾报表 API,返回报表计算结果 htmlText

@param userID 用户 ID

@param raq 报表名称

@return 计算报表结果 htmlText 内容

@throws Exception

*/

public String getRaqResult(String userID,String raq){

   String htmlText=”"; // 定义返回 html 字符串

   try { // 直接读入报表并运算输出

   String reportFile = ”D:/eclipse/workspace/webservice/WebRoot/reportFiles/”+raq+”.raq”;

   //String lic = ”D:/eclipse/workspace/webservice/WebRoot/WEB-INF/Server2011-12-31V4.0Windows.lic”;

   //ExtCellSet.setLicenseFileName(lic);// 设置授权

   ReportDefine rd = (ReportDefine)ReportUtils.read(reportFile);

        Context context = new Context(); // 构建报表引擎计算环境

   // 定义参数

   context.setParamValue(“userID”,userID); // 设参数值, 此处也可以传递权限参数,进行数据过滤

        System.out.println(“参数值:”+context.getParamValue(userID));      

   Engine engine = new Engine(rd, context); // 构造报表引擎

   IReport iReport = engine.calc(); // 运算报表

     HtmlReport hr=new HtmlReport(iReport,”report1″);

    htmlText=hr.generateHtml();// 输出报表为 html

    //System.out.println(“这是返回的 htmlText”+htmlText);

   } catch (Exception e) {

   e.printStackTrace();

}

return htmlText;     

}

五、客户端访问服务端接口获得数据的方法:

package client;

import java.util.Iterator;

import java.util.List;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

/**

* File name TestClient.java

* web service 客户端调用类

*/

public class TestClient {

/**

* main 方法

@param args

*/

public static void main(String[] args) {

// 指出 service 所在 URL

try{

raqResult();

}catch (Exception e) {

e.printStackTrace();

}

}//END FUNCTION(main)

/**

* 计算润乾报表调用 (输入用户 ID、报表名称,返回报表计算结果)

*/

public static void raqResult()throws Exception{

String endpoint = “http://127.0.0.1:8088/webservice/services/Login.jws”;

// 创建一个服务 (service) 调用(call)

Service service = new Service();

Call call = (Call) service.createCall();// 通过 service 创建 call 对象

// 设置 service 所在 URL

call.setTargetEndpointAddress(new java.net.URL(endpoint));

// 方法名 (processService) 与 MyService.java 方法名保持一致

call.setOperationName(“getRaqResult”);

// Object 数组封装了参数,参数为”This is Test!”, 调用 processService(String arg)

String ret = (String)call.invoke(new Object[] {“zhaoxq”,”demo2″});

System.out.println(ret+”raqResult”);

}//END FUNCTION(raqResult)

}

六、启动 tomcat

在浏览器地址栏输入访问http://127.0.0.1:8088/webservice/services,可以看到已有的 Web Service,看是否有方法显示,有显示,则代表服务端提供的接口可以成功访问了。其中 getRaqResult 即为润乾报表提供的报表服务。如下图:

七、然后在本地跑客户端调用报表服务

有两种方式可以测试润乾报表的 Web Service 服务是否成功启动,如下:

1、本地调试执行 TestClient 客户端程序;

2、或是可以直接输入如下网址调用报表服务,输入 URL 范例:http://localhost:8088/webservice/index.jsp?raq=demo&userid= 润乾

【备注:】raq 为调用具体报表名称;userid 为假定的用户 ID;

本例子在 index.jsp 页面获取 URL 里的参数“userID”和“raq”值, 创建一个服务 (service) 调用(call),通过 service 创建 call 对象,然后设置 service 所在 URL,调用 getRaqResult 方法并传入参数值,最后将返回结果输出到页面。运行结果如下:

运行 demo 报表,并返回结果如下:

变更运行 demo2 报表,并返回结果,如下:

【备注:】这里访问的报表均为配置的润乾报表存储目录下的 RAQ 报表模板。

总结

经过上面的简单的设置,一个润乾报表基于 Axis2 实现 Web Service 的实例就已经完成了,通过此简单实例,以后可以再根据实际项目的需求,进行扩展以满足项目需求。

关键词

Web Service、润乾报表、Axis2、JAVA