阅读更多

ToyBricks

ToyBricks(积木)(以下简称ToyBricks)是基于面向积木方法论构建的、面向Java开发(尤其是RIA应用)的开源开发平台, 旨在提供给开发者一个简单易用、高效率、高产品质量、易扩展的开源平台,“像搭积木一样开发软件”。

 

ToyBricks解决了很多长期困扰Java开发者的问题,如:


1)开发所应用的“平台”都是拼凑而成而非真正意义上的整合解决方案

事实上,很多软件公司的平台都是用开源软件“混搭”而成,典型的,如 SSH(Struts+Spring+Hibernate)、FSH(Flex+Spring+Hibernate)等,这种混搭方案天然的割裂了作为组件 的完整性,因为很多组件是横跨展现、业务逻辑甚至持久层的


2)JavaEE中Web开发规范的缺陷。

在当前的JavaEE开发中,作为一个功能,页面与业务逻辑、配置等文件是分散在不同地方的 (页面jsp、 html、js、css、图片等等一般放在工程rootFolder的某个文件夹中;业务逻辑放在classpath下;配置文件有时候要放在WEB-INF 文件夹中),这种分散天然的破坏了作为一个功能的“聚合”要求 (事实上在我们日常的设计工作中,人们追求松耦合更甚于高聚合),我们很多时候是希望作为一个功能的全部文件放在一起的;
这种分散式的结构直接导致了“一个功能或模块打包形成一个jar文件作为产出物”的困难


3)多个功能、模块之间的冲突问题

jar冲突是最显而易见的了,不同模块要求同一jar的版本可能不同,由于缺乏像OSGI那样的单元(OSGI中为Bundle) 隔离机制,所以只能一方向另一方妥协;


4)编程模型复杂、学习难度高

无论Struts的MVC、Flex的组件模型、Spring的IOC/AOP、Hibernate的ORM等等,其学习与应用 都是有一定难度的;


5)缺乏组件模型或组件模型复杂。

可复用的资源积累是一个软件企业知识资产积累的重要组成部分 ,以JSP的Tag为例,目前很多企业内部只有少部分高 水平技术人员被授权开发公司应用的标签库,这严重限制了可复用资源的积累;

 

6)缺乏清晰的功能、模块边界。

能、模块之间高度耦合,且耦合分散在各个角落,导致模块拆分困难

 

ToyBricks目前提供的功能

1)ToyBricks JavaBean运行容器;
2)Aquarell模板引擎;
3)RIA实现;
4)常规组件库:

  1】  UI

      1.   按钮(支持下拉菜单、状态控制、图标自动匹配)

      2.  Text 编辑器(支持自定义扩展、校验器等)

      3.  TextArea 编辑器(支持自定义扩展、校验器等)

      4. Combox 编辑器(可组合其他编辑器、支持即时搜索(可配置客户端或服务端数据源)、校验器等等)

      5.  日期(时间)选择器(支持可配置的年月、年月日、年月日时间、时间等等选择)

      6. HTML 编辑器(基于 CKEditor ,支持各类常规操作,可通过配置 mode (模式)为 basic/cms 等来批量选择功能按钮)

      7.  选择树编辑器(支持单选、多选、节点锁定等等)

      8.  文件上传(基于 Flex 技术、支持单个与多文件上传、限制类型、大小、各类回调函数等等)

      9.  代码高亮显示

      10.  数据表格(支持列排序、列搜索、单元格编辑、分页、行菜单、表格菜单、预定义模板按钮等等)

      11.  自由格式表格

      12.  Tree (支持节点懒加载、工具条按钮扩展、节点菜单等等)

      13.   表单( Form )(支持编辑器自由布局与格式化布局、支持值自动分发与收集、统一校验等等)

      14.  菜单(无限层级支持、状态控制、动态数据源等等)

      15.  菜单条

      16.  TabBox (支持 Tab 懒加载、锁定等)

      17.  工具条

      18.   对话框

      19.  CSS 引用(支持全局(页面)唯一引用)

      20.  JavaScript 引用(支持全局(页面)唯一引用)

      21.  Splitter

      22.  图标库(预置了上百种各类图标,提供非常简单的扩展机制)

  2】  数据源(基于 Toplink JPA ),支持基于 JPA 规范的 ORM ,支持多数据源,域对象自动发现等等)

  3】  Dao (同时支持基于 JPA 规范与原生 SQL

 

ToyBricks的特性

1)开发者只需要掌握简单的Java、Html(简单的Javascript及CSS)即可
2)搭积木的开发体验 ,开发者只需要编写必须的代码;
3)ToyBricks提供了丰富的组件库
4)桌面级的用户产品体验
5)应用即组件、一切皆组件 。事实上,实际开发中有约50%以上都是重复的功能,基于ToyBricks体系,您可以将您想要的一切封装成组件;
6)一个功能(模块、甚至系统)可以打包成一个jar文件,边界清晰
7)运行时隔离;
8)比OSGI更简单的扩展机制 (套娃模型);
9)搭配ToyBricks的WebOS平台,您已经拥有了一套完整的系统;

 

