《开源框架那点事儿23》:采用TinyDB组件方式开发

采用TinyDB组件方式开发

步骤

Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发重复功能时,可以利用已有的组件库快速开发。对于开发人员而言只需要简单配置流程就可以完成工作了。

开发增删改查的组件接口。本来这部分很花费时间,如果采用组件复用的话,就可以实现一次开发,终生受益。

  • 配置curd.beans.xml和tinydb.xml。
  • 使用流程编辑器定制组件流程curd.pageflow。
  • 修改页面文件:list.page和operate.page,使之符合流程方式调用。
  • 修改布局文件default.layout。

    完整的子工程目录如下:

Unnamed%20QQ%20Screenshot20141113141022.jpg (11.16 KB, 下载次数: 0)

下载附件

1 秒前 上传

首先是开发增删改查的组件接口,如果是开发人员自己实现的话就是实现ComponentInterface接口,然后在组件里实现具体的数据库逻辑,其实Tiny框架提供基础组件库,配合TinyDB进行开发,可以实现无Pojo,无Dao层,在本示例中开发人员不用写一行Java代码,通过配置就可以完成示例需求。

基础组件资源

Icon目前Tiny框架提供如下几种组件库,用户可以根据实际需要配合流程编辑器使用。

  • org.tinygroup.flowbasiccomponent          提供了逻辑基本组件,如对象转换组件、调用静态方法和bean组件等。
  • org.tinygroup.flowservicecomponent       提供了逻辑基本服务,如调用服务、调用本地流程、调用页面流程等。
  • org.tinygroup.tinydbflowcomponent         提供了TinyDB数据库组件,如插入组件、更新组件、删除组件、查询记录组件等。
  • org.tinygroup.pageflowbasiccomponent    提供了页面基本组件,如页面重定向、页面转发等。

    开发人员想要使用使用组件库中的内置组件,必须将具体的依赖加入到工程的pom.xml,这样在使用图形化工具,在右侧的组件列表就能看到组件清单:

Unnamed%20QQ%20Screenshot20141113143246.jpg (15.92 KB, 下载次数: 0)

下载附件

1 秒前 上传

本示例用到了数据库访问和页面跳转,pom.xml里面需要有如下依赖:

<dependency>

<groupId>org.tinygroup</groupId>

<artifactId>org.tinygroup.tinydbflowcomponent</artifactId>

<version>${tiny_version}</version>

</dependency>

<dependency>

<groupId>org.tinygroup</groupId>

<artifactId>org.tinygroup.pageflowbasiccomponent</artifactId>

<version>${tiny_version}</version>

< /dependency>

配置crud.beans.xml可以复用先前TinyDB采用服务方式的配置文件,只需要把如下内容删除:

<bean id="tinyDbCrudService" class="org.tinygroup.crud.service.impl.TinyDbCrudService" scope="singleton">

<property name="beanType" value="TUser" />

< /bean>

因为本示例并没有配置tinyDbCrudService,如果不删除的话,Web应用启动时会报异常。至于tinydb.xml文件无需任何修改,可以直接复用先前例子。

接下来按“New”-“Other”-“Tiny框架”-“页面流程”顺序,创建crud.pageflow,然后按下图拖曳组件:

Unnamed%20QQ%20Screenshot20141113144524.jpg (8.45 KB, 下载次数: 0)

下载附件

1 秒前 上传

接下来修改组件的基本信息:标识、英文名和中文名。以插入组件为例,鼠标选中画板里的“插入组件”,在Eclipse的下方的“Properties”,就可以看到如下内容:

Unnamed%20QQ%20Screenshot20141113145248.jpg (17.32 KB, 下载次数: 0)

下载附件

1 秒前 上传

五个组件修改完毕,界面如下图展示:

Unnamed%20QQ%20Screenshot20141113145525.jpg (8.65 KB, 下载次数: 0)

下载附件

1 秒前 上传

然后是配置组件的扩展属性,每个组件的扩展属性是根据自身功能定制的,具体的组件参数请参考各组件的帮助文档。这里还是以“新增用户”为例:

Unnamed%20QQ%20Screenshot20141113150154.jpg (7.42 KB, 下载次数: 0)

下载附件

1 秒前 上传

说明:这里类型就是数据库表的值对象类型TUser,模式是指数据库的schema,其他几个组件也是类似。

配置好五个组件的扩展属性,就是配置页面组件的扩展属性。页面组件的扩展属性就一个:页面路径。

