采用TinyDB组件方式开发
Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发重复功能时,可以利用已有的组件库快速开发。对于开发人员而言只需要简单配置流程就可以完成工作了。
开发增删改查的组件接口。本来这部分很花费时间,如果采用组件复用的话,就可以实现一次开发,终生受益。
- 配置curd.beans.xml和tinydb.xml。
- 使用流程编辑器定制组件流程curd.pageflow。
- 修改页面文件:list.page和operate.page,使之符合流程方式调用。
- 修改布局文件default.layout。
完整的子工程目录如下:
<ignore_js_op>
首先是开发增删改查的组件接口,如果是开发人员自己实现的话就是实现ComponentInterface接口,然后在组件里实现具体的数据库逻辑,其实Tiny框架提供基础组件库,配合TinyDB进行开发,可以实现无Pojo,无Dao层,在本示例中开发人员不用写一行Java代码,通过配置就可以完成示例需求。
基础组件资源
Icon目前Tiny框架提供如下几种组件库,用户可以根据实际需要配合流程编辑器使用。
- org.tinygroup.flowbasiccomponent 提供了逻辑基本组件,如对象转换组件、调用静态方法和bean组件等。
- org.tinygroup.flowservicecomponent 提供了逻辑基本服务,如调用服务、调用本地流程、调用页面流程等。
- org.tinygroup.tinydbflowcomponent 提供了TinyDB数据库组件,如插入组件、更新组件、删除组件、查询记录组件等。
- org.tinygroup.pageflowbasiccomponent 提供了页面基本组件,如页面重定向、页面转发等。
开发人员想要使用使用组件库中的内置组件,必须将具体的依赖加入到工程的pom.xml,这样在使用图形化工具,在右侧的组件列表就能看到组件清单:<ignore_js_op>
本示例用到了数据库访问和页面跳转,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,然后按下图拖曳组件:
<ignore_js_op>
接下来修改组件的基本信息:标识、英文名和中文名。以插入组件为例,鼠标选中画板里的“插入组件”,在Eclipse的下方的“Properties”,就可以看到如下内容:
<ignore_js_op>
五个组件修改完毕,界面如下图展示:
<ignore_js_op>
然后是配置组件的扩展属性,每个组件的扩展属性是根据自身功能定制的,具体的组件参数请参考各组件的帮助文档。这里还是以“新增用户”为例:
<ignore_js_op>
说明:这里类型就是数据库表的值对象类型TUser,模式是指数据库的schema,其他几个组件也是类似。
配置好五个组件的扩展属性,就是配置页面组件的扩展属性。页面组件的扩展属性就一个:页面路径。
页面重定向的配置如下:
<ignore_js_op>
查询单用户对应的页面转发配置如下:
<ignore_js_op>
查询用户列表对应的页面转发配置如下:
<ignore_js_op>
完整的curd.pageflow的内容如下:
- <flowid="crud"enable="true"private-context="false">
- <parameters/>
- <nodes>
- <nodeid="start"name="start"title="开始">
- <next-nodes>
- <next-nodenext-node-id="addUser"/>
- <next-nodenext-node-id="updateUser"/>
- <next-nodenext-node-id="deleteUserById"/>
- <next-nodenext-node-id="getUserById"/>
- <next-nodenext-node-id="redirectComponent"/>
- <next-nodenext-node-id="queryUsers"/>
- </next-nodes>
- </node>
- <nodeid="addUser"name="addUser"title="新增用户">
- <componentname="tinydbAddService"title="插入组件">
- <properties>
- <flow-propertyname="beanType"value="TUser"/>
- <flow-propertyname="schema"value="sample"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="redirectComponent"/>
- </next-nodes>
- </node>
- <nodeid="updateUser"name="updateUser"title="更新用户">
- <componentname="tinydbUpdateService"title="更新组件">
- <properties>
- <flow-propertyname="beanType"value="TUser"/>
- <flow-propertyname="schema"value="sample"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="redirectComponent"/>
- </next-nodes>
- </node>
- <nodeid="deleteUserById"name="deleteUserById"title="删除用户">
- <componentname="tinydbDeleteService"title="删除组件">
- <properties>
- <flow-propertyname="beanType"value="TUser"/>
- <flow-propertyname="schema"value="sample"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="redirectComponent"/>
- </next-nodes>
- </node>
- <nodeid="getUserById"name="getUserById"title="查询单用户">
- <componentname="tinydbQueryServiceWithId"title="单记录查询组件">
- <properties>
- <flow-propertyname="beanType"value="TUser"/>
- <flow-propertyname="schema"value="sample"/>
- <flow-propertyname="primaryKey"value="${primaryKey}"/>
- <flow-propertyname="resultKey"value="user"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="forwardComponent"/>
- </next-nodes>
- </node>
- <nodeid="forwardComponent"name="forwardComponent"title="页面转发">
- <componentname="forwardComponent"title="页面转发">
- <properties>
- <flow-propertyname="path"value="/crud/operate.page"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="end"/>
- </next-nodes>
- </node>
- <nodeid="redirectComponent"name="redirectComponent"title="页面重定向">
- <componentname="redirectComponent"title="页面重定向">
- <properties>
- <flow-propertyname="path"value="crud.pageflow?tiny_flow_id=queryUsers"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="end"/>
- </next-nodes>
- </node>
- <nodeid="queryUsers"name="queryUsers"title="查询用户列表">
- <componentname="tinydbQueryService"title="查询组件">
- <properties>
- <flow-propertyname="beanType"value="TUser"/>
- <flow-propertyname="schema"value="sample"/>
- <flow-propertyname="resultKey"value="users"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="forwardComponent_1"/>
- </next-nodes>
- </node>
- <nodeid="forwardComponent_1"name="forwardComponent"title="页面转发">
- <componentname="forwardComponent"title="页面转发">
- <properties>
- <flow-propertyname="path"value="/crud/list.page"/>
- </properties>
- </component>
- <next-nodes>
- <next-nodenext-node-id="end"/>
- </next-nodes>
- </node>
- <nodeid="end"name="end"title="结束">
- <next-nodes/>
- </node>
- </nodes>
- < /flow>
<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代码如下:
- <formaction="${TINY_CONTEXT_PATH}/crud.pageflow">
- 姓名:<inputtype="text"name="name"value="${user?.name}"/><br/>
- 年龄:<inputtype="text"name="age"value="${user?.age}"/><br/>
- <inputtype="hidden"name="id"value="${user?.id}"/>
- #if($user)
- <inputtype="hidden"name="tiny_flow_id"value="updateUser"/>
- #else
- <inputtype="hidden"name="tiny_flow_id"value="addUser"/>
- #end
- <inputtype="submit"value="提交">
- < /form>
<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>
- <inputtype="button"id="add"value="添加"/>
- <inputtype="button"id="update"value="修改"/>
- <inputtype="button"id="delete"value="删除"/>
- </p>
- <tablecellpadding="0"cellspacing="1"border="0"bgcolor="#ebebeb"width="500px">
- <tbody>
- <trbgcolor="#ffffff">
- <thwidth="35"><inputtype="checkbox"id="selectAll"/></th>
- <thwidth="100px"height="35">名称</th>
- <thwidth="365px">年龄</th>
- </tr>
- #foreach($user in $users)
- <trbgcolor="#ffffff">
- <tdalign="center"><inputtype="checkbox"name="id"value="$user.id"/></td>
- <tdalign="center"height="30">$user.name</td>
- <tdalign="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>
用户管理界面: <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的配置如下:
- <tableborder="1"width="100%">
- <tr>
- <tdcolspan="2">
- <ahref="${TINY_CONTEXT_PATH}/crud.pageflow?tiny_flow_id=queryUsers">用户管理</a><br/>
- </td>
- </tr>
- <tr>
- <tdwidth="20%">tinydb流程方式</td>
- <td>
- ${pageContent}
- </td>
- </tr>
- < /table>
<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>
到这一步,流程编排的例子算是开发完毕。
演示效果<ignore_js_op>
具体的增删改查效果,用户可以根据教程自行尝试。
欢迎访问开源技术社区:http://bbs.tinygroup.org。本例涉及的代码和框架资料,将会在社区分享。《自己动手写框架》QQ成员群:228977971,一起动手,了解开源框架的奥秘!或点击加入群:http://jq.qq.com/?_wv=1027&k=d0myfX
相关推荐
由于其小巧的体积和易用性,TinyDB 成为了许多开发者在原型开发或测试阶段的首选。 TinyDB 的主要优点在于它的简洁性和灵活性。它不需要安装,只需导入 Python 包即可使用,这使得它非常适合快速开发。此外,TinyDB...
2. 数据模型:TinyDB采用事件流模型,每个传感器节点可以产生一系列时间戳标记的数据流。 3. 分布式处理:查询在传感器网络中分布式执行,由多个节点协作完成。 三、TinyDB安装与配置 1. 获取TinyDB:从tinyOS的库...
【标题】"org.tinygroup.tinydb-2.0.21.zip" 提供的是 TinyDB 的一个特定版本,2.0.21。...这些知识点涵盖了数据库技术、Java开发、版本控制以及开源社区的参与方式,对Java开发者来说是很有价值的信息。
采用TinyDB引擎,所有数据都可一存在单个文件中。对Delphi和C++Builder小型应用程序,TinyDB是一个理想的BDE替换引擎。 主要特征: 从TDataSet继承,支持所有的数据感知控件 不需要BDE、DLL和OCX 所有数据在单个...
TinyDB 是什么? 它是以VCL形式提供给Delphi/BCB程序员的一个小型桌面数据库引擎,目前包含... TinyDB 从2.94版本发布日起,成为一款开源组件包。您可以免费使用,无需注册或付费;您也可以用于任何商业用途。
TinyDB 是一个轻量级的、文件存储的数据库系统,主要设计用于简单的数据存储和检索,尤其适合在嵌入式设备或对性能要求不高的环境中使用。它使用Python语言编写,易于理解和集成到你的项目中。这个压缩包包含了两个...
采用TinyDB引擎,所有数据都可一存在单个文件中。对Delphi和C++Builder小型应用程序,TinyDB是一个理想的BDE替换引擎。 主要特征: 从TDataSet继承,支持所有的数据感知控件 不需要BDE、DLL和OCX 所有数据在单个...
TinyDB是一款轻量级的NoSQL数据库,设计用于在Python环境中提供简单、灵活的数据存储解决方案。作为Memcached的替代品,TinyDB强调的是易用性和灵活性,而非高性能的缓存服务。它适用于那些对内存效率要求不高,但...
这是我在Torry's Delphi Pages中找到的资源。原作者为白日梦工作室原版。由Jaro Benes基于2.94原版... TinyDB 从2.94版本发布日起,成为一款开源组件包。您可以免费使用,无需注册或付费;您也可以用于任何商业用途。
服务器TinyDB使用uds ou TCP / IP(零项目波纹管) 要看: 运行前测试: # Create data to uds file and .json file mkdir data # to set the paths . ./test/enable_develop_path.sh 测试服务器: ./test/server_...
采用TinyDB引擎,所有数据都可一存在单个文件中。对Delphi和C++Builder小型应用程序,TinyDB是一个理想的BDE替换引擎,即将移植到Kylix。主要特征:从TDataSet继承,支持所有的数据感知控件不需要BDE、DLL和OCX所有...
`Packages` 文件夹通常包含Delphi的BPL(Binary Package Library)包,这些包可以方便地将TinyDB集成到Delphi IDE中,使得开发人员可以在他们的项目中直接使用TinyDB组件。安装这些包后,TinyDB的组件和类会出现在...
tinydb系列化 tinydb-serialization为TinyDB否则无法处理的对象提供序列化。 用法 一般用法 要使用序列化程序,请使用要使用的存储类创建一个SerializationMiddleware实例,并注册要使用的序列化程序。 然后,您将...
所用技术:Flask、TinyDB。 系统架构主要分为4大模块功能:系统设置(常用功能放在系统设置文件中)、后台管理(前台和后台分离),登录认证管理(只有合法的用户才能登录系统),博客展示(在前台页面上显示博客...
TinyDB-Android共享首选项-Turbo 此类简化了一行代码中对SharedPreferences的调用。 它还可以做更多类似的事情:保存字符串,整数列表和保存图像。 全部在1行代码中! 用法示例: TinyDB tinydb = new TinyDB...
对于Delphi XE和XE2开发者而言,TinyDb2.94提供了与这两个版本IDE的兼容性,这意味着开发者可以利用其强大的组件库和IDE特性来配合TinyDb进行开发。Delphi XE和XE2是Embarcadero公司发行的两个重要版本,它们在...
通常,这样的开源项目会有详细的README文件介绍如何安装和使用,以及相关的开发文档和示例。 总的来说,TinyDB是一个适用于小型项目和学习用途的数据库,它提供了简单、灵活的数据存储解决方案,尤其是对于Python...
TinyDB 是一个针对 Python 开发者的轻量级、文件存储的文档型数据库。它设计的目标是简单易用,适用于小型项目或嵌入式系统,不适用于高性能或大规模数据处理的场景。TinyDB 的核心特性包括无服务器依赖、JSON 数据...
资源来自pypi官网。 资源全名:tinydb-4.0.0-py3-none-any.whl