ToyBricks平台结构

 

 

 

【下载ToyBricks平台(V4.0)核心源代码

 

【下载ToyBricks平台源代码许可协议 

 

【下载ToyBricks平台开发手册 

 

【下载Demo样例 part1 part2 part3 MyEclipse工程形式的Demo(下载附件后(共三部分),解压缩,import入MyEclipse即可)

 

Demo工程源码简单分析

 

1.文件结构

 

 

2.源代码片段

 

project.ria.xml 该文件定义了应用程序

 

<?xml version="1.0" encoding="UTF-8"?>
<prolet id="helloworld" title="Helloworld" view="helloworld.aq.html"
	class="HelloworldBiz">
	<!-- 子应用程序 -->
	<subpro id="dialog0" title="对话框" view="dialog0.aq.html" />
	<subpro id="dialog1" title="helloworld作为组件使用" view="dialog1.aq.html" />
</prolet>
   

HelloworldBiz 主应用程序的业务逻辑

 

package helloworld;

import java.util.HashMap;
import java.util.Map;

import org.cloudsinger.components.util.ListDataModel;
import org.cloudsinger.toybricks.api._JunctionTo;

public class HelloworldBiz {

	private String name = "Hello ToyBricks.";

	public void setName(String _name) {
		name = _name;
	}

	/**
	 * ajax调用返回结果
	 * 
	 * @return
	 */
	public String getName() {
		return name;
	}

	/**
	 * 挂接到组件(demoGrid)的依赖项(getDataSource),获取数据源
	 * <p>
	 * 数据表格获取数据源有多种方法,如直接给出jpaSql、如本例中给出结果集等等
	 * </p>
	 * 
	 * @return
	 */
	@_JunctionTo("this/demoGrid:getDataSource")
	public ListDataModel<Map<String, String>> getDemoGridDS() {
		ListDataModel<Map<String, String>> rtn = new ListDataModel<Map<String, String>>();
		Map<String, String> row = new HashMap<String, String>();
		row.put("id", "20110203");
		row.put("title", "面向积木编程");
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		rtn.getDataList().add(row);
		return rtn;
	}

}
   

helloworld.aq.html 主应用程序的视图

 
<!-- 引用ToyBricks的UI组件库 -->
<#taglib use="cloudsinger.components/ui/*" for="cs"/>

<style>
	.tt{
		background-color:#f1f1f1;
		height:50px;font-family:微软雅黑;font-size:16px;font-weight:bold;
		line-height:50px;
	}
</style>

<script>
	function sayHello(){	
		var msg = ${window}.ajax("getName");
		alert("您单击的结果是:"+msg+",右键单击可以显示菜单哦");
	}
	function showDialog(){
		${window}.dialogR("dialog0",500,400);
	}
	function showOtherHelloworld(){
		${window}.dialog("dialog1",700,400);
	}
</script>

<#-- 打印变量 --#>
<div class="tt">${name}</div>

<#-- 菜单条组件 --#>
<cs:Menubar>
	<cs:Menu title="文件">
		<cs:item title="打开对话框" onclick="showDialog" />
		<cs:item title="将helloworld作为组件打开" onclick="showOtherHelloworld" />
		<cs:item />
		<cs:item title="其他">
			<cs:item title="子菜单项目" onclick="alert('子菜单项目')" />
			<cs:item title="子菜单项目" onclick="alert('子菜单项目')" />
			<cs:item title="子菜单项目" onclick="alert('子菜单项目')" />
		</cs:item>
	</cs:Menu>
	<cs:Menu title="帮助">
		<cs:item title="关于" onclick="alert('ToyBricks开放平台演示应用程序')"/>
	</cs:Menu>
</cs:Menubar>

<#-- 工具条组件 --#>
<cs:Toolbar>
	<cs:Button title="新建" onclick="alert('新建')" />
	<cs:Button title="打开对话框" onclick="showDialog" />
	<cs:Button title="将helloworld作为组件打开" onclick="showOtherHelloworld" />
	<cs:Button/>
	<cs:Button title="关于">
		<cs:menu>
			<cs:Menu>
				<cs:item title="关于" onclick="alert('ToyBricks开放平台演示应用程序')"/>
			</cs:Menu>
		</cs:menu>
	</cs:Button>
</cs:Toolbar>

<#-- 菜单组件,注册为按钮btn的右键菜单 --#>
<cs:Menu apply="#btn">
	<cs:item title="测试菜单项" />
	<cs:item title="新建" />
	<cs:item />
	<cs:item title="其他">
		<cs:item title="测试菜单项" />
	</cs:item>