页面重定向的配置如下:

Unnamed%20QQ%20Screenshot20141113150706.jpg (5.93 KB, 下载次数: 0)

下载附件

1 秒前 上传

查询单用户对应的页面转发配置如下:

Unnamed%20QQ%20Screenshot20141113150811.jpg (5.42 KB, 下载次数: 0)

下载附件

1 秒前 上传

查询用户列表对应的页面转发配置如下:

Unnamed%20QQ%20Screenshot20141113151009.jpg (5.53 KB, 下载次数: 0)

下载附件

1 秒前 上传

完整的curd.pageflow的内容如下:

<flow id="crud" enable="true" private-context="false">
  <parameters/>
  <nodes>
    <node id="start" name="start" title="开始">
      <next-nodes>
        <next-node next-node-id="addUser"/>
        <next-node next-node-id="updateUser"/>
        <next-node next-node-id="deleteUserById"/>
        <next-node next-node-id="getUserById"/>
        <next-node next-node-id="redirectComponent"/>
        <next-node next-node-id="queryUsers"/>
      </next-nodes>
    </node>
    <node id="addUser" name="addUser" title="新增用户">
      <component name="tinydbAddService" title="插入组件">
        <properties>
          <flow-property name="beanType" value="TUser"/>
          <flow-property name="schema" value="sample"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="redirectComponent"/>
      </next-nodes>
    </node>
    <node id="updateUser" name="updateUser" title="更新用户">
      <component name="tinydbUpdateService" title="更新组件">
        <properties>
          <flow-property name="beanType" value="TUser"/>
          <flow-property name="schema" value="sample"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="redirectComponent"/>
      </next-nodes>
    </node>
    <node id="deleteUserById" name="deleteUserById" title="删除用户">
      <component name="tinydbDeleteService" title="删除组件">
        <properties>
          <flow-property name="beanType" value="TUser"/>
          <flow-property name="schema" value="sample"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="redirectComponent"/>
      </next-nodes>
    </node>
    <node id="getUserById" name="getUserById" title="查询单用户">
      <component name="tinydbQueryServiceWithId" title="单记录查询组件">
        <properties>
          <flow-property name="beanType" value="TUser"/>
          <flow-property name="schema" value="sample"/>
          <flow-property name="primaryKey" value="${primaryKey}"/>
          <flow-property name="resultKey" value="user"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="forwardComponent"/>
      </next-nodes>
    </node>
    <node id="forwardComponent" name="forwardComponent" title="页面转发">
      <component name="forwardComponent" title="页面转发">
        <properties>
          <flow-property name="path" value="/crud/operate.page"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="end"/>
      </next-nodes>
    </node>
    <node id="redirectComponent" name="redirectComponent" title="页面重定向">
      <component name="redirectComponent" title="页面重定向">
        <properties>
          <flow-property name="path" value="crud.pageflow?tiny_flow_id=queryUsers"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="end"/>
      </next-nodes>
    </node>
    <node id="queryUsers" name="queryUsers" title="查询用户列表">
      <component name="tinydbQueryService" title="查询组件">
        <properties>
          <flow-property name="beanType" value="TUser"/>
          <flow-property name="schema" value="sample"/>
          <flow-property name="resultKey" value="users"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="forwardComponent_1"/>
      </next-nodes>
    </node>
    <node id="forwardComponent_1" name="forwardComponent" title="页面转发">
      <component name="forwardComponent" title="页面转发">
        <properties>
          <flow-property name="path" value="/crud/list.page"/>
        </properties>
      </component>
      <next-nodes>
        <next-node next-node-id="end"/>
      </next-nodes>
    </node>
    <node id="end" name="end" title="结束">
      <next-nodes/>
    </node>
  </nodes>
< /flow>

操作页面operate.page代码如下:

<form action="${TINY_CONTEXT_PATH}/crud.pageflow">
姓名:<input type="text" name="name" value="${user?.name}" /><br/>
年龄:<input type="text" name="age" value="${user?.age}" /><br/>
 <input type="hidden" name="id" value="${user?.id}"/>
 #if($user)
 <input type="hidden" name="tiny_flow_id" value="updateUser"/>
 #else
 <input type="hidden" name="tiny_flow_id" value="addUser"/>
 #end
< input type="submit" value="提交">
< /form>

列表页面list.page代码如下:

