设为首页 收藏本站
查看: 1130|回复: 0

[经验分享] QiuShiZhu

[复制链接]

尚未签到

发表于 2017-2-28 10:54:13 | 显示全部楼层 |阅读模式
背景
  无论业务上的数据怎么膨胀,哪怕是今天的大数据时代,数据处理的结果都是要给人来看的。对于业务和决策方来说,一个清晰的报表在数据时代是如虎添翼的。而对于开发人员来说,一个灵活易用的报表生成工具,也是能够节省大量的重复开发,起到事半功倍的效果。有篇文章介绍了目前存在的12款优秀的报表工具,有桌面客户端的,也有基于web的。原文地址:http://oss.org.cn/html/50/n-86250.html。
  报表工具需要覆盖的需求范围是:


  • 轻量,跨平台,基于web
  • 数据源管理
  • SQL语句(动态)解析成条件query界面
  • 执行select的SQL语言并能将结果输出
  • 各种输出形式,比如jquery的datatables,Grid, cross table,pdf,xls等等
  • 具备任务调度和邮件警告的辅助功能
  • 用户和每个sql映射的query的权限管理
  经过对比,ART(a lightweight reporting solution) 几乎能满足和覆盖常用的基于关系型数据库的报表需求,下面就对这个报表工具进行介绍

部署


  • ART的当前稳定版本是2.5.2,下载地址:http://sourceforge.net/projects/art/files/
  • 部署容器jetty或者tomcat,我选择jetty7,下载地址 http://download.eclipse.org/jetty/7.6.15.v20140411/dist/,不要使用jetty9,因为他使用的jdk7
  • JDK 选择 1.6
  •   将ART进行解压,找到art.war文件,放到jetty7的webapps目录下,然后回到jetty的根路径下执行下面的吗命令,前提是自己的JAVA_HOME已经配置好
      

    java -jar start.jar
  •   这样就启动了art的web工程,浏览器中输入http://localhost:8080/art/,如果能看到下图就说明已经能够成功启动了 DSC0000.jpg

功能介绍和screenShots
  点击setting按钮后,进入如下界面
  
DSC0001.jpg
  下面就着重介绍一下里面的一些重要的功能的设置


  •   配置ART的数据源和邮件服务等等,数据库类型提供了常用的关系型数据库,为了测试方便,我用选择已经配置好的内存数据库,如下图所示,如果在真实的生产环境,则利用源码中提供的DDL脚本,准备好相应的数据库和表即可。
    DSC0002.jpg

      设置完成后,一些额外的设置可以点击"Optional Settings"进行相关设置,设置完成后提交即可。

  •   增加数据源,ART可以适配各种关系型数据库的数据源,满足日常工作的需要,如下图所示
    DSC0003.jpg


  • 配置queryGroups,这个主要是将一些query进行打包,方便授权给用户或者用户组  
    DSC0004.jpg

  •   Queries这个是整个art的核心的东西,也是日常工作经常用到的,配置query是art这个平台的引擎。先看看创建一个新的query的界面。
      
    DSC0005.jpg

  这里有几个主要的概念,你可以把这个query归属到某个group中,这样是为了方便权限的授权。你可以选择这个query的Type,比如普通的表格,3D的图形。这个type选择后,一些和这个type配套的配置也会动态变换着。datasource是sql语句运行到哪个数据库上。Source SQL是我们要执行的sql语句,该语句可以是动态的,也可以是静态的。在这个source的下面,会有一些提示,教你如何进行配置。我们常用的三大类queryType是:a,普通表格.b,图形表格c,普通表格中的drill down查询.
  设置完基本的query配置后,我们还需要进行设置Parameter,这些parameter其实是和我们的sql source进行对应的。
DSC0006.jpg

  这里你需要和动态sql的变量进行关联,同时设置默认值,data的Type,是否需要drillDown。
  对应的sql例子如下代码
  

SELECT Period "Period", Region "Region", Volume "Volume"  FROM REGIONS_DATAMART
  WHERE Period like #period#
  ORDER BY 1,2
  

  针对查询结果的一行,来进行drillDown是需要进行drill down query的配置的。
DSC0007.jpg

  设置整个query后,效果如下

  整个查询都是自动解析出来的,是不是非常的便利
  5.剩余的一些功能基本上是围绕着用户和query的权限关系,这里就不再详细进行介绍。
  
上面只是对art最核心的功能进行简单的介绍,更多的功能还需要使用者自己去挖掘。

核心代码解析
  ART的源码使用ant来进行build,页面使用的jsp,java源码放到WEB-INF的classes里面,这个有点不太适应的。个人感兴趣的地方是动态query from表单如何生成,还有Result结果怎么输出出来。
  表单的查询的页面是http://localhost:8080/art/user/showParams.jsp?queryId=14,查看user下面的jsp页面源码,主要通过获取该query关联的parmaList来进行循环渲染到jsp的form中。
  

<jsp:useBean>
List<ParamInterface> params = aq.getParamList();  
for(ParamInterface param : params) {
  .....
  
}
  

  在页面中,执行按钮会触发一个Ajax请求,将这些参数封装提供到后台Servlet来进行处理
  