</cs:Menu>

<#-- 数据列表组件 --#>
<cs:DataGrid id="demoGrid" style="height:300px;width:100%;">
	<cs:columns>
		<cs:colum field="id" title="ID" />
		<cs:colum field="title" title="标题" />
	</cs:columns>
	<cs:rows onDblClick="showDialog">
		<cs:menu>
			<cs:Menu>
				<cs:item title="打开对话框" onclick="showDialog" />
				<cs:item title="将helloworld作为组件打开" onclick="showOtherHelloworld" />
			</cs:Menu>
		</cs:menu>
	</cs:rows>
</cs:DataGrid>
 

 

dialog0.aq.html 第一个对话框的视图

 

<#taglib use="cloudsinger.components/ui/*" for="cs"/>

<cs:TabBox>
	<cs:Tab title="欢迎">
		<img id="imm" src="${lafPath}/welcome.gif" />
	</cs:Tab>
	<cs:Tab title="Tab页面1">
		<div>abc</div>
	</cs:Tab>
</cs:TabBox>
   

dialog1.aq.html 第二个对话框的视图

 

<#taglib use="helloworld" for="hw"/>
<div style="border:1px dashed red;">
    <hw:helloworld name="应用程序即组件,我也是一个组件哦"/>
</div>
  

 

运行效果如下图:

 

 

 

 

 

20
3
评论 共 43 条 请登录后发表评论
3 楼 mahonet 2011-10-11 12:41
ray_linn 写道
40.        rtn.getDataList().add(row); 
41.        rtn.getDataList().add(row); 
42.        rtn.getDataList().add(row); 
43.        rtn.getDataList().add(row); 
44.        rtn.getDataList().add(row); 
45.        rtn.getDataList().add(row); 
46.        rtn.getDataList().add(row); 
47.        rtn.getDataList().add(row); 
48.        rtn.getDataList().add(row); 
49.        rtn.getDataList().add(row); 
50.        rtn.getDataList().add(row); 
51.        rtn.getDataList().add(row); 
52.        rtn.getDataList().add(row); 
53.        rtn.getDataList().add(row); 
54.        rtn.getDataList().add(row); 
55.        rtn.getDataList().add(row); 
56.        rtn.getDataList().add(row); 
57.        rtn.getDataList().add(row); 
58.        rtn.getDataList().add(row); 
59.        rtn.getDataList().add(row); 
60.        rtn.getDataList().add(row); 
61.        rtn.getDataList().add(row); 
62.        rtn.getDataList().add(row); 
63.        rtn.getDataList().add(row); 
64.        rtn.getDataList().add(row); 
65.        rtn.getDataList().add(row); 
66.        rtn.getDataList().add(row); 
67.        rtn.getDataList().add(row);


吐了。。。。。。

这个确实有点恶心。。。
2 楼 ray_linn 2011-10-11 12:18
40.        rtn.getDataList().add(row); 
41.        rtn.getDataList().add(row); 
42.        rtn.getDataList().add(row); 
43.        rtn.getDataList().add(row); 
44.        rtn.getDataList().add(row); 
45.        rtn.getDataList().add(row); 
46.        rtn.getDataList().add(row); 
47.        rtn.getDataList().add(row); 
48.        rtn.getDataList().add(row); 
49.        rtn.getDataList().add(row); 
50.        rtn.getDataList().add(row); 
51.        rtn.getDataList().add(row); 
52.        rtn.getDataList().add(row); 
53.        rtn.getDataList().add(row); 
54.        rtn.getDataList().add(row); 
55.        rtn.getDataList().add(row); 
56.        rtn.getDataList().add(row); 
57.        rtn.getDataList().add(row); 
58.        rtn.getDataList().add(row); 
59.        rtn.getDataList().add(row); 
60.        rtn.getDataList().add(row); 
61.        rtn.getDataList().add(row); 
62.        rtn.getDataList().add(row); 
63.        rtn.getDataList().add(row); 
64.        rtn.getDataList().add(row); 
65.        rtn.getDataList().add(row); 
66.        rtn.getDataList().add(row); 
67.        rtn.getDataList().add(row);


