润乾报表基于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文件一个目录下   <service name=”Login.jws” provider=”java:RPC”>           <parameter name=”className” value=”server.SayHello”/> //此处是你的方法。可以添加自己的方法      <parameter name=”scope” value=”request”/>        <parameter name=”allowedMethods” value=”*”/>   //*号表示允许所有方法      <messageReceiver/>     </service>    三、WEB.XML可以直接从你下载的axis项目中拿来到自己工程就好,或者自己添加:     <servlet>         <servlet-name>AxisServlet</servlet-name>         <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>     </servlet>     <servlet-mapping>         <servlet-name>AxisServlet</servlet-name>         <url-pattern>/services/*</url-pattern>     </servlet-mapping>

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

<servlet>

<servlet-name>reportServlet</servlet-name>

<servlet-class>com.runqian.report4.view.ReportServlet</servlet-class>

<init-param>

<param-name>configFile</param-name>

<param-value>/WEB-INF/reportConfig.xml</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>reportServlet</servlet-name>

<url-pattern>/reportServlet</url-pattern>

</servlet-mapping>

<taglib>

<taglib-uri>/WEB-INF/runqianReport4.tld</taglib-uri>

<taglib-location>/WEB-INF/runqianReport4.tld</taglib-location>

</taglib> 四、服务端提供的方法:

服务器上提供了几个方法,提供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