用户管理界面:
<form>
< div>
 <p>
  <input type="button" id="add" value="添加"/>
     <input type="button" id="update" value="修改"/>
     <input type="button" id="delete" value="删除"/>
 </p>
 <table cellpadding="0" cellspacing="1" border="0" bgcolor="#ebebeb" width="500px">
  <tbody>
   <tr bgcolor="#ffffff">
    <th width="35"><input type="checkbox" id="selectAll"/></th>
    <th width="100px" height="35">名称</th>
    <th width="365px" >年龄</th>
   </tr>
   #foreach($user in $users)
   <tr bgcolor="#ffffff">
    <td align="center"><input type="checkbox" name="id" value="$user.id"/></td>
    <td align="center" height="30">$user.name</td>
    <td align="center">$user.age</td>
   </tr>
   #end
  </tbody>
 </table>
< /div>
< form>
< script>
$(document).ready(function(){
   $("#selectAll").click(function(){
        var checked=$(this).get(0).checked;
        $(":checkbox:not('#selectAll')").each(function(){
               $(this).get(0).checked=checked;
        });
     });
   $("#add").click(function(){
       location.href="${TINY_CONTEXT_PATH}/crud/operate.page";
    }
   );
   $("#update").click(function(){
    var checkboxs=$(":checked:not('#selectAll')");
    var size=checkboxs.size();
        if(size==0){
           alert("修改前请先选择记录");
        }else if(size>1){
           alert("只能选择一条记录进行修改");
        }else{
         var checkbox=checkboxs.get(0);
         location.href="${TINY_CONTEXT_PATH}/crud.pageflow?primaryKey="+checkbox.value+"&tiny_flow_id=getUserById";
        }
    }
   );
    $("#delete").click(function(){
        if(confirm("确定要删除选择的记录吗?")){
              var checkboxs=$(":checked:not('#selectAll')");
               var size=checkboxs.size();
               if(size==0){
                alert("删除前请先选择记录");
               }else if(size>1){
                 alert("只能选择一条记录进行删除");
               }else{
              var checkbox=checkboxs.get(0);
             location.href="${TINY_CONTEXT_PATH}/crud.pageflow?id="+checkbox.value+"&tiny_flow_id=deleteUserById";
             }
        }
    }
   );
});
< /script>

默认布局文件default.layout的配置如下:

<table border="1" width="100%">
   <tr>
      <td colspan="2">
        <a href="${TINY_CONTEXT_PATH}/crud.pageflow?tiny_flow_id=queryUsers">用户管理</a><br/>
      </td>
    </tr>
    <tr>
      <td width="20%">tinydb流程方式</td>
      <td>
         ${pageContent}
      </td>
   </tr>
< /table>

到这一步,流程编排的例子算是开发完毕。

演示效果

Unnamed%20QQ%20Screenshot20141113152410.jpg (10.3 KB, 下载次数: 0)

下载附件

1 秒前 上传

具体的增删改查效果,用户可以根据教程自行尝试。


欢迎访问开源技术社区:http://bbs.tinygroup.org。本例涉及的代码和框架资料,将会在社区分享。《自己动手写框架》成员QQ群:228977971,一起动手,了解开源框架的奥秘!或点击加入QQ群:http://jq.qq.com/?_wv=1027&k=d0myfX

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-10 12:03:37

《开源框架那点事儿23》:采用TinyDB组件方式开发的相关文章

《开源框架那点事儿23》:採用TinyDB组件方式开发

採用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时.能够利用已有的组件库高速开发.对于开发者而言仅仅须要简单配置流程就能够完毕工作了.开发增删改查的组件接口.本来这部分非常花费时间,假设採用组件复用的话,就能够实现一次开发,终生受益. 配置curd.beans.xml和tinydb.xml. 使用流程编辑器定制组件流程curd.pageflow. 改动页面文件:list.page和operate.page.使之符合流程方式调用. 改动布局

《开源框架那点事儿23》:Tiny模板语言(VelocityPlus)初步入门

2 Tiny模板语言概述 3 Tiny模板语言能为您做什么? 4 Tiny模板语言简介 5 Hello Tiny! 6 注释 7 引用(References) 7.1 变量(variables) 7.2 属性(properties) 7.3 方法(methods) 8 表达式(Expression) 8.1 取值表达式 8.2 Map常量 8.3 数组常量 8.4 其他表达式 9 索引表示法 10 渲染 11 与Java无缝对接 12 模板布局 13 指令集 13.1 #set指令 13.2 条