吐了。。。。。。
1 楼 caoyangx 2011-10-11 11:20
看样子不错,最近好像开发平台很多,J-Hi,G4,这回还有TB积木。
希望权威机构能做个横向评测。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • “像搭积木一样开发应用”--开源的ToyBricks(积木)开发平台

    NULL 博文链接:https://cloudsinger.iteye.com/blog/1187676

  • php5构造函数与析构函数

    文章分类: Php | 没有评论 » 发布日期: 4月 8th, 2008 由 Darren 构造方法与析构方法大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法。构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版本中,构造函数的名称必...

  • Z平台-开源免费的JAVA快速开发平台

    Z平台是开源免费的Java Web快速开发平台。通过Z平台集成开发环境,以零编码、动态配置的方式能够快速开发出各类Web管理系统。Z平台框架组成所用到的各种功能组件与框架,都是开源免费的,不涉及到版权问题,商业与非...

  • 10大开源的快速开发平台—架构师必看

    低代码 / 无代码指的是提供可视化开发工具,支持拖放,内置组件浏览器和逻辑构建器。低代码 / 无代码的概念并不新鲜,这可以追溯到十多年前的无代码编程技术 (PWCT) 以及类似的系统。然而,这一概念在开发人员社区...

  • 微信公众开放平台开发 -智能机器人java源代码工程

    微信公众开放平台开发 -智能机器人java源代码工程 刘峰的博客说明已经很详细了, 本人旨在帮助刚入门微信公众平台开发苦于无法着手而迅速上手准备的, 有不明白的请联系我或微信号guestsun。 导入整个工程到...

  • 猿创征文|低代码开发15个高效开源项目推荐

    低代码开发平台(LCDP)是无需编码(0代码)或通过少量代码就可以快速生成应用程序的开发平台。通过可视化进行应用程序开发的方法,使具有不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动...

  • 18个最受欢迎的低代码开发平台【开源】

    低代码/无代码开发平台使用图形向导构建软件,而不是像传统方法那样使用计算机编程语言来构建应用程序。在本文中,我们介绍面向个人和企业用户的18个开源的最佳低代码/无代码平台。 低代码/无代码指的是提供可视化...

  • 用虚幻4开发搭积木的VR游戏

    用虚幻4开发搭积木的VR游戏 2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的“MDCC 2016 移动开发者大会• 中国”(Mobile Developer Conference China)将在北京• 国家会议...

  • C/C++开发人员要了解的几大著名C/C++开源库

    本文详细讲述C/C++开发人员需要了解的几大著名C/C++开源库。

  • 跨平台开源集成开发环境Eclipse

    Eclipse 详细介绍Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是...

  • 推荐一个开源低代码开发平台 Corteza

    100%免费的开源平台了。我查了将近十多个开源低代码平台,发现大部分开源平台,都是分了开源版本和商业用的版本。要么是开发应用数量的限制,要么是用户数量的限制。流程定制页面(这条流程是我制作的工作空间中,...

  • JimuReport积木报表,一个好用的开源免费的报表平台

    JimuReport积木报表是一款集成报表设计和大屏设计的在线报表平台,使用起来简单方便,可以帮助用户像excel一样设计页面。 使用积木报表平台,用户不仅10分钟就可以设计一个炫酷大屏,还能在平台快速制作各种报表,...

  • 顶级的 18 款开源的低代码开发平台,经典收藏

    点击上方“Github中文社区”,关注 触达Github项目 文 | 白开水出品 | OSC开源社区低代码成了企追求的主流目标,与使用计算机编程语言构建应用程序的传统方法不同,低代码开发...

  • 低代码开发之开源数据可视化分析平台datagear

    DataGear是一款开源免费的数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL、CSV、Excel、HTTP接口、JSON等多种数据源。系统基于Spring Boot、Jquery、ECharts等技术开发。数据分析底层模块,定义...

  • java桌面应用开发利器JavaFx

    与C#等开发架构不一样的是,采用javafx开发的应用,由于其天生的跨平台特性,可以完美得运行在windows、mac、linux等不同操作系统中,这也是当前国产化,自主可控的一种要求。 1、javafx简介 JavaFX 是一个开源的下...

  • Java使用开源Rxtx实现串口通讯 串口开发

    Java使用开源Rxtx实现串口通讯 串口开发,里面包含实例,下载后按自己的要求进行修改即可(仅限对java有基础的人员)。

  • 零代码快速开发平台开源了

    零代码快速开发平台出售 可开发微信小程序、公众号、CRM、ERP、MES、网站等管理系统,自动工作流、无需代码即可完成需要的程序。节约成本50%以上。 联系我:QQ:21707686 ...

  • 【转载】Go语言开发工程师一定要熟读的5个开源项目

    写代码同写文章一样,既是技术活,又是艺术活。...因此,本文针对Go语言,推荐大家5个非常优秀的开源项目,这些开源项目不仅应用广泛,而且其中所用的技术有很多基础技术,是做其它任何项目都不可或缺的。

  • php5安装详解

    以PHP for Apache as CGI binary方式为例,我喜欢用这种方式。以安装目录c:/php为例;[1]将原先的php安装目录删除,解压php-5.0.0-Win32.zip到c:/php重命名php.ini-dist为php.ini(跟php4一样)[2]修改Apache的httpd.conf文件。将原有跟php4邦定的语句删除。用以下这几行代替:ScriptAlias /php

Global site tag (gtag.js) - Google Analytics