润乾报表基于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