$(&quot;#response&quot;).load(&quot;ExecuteQuery&quot;,$form.serialize(),function(responseText, statusText, xhr){  ...
  
}
  

  重要的逻辑就是在这个ExecuteQuery的servlet中。下面详细介绍下这个servlet,主要介绍初始化和doPost方法


  •   初始化
      

    @Override  
    public void init(ServletConfig config) throws ServletException {
      

      super.init(config);
      

      //load all view modes
      List<String> allViewModes = ArtDBCP.getAllViewModes();
      viewModes = new HashMap<String, java.lang.Class>(allViewModes.size());
      ClassLoader cl = this.getClass().getClassLoader();
      String vm = &quot;&quot;;
      try {
      for (String viewMode : allViewModes) {
      vm = viewMode;
      viewModes.put(vm, cl.loadClass(&quot;art.output.&quot; + vm + &quot;Output&quot;));
      }
      } catch (Exception e) {
      logger.error(&quot;Error while loading view mode: {}&quot;, vm, e);
      }
      
    }
      

      目的是将art.output包下面的所有的以Output结尾的class加载到一个map中,这个主要是根据viewModes的形式来进行相关的输出处理。
      
    处理类实现ArtOutputInterface接口,并由ArtOutHandler进行flush到servlet的response中

  • 由preparedQuery生成最终需要执行的sql语句
  •   执行sql取得结果,取得result和result的Metadata,调用ArtOutHandler的方法,找到具体的接口实现类,将结果输出到页面
      

    ArtOutHandler.flushOutput(messages, o, rs, rsmd, drilldownQueries, request.getContextPath(), inlineParams, multiParams);
  •   具体的ArtOutHandler案例,以比较流程的jquery的datatables为例,类名叫做htmlDataTableOutput.部分代码如下
      

    @Override  
    public void beginHeader() {
      /*
      * Code for datatables
      */
      

      //set language file to use for localization. language files to be put in the /js directory and to be named dataTables.xx_XX.txt
      //language file content examples at http://datatables.net/plug-ins/i18n
      

      //by default don't set the language file option. (will default to english - in jquery.dataTables.min.js)
      String languageSetting =&quot;&quot;;
      

      String language=&quot;&quot;;
      if(locale!=null){
      language=locale.toString(); //e.g. en, en-us, it, fr etc
      }
      

      if (StringUtils.isNotBlank(language)) {
      String languageFileName = &quot;dataTables.&quot; + language + &quot;.txt&quot;;
      String sep = java.io.File.separator;
      String languageFilePath = ArtDBCP.getAppPath() + sep + &quot;js&quot; + sep + languageFileName;
      File languageFile = new File(languageFilePath);
      if (languageFile.exists()) {
      languageSetting = &quot;, \&quot;oLanguage\&quot;: {\&quot;sUrl\&quot;: \&quot;../js/&quot; + languageFileName + &quot;\&quot;}&quot;;
      }
      }
      

      //set table options. see http://www.datatables.net/ref
      String props = &quot;{aaSorting: []&quot;
      //+ &quot;, \&quot;sPaginationType\&quot;:\&quot;full_numbers\&quot;&quot;
      //+ &quot;, \&quot;bPaginate\&quot;: false&quot;
      //+ &quot;, \&quot;sScrollY\&quot;: \&quot;200px\&quot;&quot;
      //+ &quot;, \&quot;bScrollCollapse\&quot;: true&quot;
      //+ &quot;, \&quot;bProcessing\&quot;: true&quot;
      + languageSetting
      + &quot;, \&quot;iDisplayLength\&quot;: 50&quot; //default item in show entries e.g. -1
      + &quot;, \&quot;aLengthMenu\&quot;: [[10, 25, 50, 100, -1], [10, 25, 50, 100, \&quot;All\&quot;]]&quot; //show entries options
      + &quot;}&quot;;
      


      out.println(&quot;<link>  out.println(&quot;<script type=\&quot;text/javascript\&quot; language=\&quot;javascript\&quot; src=\&quot;../js/jquery.js\&quot;></script>&quot;);
      out.println(&quot;<script type=\&quot;text/javascript\&quot; language=\&quot;javascript\&quot; src=\&quot;../js/jquery.dataTables.min.js\&quot;></script>&quot;);
      out.println(&quot;<script type=\&quot;text/javascript\&quot; charset=\&quot;utf-8\&quot;>&quot;);
      out.println(&quot;   var $jQuery = jQuery.noConflict();&quot;);
      out.println(&quot;   $jQuery(document).ready(function() {&quot;);
      out.println(&quot;       $jQuery('#&quot; + tableId + &quot;').dataTable(&quot; + props + &quot;);&quot;);
      out.println(&quot;   } );&quot;);
      out.println(&quot;</script>  &quot;);
      

      //display parameters
      ArtOutHandler.displayParameters(out, displayParams);
      

      //start results table

      out.println(&quot;<div style=\&quot;border: 1px solid black;>  out.println(&quot; <thead><tr>&quot;);
      
    }
      

      

      
    @Override
      
    public void addHeaderCell(String s) {
      out.println(&quot;  <th>&quot; + s + &quot;</th>&quot;);
      
    }

  将页面需要用到html内容以java.io.PrintWriter的方式输出到页面进行渲染

总结
  ART作为一个轻量级的报表解决方案,所实现的功能还是基本完备的,同时设计思路不是非常复杂,非常便于业务使用和开发同学的理解.
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348344-1-1.html 上篇帖子: Spark以及Spark SQL在IntelliJ-idea上的环境搭建 下篇帖子: Hadoop JobTracker和NameNode运行时参数查看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表