选择显示字体大小

一个ms sql server报表服务的java代理

探索企业级报表工具市场中新的竞争者的url接口

摘要
    从web应用程序产生高质量的打印输出是非常困难的,因为浏览器对文档布局仅仅提供了有限的控制。在浏览器中调整页边距和精确定位文档元素已证明是不可能的。当要在页面预览或页面流程必须紧密控制时,必须使用一个基于服务器端的文档创建引擎。现在,有很多这样的技术和产品。一个解决方案应该提供一个好的报表开发效率,一个gui报表设计器,良好的伸缩性,性能卓越(特别是在并发显示pdf文档时)和有着吸引人的价格。在测试的数款产品中,我们对microsoft sql server报表服务(report services,以下简称rs)很满意。

rs可以方便地集成和部署到microsoft系统环境中,但是使它可以访问java web应用程序仍需要作很多工作。这篇文章提供了一些指导,方便用户把rs集成到java web应用程序中。

    java web应用程序经常使用到ms sql server数据库。现在,ms sql server绑定了一个报表工具,报表服务(rs)。rs一年前面市后就吸引了很多开发人员的注意力。它是一个完美的报表工具:一个拥有脚本和可编程的所见即所得(wysiwyg)报表编辑器,一个传送引擎和一个功能强大的web服务接口。使用rs变得非常有意义,不仅从使用价值上考虑,而且与第三方产品比较,它减少了开发和部署的复杂性。这篇文章就是探索这种集成的应用。

rs可以被安装到sql server系统中,而不需要任何使用许可费用(目前发布的sql server 2000 企业版、标准版或开发版中均包含了rs)。rs要求在所安装的服务器上同时安装iis(inte.net information services)。报表开发的客户端是visual studio的一个插件,作为rs客户端安装程序的一个部件安装到开发环境中。最新的版本是1.0;而且,microsoft为rs已提供了service pack 1下载。rs作为一个上市不久的新产品,给开发者提供了与主流开发方式完全连贯的开发体验