《开源框架那点事儿22》:代码显示调用服务

采用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发重复功能时,可以利用已有的组件库快速开发.对于开发人员而言只需要简单配置流程就可以完成工作了.开发增删改查的组件接口.本来这部分很花费时间,如果采用组件复用的话,就可以实现一次开发,终生受益. 配置curd.beans.xml和tinydb.xml. 使用流程编辑器定制组件流程curd.pageflow. 修改页面文件:list.page和operate.page,使之符合流程方式调用. 修改布局文

《开源框架那点事儿11》:软件开发杂谈

杂谈之中的一个:技术仅仅是成功的一点点基础条件.真正还是得靠做人 话说,有位lianzi同学.水平不错.思想超前,签约阿里如今在百度实习,曾经由于喷我的贴又没有啥理由,因此告诉他离我远一点.可是近期他又回到我群里了.一直伸个大拇指,我说啥他都是大拇指,认为怪怪的.总不是那么个感觉,最终憋了一段时间,又恢复了正常的沟通方式,聊天实录: [传说]杭州-悠然 18:31:13 lianzi本色最终出来了. [传说]杭州-悠然 18:31:30 我学得这样才是你自己.你天天伸个大拇指.我都认为不像你了.

开源框架那点事儿25》:对框架模板引擎实现方式的改造实录

点滴悟透设计思想,Tiny模板引擎优化实录! Tiny模板引擎的实现方式原来是采用的编译方式,最近发生了一些问题,因此我觉得有必要把编译方式调整为解释方式,为此就开始了此次实现活动. 编译方式存在的问题 当时采用编译方式,主要是考虑到编译方式在运行时不必再去遍历语法树,因此就采用了编译方式.但是在实际应用当中,出现了如下问题: 文件路径冲突的问题 由于采用的是编译方式,这个时候就存在在一个选择,即:Java源代码落地或不落地的选择.如果Java文件不落地,则在有问题的时候,如果想要进行代码调试(

《开源框架那点事儿20》:发布TinyUI前端框架

以前发表过一篇文章:TinyAdmin前端展现框架,其在线演示路径为:http://www.tinygroup.org/tinyadmin/,应该说有许多人还是感觉兴趣的,但是由于这个是基于SmartAdmin框架改写的,虽然我们自己买了SmartAdmin的授权,但是广大用户如果要用的时候,就会有授权相关的问题,这会大大影响一些人的使用决策--尤其是会再发行的朋友. 再一个原因是SmartAdmin初看不是不错的,但是实际用起来,里面的问题比较多,对IE8基本上可以说是不兼容,虽然我们努力进行

《开源框架那点事儿19》:特斯拉建“桩”与开源的生命力

在美国的硅谷,在中国的中关村,许多的技术先驱者怀揣梦想,用激情不懈地追求着他们宏远的目标和巨大的个人财富.开源,正在成为这个时代目前最火热的名词之一.开源精神,作为一种合作协同的驱动力,正在发展为一种更具竞争力的产品开发模式. 我们可以从几个典型故事说起. 一.特斯拉建“桩” 2014年5月份,苹果与三星的专利侵权案做出判决,三星向苹果赔偿约1.2亿美元,巨头公司们再次向世人展示“专利”两字的份量可以重若泰山.然而,时隔一个月后,特斯拉电动车宣布开放其所有专利,仿佛要告诉人们,其实“专利”两字可

《开源框架那点事儿16》:缓存相关代码的演变

目录(?)[+] 需求整理 解决思路 具体实现 问题引入 上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲. 该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲. 当然去看相关实现代代码的时候,大致是下面的样子. [java] view plaincopyprint? public void saveSomeObject(SomeObject someObject){ MemCacheU

《开源框架那点事儿20》:探秘前端展现框架

以前发表过一篇文章:TinyAdmin前端展现框架,其在线演示路径为:http://www.tinygroup.org/tinyadmin/,应该说有许多人还是感觉兴趣的,但是由于这个是基于SmartAdmin框架改写的,虽然我们自己买了SmartAdmin的授权,但是广大用户如果要用的时候,就会有授权相关的问题,这会大大影响一些人的使用决策--尤其是会再发行的朋友. 再一个原因是SmartAdmin初看不是不错的,但是实际用起来,里面的问题比较多,对IE8基本上可以说是不兼容,虽然我们努力进行