《开源框架那点事儿23》:採用TinyDB组件方式开发
採用TinyDB组件方式开发
Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时。能够利用已有的组件库高速开发。对于开发者而言仅仅须要简单配置流程就能够完毕工作了。
开发增删改查的组件接口。本来这部分非常花费时间,假设採用组件复用的话,就能够实现一次开发,终生受益。
- 配置curd.beans.xml和tinydb.xml。
- 使用流程编辑器定制组件流程curd.pageflow。
- 改动页面文件:list.page和operate.page。使之符合流程方式调用。
- 改动布局文件default.layout。
完整的子project文件夹例如以下:
Unnamed%20QQ%20Screenshot20141113141022.jpg (11.16 KB, 下载次数: 0)
mod=attachment&aid=ODIyfDZiMGU3MmE1fDE0MzY3ODk3OTJ8NTR8Njcz¬humb=yes" target="_blank">下载附件
1 秒前 上传
首先是开发增删改查的组件接口,假设是开发者自己实现的话就是实现ComponentInterface接口,然后在组件里实现详细的数据库逻辑。事实上Tiny框架提供基础组件库,配合TinyDB进行开发。能够实现无Pojo,无Dao层。在本演示样例中开发者不用写一行Java代码,通过配置就能够完毕演示样例需求。
基础组件资源
Icon眼下Tiny框架提供例如以下几种组件库,用户能够依据实际须要配合流程编辑器使用。
- org.tinygroup.flowbasiccomponent 提供了逻辑基本组件,如对象转换组件、调用静态方法和bean组件等。
- org.tinygroup.flowservicecomponent 提供了逻辑基本服务,如调用服务、调用本地流程、调用页面流程等。
- org.tinygroup.tinydbflowcomponent 提供了TinyDB
adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=d6687a2b61ca0eea&k=%CA%FD%BE%DD%BF%E2&k0=%CA%FD%BE%DD%BF%E2&kdi0=0&luki=9&n=10&p=baidu&q=48071190_cpr&rb=0&rs=1&seller_id=1&sid=ea0eca612b7a68d6&ssp2=1&stid=0&t=tpclicked3_hc&tu=u2012083&u=http%3A%2F%2Fwww%2Etinygroup%2Eorg%2Fconfluence%2Fpages%2Fviewpage%2Eaction%3FpageId%3D4458807&urlid=0" target="_blank">数据库
组件,如插入组件、更新组件、删除组件、查询记录组件等。 - org.tinygroup.pageflowbasiccomponent 提供了页面基本组件。如页面重定向、页面转发等。
开发者想要使用使用组件库中的内置组件,必须将详细的依赖增加到project的pom.xml。这样在使用图形化工具,在右側的组件列表就能看到组件清单:
本演示样例用到了数据库訪问和页面跳转,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,然后按下图拖曳组件:
接下来改动组件的基本信息:标识、英文名和中文名。以插入组件为例,鼠标选中画板里的“插入组件”。在Eclipse的下方的“Properties”。就能够看到例如以下内容:
五个组件改动完毕,界面例如以下图展示:
然后是配置组件的扩展属性。每一个组件的扩展属性是依据自身功能定制的。详细的组件參数请參考各组件的帮助文档。这里还是以“新增用户”为例:
说明:这里类型就是数据库表的值对象类型TUser,模式是指数据库的schema,其它几个组件也是相似。
配置好五个组件的扩展属性,就是配置页面组件的扩展属性。
页面组件的扩展属性就一个:页面路径。
页面重定向的配置例如以下:
Unnamed%20QQ%20Screenshot20141113150706.jpg (5.93 KB, 下载次数: 0)
mod=attachment&aid=ODI4fDFjMTIzNmExfDE0MzY3ODk3OTJ8NTR8Njcz¬humb=yes" target="_blank">下载附件
1 秒前 上传
查询单用户相应的页面转发配置例如以下:
查询用户列表相应的页面转发配置例如以下:
Unnamed%20QQ%20Screenshot20141113151009.jpg (5.53 KB, 下载次数: 0)
mod=attachment&aid=ODMwfGUxMWU2MzU4fDE0MzY3ODk3OTJ8NTR8Njcz¬humb=yes" target="_blank">下载附件
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>
到这一步,流程编排的样例算是开发完毕。
演示效果
详细的增删改查效果,用户能够依据教程自行尝试。
欢迎訪问开源技术社区:http://bbs.tinygroup.org。本例涉及的代码和框架资料,将会在社区分享。《自己动手写框架》成员QQ群:228977971,一起动手,了解开源框架的奥秘!
或点击增加QQ群:http://jq.qq.com/?_wv=1027&k=d0myfX
《开源框架那点事儿23》:採用TinyDB组件方式开发的更多相关文章
- 《开源框架那些事儿22》:UI框架设计实战
UI是User Interface的缩写.通常被觉得是MVC中View的部分,作用是提供跟人机交互的可视化操作界面. MVC中Model提供内容给UI进行渲染,用户通过UI框架产生响应,一般而言会由控 ...
- Tencent分布式开源框架Pebble
最近研究了T分布式开源框架Pebble,基本上想要的基础组件都有了,不过文档很糟糕,这也是T特色,只管开源不管维护:1.支持rpc/reverse_rpc2.支持http驱动3.支持tcp驱动(基于z ...
- Android UI开源框架
1.Side-Menu.Android 分类側滑菜单,Yalantis 出品. 项目地址:https://github.com/Yalantis/Side-Menu.Android 2.Context ...
- iOS常用第三方开源框架和优秀开发者博客等
博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- hibernate 入门([数据访问中间件] 开源框架)
1.内容: hibernate 也是一个经典的[数据访问中间件] 开源框架. 2.hibernate核心组件 SessionFactory[整个数据的操作]重量级组件 ...
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/39057201),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
随机推荐
- 不用call和apply方法模拟实现ES5的bind方法
本文首发我的个人博客:前端小密圈,评论交流送1024邀请码,嘿嘿嘿
- MYSQL Out of resources when opening file './xxx.MYD' (Errcode: 24)
出现Out of resources when opening file './xxx.MYD' (Errcode: 24)错误是因为打开的文件数超过了my.cnf的--open-files-limi ...
- .NET 4.5 is an in-place replacement for .NET 4.0
With the betas for .NET 4.5 and Visual Studio 11 and Windows 8 shipping many people will be installi ...
- (转)rtmp协议简单解析以及用其发送h264的flv文件
Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...
- 如何从MATLAB里面保存出分辨率高的图形
MATLAB堪称科技工作者的倚天屠龙,其科学计算,简洁的编程风格,友好的图形界面等等,都使得它颇受欢迎.MATLAB作图相当简单,而且美观,但是,缺点是分辨率低,一直没有发现,直到最近一期刊编辑告诉我 ...
- 为Hadoop创建JAR包文件Creating a JAR for Hadoop
We've seen the internals of MapReduce in the last post. Now we can make a little change to the WordC ...
- iOS:网络编程解析协议一:HTTP超文本传输协议
HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式.具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举. 说明:同步和异步请求方式在创建链接对象和创建请求对象时,用 ...
- C# 16位GUID
摘自: http://www.cnblogs.com/lcwzj/archive/2009/04/16/1436992.html 当我们想要获得一个唯一的key的时候,通常会想到GUID.这个key非 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- Kettle中txt类型数据源作为输入需要注意的地方
文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...