版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:donner;papas;steven_guo(作者的blog:http://blog.matrix.org.cn/page/steven_guo)
原文:http://www.matrix.org.cn/resource/article/44/44375_sqlserver+report+services.html
关键字:sqlserver;report;services

:在这篇文章中,假定任何报表均是为打印而创建,术语“报表”和“文档”被交替使用。

报表服务(rs)概述

本文中描述的解决方案可以满足大量用户去分别产生独立的文档;也就是说,报表针对特定请求独立产生。本文聚焦于生成特定需求报表,并且把报表通过http流传送到浏览器;没有涉及其他的处理方式。

web应用程序收集所有的用户输入需求后发送一个报表创建请求到rs,通过保存控件数据到数据库或传送参数来收集数据。最终结果以指定的格式随后显示在用户屏幕上。

这里有两种根本不同的方式去整合rs和web应用程序。
第一,用户可以直接访问报表服务器。因此,rs必须向外部提供服务。应用程序能被rs服务器连接或重定向到对应的报表上。
第二,rs可以被web应用程序包装。报表服务不能被直接访问。web应用程序转发请求到rs服务器,并转送报表流到用户。

让我们更进一步看看这些实现方式。

rs服务器直接面向用户
when users access the rs server directly, the application can simply link or redirect to the reports (see figure 1). while this scenario at first looks attractive because it is simple, it often results in an undesirable implication.
        当用户直接访问rs服务器时,用户程序简易地连接或重定向到对应请求的报表(看图1)。这种应用场景初看起来非常有吸引力,因为部署非常简单,但是这种方式隐含着潜在的危险。


图1. 用户直接访问rs服务器

rs仅仅支持windows集成权限管理(以前被称作ntlm,或nt局域网管理器)。默认情况下,rs安装脚本配置iis以便应用windows集成权限管理。这意味着ie通过当前用户的windows信任状自动认证授权。但是,其他的浏览器可能不能实现这种自动授权方式。一旦启用基本认证,非ie浏览器将变换用户信任状(rs的一些特性不能与非ie浏览器协同工作,稍候有更多关于浏览器限制的信息)。无论使用何种认证形式,用户要么通过域账户、要么通过本地账户访问rs服务器

因此,不使用windows域账户而认证大量用户直接访问方式是不切实际的。在这个例子中,web应用程序使用ibm tivoli访问管理器和ldap目录服务管理用户许可。我们很不情愿去针对这种集成方式开发一个定制的安全管理的拓展。这种方式里,这种扩展性在sql server标准版里是不可用的,需要更昂贵的sql server 企业版才能实现。
可以配置rs使用匿名访问,但是因为一个很明显的缘由,应该避免这种配置在可公共访问的服务器上实现。

就是因为关注外部直接认证用户的能力限制,所以直接访问方式针对我们的目标是缺少吸引力的。

使用java servlet 包装rs服务器

当用户不需要直接访问报表服务器时,可以使用一个服务账户。所有的请求通过这个账户来完成,不论是谁登录了web应用程序。一个java servlet管理用户的rs请求和转送数据返回到客户端,它不需要为每个请求适用独立的帐户去登录rs服务器。在这个场景中,web应用程序必须提供一个域名,即使在默认配置中也可以实行iis认证,而不管用户的浏览器类型。


图2.应用服务器封装了rs服务器

rs(如果iis 部署在rs服务器上)应该配置使用非标准端口,从而阻止外部用户直接调用。

因为应用程序可为超过10000的用户认证使用一个服务帐户,所以我们决定使用这种方式。

报表访问方式

谈到这点,我们已经讨论了rs调用,但没有谈及一个报表怎样被调用的细节。能通过三种方式访问报表:报表管理器,web服务借口和url接口。

报表管理器

rs的web管理接口叫作报表管理器。报表管理器(可定制)有着自身的外观,要求认证方式登录(使用匿名访问iis导致错误消息),尽管microsoft在文档中宣称可以通过其他浏览器登录,但还时不能.netscape7正常登录。

报表管理器可以访问rs的所有特性。用户可以使用它去上载和运行报表;但是,因为它的管理特性,在这方面它不是一个合适的工具,它不能很好的与web应用程序整合。

web服务接口

rs的web服务接口功能完整,它提供了所有rs的特性。报表管理器作为一个web服务的客户端使用这些服务接口。如果你愿意,你可以从java/apache axis客户端访问rs web服务接口。而且,在本文中,我们集中探讨这个url接口。

url接口

与通用api相比,通过url接口可以得到一个良好的访问性能。发送一个http请求道rs url,即可创建报表。查询字符串可以包含很多参数,比如报表名字和输出格式。报表服务器按指定格式发送响应返回给请求者。

例如,一个pdf报表仅仅包含一个二进制流,一个html报表包含两个分离的页面流和嵌入图片流。因为servlet传送html到用户浏览器时并不维护rs服务器中的session,所以在客户端用户不能看到嵌入图片,而是看到了从报表服务器返回的认证失败的错误消息。因此,servlet必须解析html流中对图片的引用,从图像流中通过另外一个servlet的url接口替换这些图片引用,从而可以模拟rs中用户请求的session。

url接口包装器servlets

本文的随后部分站是给你如何去实现一套servlets,这些servlets就像一个rs的url接口客户端。

reportrequest.java

reportrequest是一个主要的servlet,用来初始化报表请求和处理报表流。reportrequest servlet被设计成一个在j2ee架构系统和microsoft报表服务web服务器直接的调解器。可以通过inte.net访问,但出于安全考虑,报表服务器是不能被访问到的。

这个servlet的任务包括:认证访问报表服务器的请求,传送报表参数,返回报表服务器响应。

认证
通过使用java中authenticator类(ntlm要求java 1.4.2 或更高版本)来调用ntlm,reportreques认证iis访问。一个定制类调用扩展了 java.net.authenticator类的reportauthenticator类,实现对用户名和密码的加密转换。要指定用户域或域名,使用如下格式:
domain\username
或:
server\username

设置回调对象,reportrequest作如下调用:

authenticator.setdefault(new reportauthenticator()); 


一旦url连接建立,服务器通过在reportauthenticator定义的信任状去交互认证。

接受请求
报表参数封装到一个枚举类型中,通过http表单提交,形成一个用户请求发送到reportrequest。这个servlet调用getavailableparameters类,这个类去检索数据库和把用户输入参数从枚举类型中封装成一个arraylist传送到报表服务器。在转入到list时,过滤并把这些参数被解析成字符串,仅把在请求中预定义的参数进行转换。报表的名字被单独提取出来,在随后的流程中被提交到报表服务器

提交到报表服务器
下一步就是使用httpurlconnection创建一个到报表服务器的连接,去模拟一个浏览器的请求。当请求时html报表时,报表服务器通过储存在cookie中流id引用图像,这些cookie会附加在html流的头部一并传送回客户端。这些流id标示初始的报表状态。

默认情况下,reportrequest把user-agent头部设置成java 1.4.2提交到服务器;但是,报表服务器是不接受cookies,禁止使用图像流。要使图像引用可用,必须使用如下的代码设置流头部参数:
repcon.setrequestproperty("user-agent", "mozilla/5.0"); 


转送响应到客户端
如果被请求的报表时其他格式而不是html格式,所有的这些报表都是从httpurlconnection的输入到客户端响应得输出的被缓存的二进制流。转送流之前,你必须模拟建立服务器流的在客户端的内容类型和部署头,代码如下:
string contenttype = reportcon.getcontenttype();

clientresponse.setcontenttype(contenttype);
clientresponse.setheader("content-disposition",
       reportcon.getheaderfield("content-disposition"));


如果报表时html格式,流必须被修改成可容纳任何扩展项,例如被包含在报表中的图片。reportrequest servlet按字符格式解析html流,查找任何引用去代替成一个连接到getreportitem servlet的链接。所以,图像表象看起来象这样:
<img src=&quot;http://reportserver/reports?querystringxxxx&quot;> 


变成了:
<img src=&quot;http://proxy/getreportitem?cookie=cookiedata&querystringxxxx&quot;> 


每个字符被处理后,这个流被转送到客户端输出流。

getreportitem.java
getreportitem servlet使用这些被返回到报表服务器的参数到与报表对应的cookie中检索辅助项。getreportitem从调用的url中提取字符串,删除cookie参数,把这个字符串设置在发往报表服务器的http get请求中,转送剩余的参数。cookie可以告诉报表服务器servlet要引用哪个流,获得引用后传送回引用的对象中。

内容类型和部署使用在reportrequest.java中相同的方法去设置,这些参数通过被缓存的二进制流传送到客户端。

下面的时序图展示了用户浏览器和servlet交互,以及servlet和rs的交互。


图3. 时序图

结论
配合使用getreportitem 和reportrequest servlet允许用户把ms sql server报表服务整合进入j2ee应用环境汇总,而不需要在安全策略上有所妥协或在inte.net上暴露报表服务器。而且,reportrequest使用http表单或传统的url方法可以运用到完整的报表功能。

因为reportrequest servlet以相对简易的方式提交参数、实现额外的安全检查和约束。所以,servlet不支持交互式html特性,例如钻取式报表;或许随着更进一步的发展,这些功能都能实现。

资源
matrix:http://www.matrix.org.cn/
javaworld:http://www.javaworld.com/


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons