GoSqlGo 1.1.0 发布,大前端模式,在 HTML 里写 SQL 和 Java

yong9981
 yong9981
发布于 2019年05月02日
收藏 20

GoSqlGo  ( https://gitee.com/drinkjava2/gosqlgo)

天下武功,唯快不破,程序无非就是接收用户输入、存到数据库。GoSqlGo能让前端直接存取数据库,独立完成项目开发。 

简介 | Features

GoSqlGo是一个运行于后端的开发工具,它的特点是在运行期动态编译客户端Java代码,所有SQL和Java代码都可以在前端Html页面完成,可以彻底甩掉后端。开发完成后再利用打包工具将SQL和Java从前端移到后端,以实现安全性。忘掉MVC吧,因为现在架构变成MV两层了;忘掉FreeMaker之类模板吧,因为Java内嵌到HTML里去了;忘掉后端程序员吧,因为前端把后端的活给干了(这叫大前端);忘掉前端校验吧,因为后端校验这活也归前端了,前端校验能偷懒就偷吧。

1.1.0版更新:

1.  原来1.0.0版只有的qry和java两个方法,现在扩充到以下方法,并且可以添加自定义方法了。 

$java(String, Object...) 执行多行Java语句。第一个参数是Java本体,后面是参数,在Java里可以用$1,$2...来访问。  
$javaTx(String, Object...) 执行多行Java语句并开启事务,如果有异常发生,事务回滚。
$qry(String, Object...) 将SQL查询结果的第一行第一列作为字符串值返回,第一个参数是SQL,后面是SQL参数    
$qryArray(String, Object...)  返回SQL查询的第一行数据,格式为Object[]的JSON字符串  
$qryArrayList(String, Object...)  返回多行查询结果为List<数组>的JSON格式    
$qryTitleArrayList(String, Object...)  返回多行查询结果,为List<数组>的JSON格式,但第一行内容是各个列的标题  
$qryMap(String, Object...) 返回SQL查询的第一行数据,为Map的JSON格式  
$qryMapList(String, Object...)  返回SQL查询的多行数据,为List<Map>的JSON格式  
$qryEntityList(String, Object...)  返回多行数据为List<实体>的JSON格式,SQL写法是实体类名+逗号+SQL, 示例:$qryEntityList(`a.b.Demo, select * from demo`);  

用一个示例来说明以上这些方法的使用,这是一个单页面应用,所有的SQL和业务逻辑都写在javascript里面,够酸爽的吧:

<!DOCTYPE html>
<html>
<head>
<style>...略...</style>
<script src="/js/jquery-1.11.3.min.js"></script>
<script src="/js/jquery-ajax-ext.js"></script>
<script src="/js/gosqlgo.js"></script>
</head>
<body>
    <script> 
	  document.write($java(`return new WebBox("/page/menu.html").setAttribute("title", $1);`, "Transaction demo, use jQuery")); 
	  function getUserListHtml(){ 
		  var users=JSON.parse($qryMapList(`select * from account where amount>=? order by id`,0));
		  var html="User List:<br/>";
		  for(var i=0;i<users.length;i++) 
			  html+="User ID:" +  users[i].ID+", AMOUNT:"+ users[i].AMOUNT+"<br/>"; 
	      return html;		   
	  } 
	</script>   
	<div id="msgid" class="msg"></div> 
	<p id="Users">
	    <script>document.write(getUserListHtml());</script>   
	</p>
	
	<section>
		<header>Account A</header>
		<div id="A" class="amount">
			<script>
				document.write($qry(`select amount from account where id=? and amount>=?`, 'A',0));
			</script>
		</div>
	</section>
	<section>
		<header>Account B</header>
		<div id="B" class="amount">
			<script>
				document.write($java(`return new Account($1,$2).load().getAmount();`, 'B',0));
			</script>
		</div>
	</section>
	<script>
	  function transfer(from, to, money){ 
		 var rst = $java(`#TransferMoney 
						int money=Integer.parseInt($3);
						if(money<=0) 
						  throw new SecurityException("Money<=0, IP:"+ getRequest().getRemoteAddr());
						Account a=new Account().setId($1).load();
						if(a.getAmount()<money)
						   return "Error:No enough balance!";
						Account b=new Account().setId($2).load();
						a.setAmount(a.getAmount()-money).update();
						b.setAmount(b.getAmount()+money).update(); 
						return "Transfer Success!|"+a.getAmount()+"|"+b.getAmount();
						`,	from,to,money);   
		  if(rst.startsWith("Transfer Success!")) { 
			  var words=rst.split('|');
	 	      $("#msgid").text(words[0]); 
	 	      $("#"+from).text(words[1]);
	 	      $("#"+to).text(words[2]);
	 	      $("#msgid").css("background", "#dfb");
	 	      $("#Users").html(getUserListHtml());
		  }
		  else  if(rst.startsWith("Error:")) { 
			     $("#msgid").text(rst.substring(6));
		         $("#msgid").css("background", "#ffbeb8");
		  } 
		}
	</script>
	<section>
		<header>Transfer</header>
		<form onsubmit="return false" action="##" method="post">
			<input name="amount" value="100" class="amount">
			<button name="btnA2B" value="true" onclick="transfer('A','B',100)">From
				account A to account B</button>
			<button name="btnB2A" value="true" onclick="transfer('B','A',100)">From
				account B to account A</button>
		</form>
	</section>
</body>
</html>

查看演示: 在windows下点击demo\gsg-jbooox\run_undertow_embedded.bat批处理即可。
另外还有两个演示,分别是GoSqlGo结合Vue的使用、在html里定义实体类并进行DDL生成、建表、表单输入检查、表单提交和存盘,请详见项目主页。

  2.  "gsg-jbooox"示范项目添加以下几种运行方式:
方式1,发布war包到本机的Tomcat7或Tomcat8目录下执行:
运行:修改run_tomcat_local.bat批处理文件中的TomcatFolder为本机Tomcat目录,并执行

方式2, 命令行方式在嵌入式Tomcat上运行,这种方式本机不需要安装Tomcat, Maven会自动下载
运行:双击运行run_tomcat_embedded.bat批处理即可

方式3, 命令行方式在嵌入式Jetty上运行,这种方式本机不需要安装Servlet容器, Maven会自动下载Jetty
运行:双击运行run_jetty_embedded.bat批处理即可

方式4, 命令行方式在嵌入式Undertow上运行,这种方式本机不需要安装Servlet容器, Maven会自动下载Undertow
运行:双击运行run_undertow_embedded.bat批处理即可

方式5, 导入到Eclipse中运行或调试
1.运行run_tomcat_embedded.bat批处理一次
2.运行maven_eclipse_eclipse.bat批处理,生成eclipse配置
3.打开Eclipse,导入项目,并运行其中的MainApp.java的main方法

查看结果:在浏览器输入 http://localhost

3. 添加了几个批处理命令进行打包和逆打包操作,例如:
Windows环境下,先运行run_undertow_embedded.bat一遍后,再点击goServ.bat批处理文件即可进行打包操作,再次运行run_undertow_embedded.bat就可以发现客户端的SQL和Java消失了,取而代之的是$gsg这种Ajax远调用方法,原来的SQL和Java语句被移到了服务端。  
批处理命令有goFrontForce.bat、goServ.bat、goServForce.bat、goFront.bat这几个,请详见项目主页的用法。

GoSqlGo相关开源项目 | Related Projects

期望 | Futures

GoSqlGo已发布,对它感兴趣的请加关注,或发issue提出完善意见。也欢迎同学们提交GoSqlGo演示示例,GoSqlGo如果用好了,结合前端的可视化组件,可以实现类似Delphi一样的开发效率。

版权 | License

Apache 2.0

关注我 | About Me

Github
码云

点赞 | Star

点赞很重要,必须的

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:GoSqlGo 1.1.0 发布,大前端模式,在 HTML 里写 SQL 和 Java
加载中

精彩评论

夜里独处
这算是开历史的倒车吗?以前那套jsp写得行云流水的人,好不容易摆脱了,你突然告诉他,你还是做回去吧,而且还要求你写的界面要面向客户需求,这谁能顶得住呀。
蓝水晶飞机
蓝水晶飞机
ASP、IIS6 大前端模式。嘿哈

最新评论(25

护士的小黄瓜
护士的小黄瓜
nodeJs吗
yong9981
yong9981

引用来自“贾一饼”的评论

你说做ERP,CRM,只讲究迭代快,人家干啥要用java,人家为啥不统一纯js,人家为啥不openresty,代码远程热更新
GoSqlGo只是个Java的缺省实现,适用于前端js+后端Java这种常见的组合,因为可以直接调用后端的所有Java服务,共享session。如果后端只想吊死在javascript上,如node.js,那么哪位写一个javascript版的GoSqlGo就行了(实际上更简单,因为javascript不存在Java需要动态编译的问题)。GoSqlGo不光是个工具,还是一个思路,以前你见过谁在javascript里直接写服务端SQL的? GraphQL不算,它哪个不算SQL,只能算是通讯接口。
下一个版本,GoSqlGo可以考虑加一个$js方法嵌入javascript调用后台node.js,qry系列方法就不必重写了。但是这个方案要解决Java和node.js共享Cookie、单点登录的问题。
贾一饼
你说做ERP,CRM,只讲究迭代快,人家干啥要用java,人家为啥不统一纯js,人家为啥不openresty,代码远程热更新
子杨
子杨
这是要回到三皇五帝时代
yong9981
yong9981

引用来自“exten”的评论

真的,没人敢用。各部分功能单一为好,前端只要做好自己的渲染和交互即可。大前端,越大的越不好。

引用来自“yong9981”的评论

这个要看情况, 你要是做过ERP/CRM就知道了,这种应用安全、流量、事务什么的都不叫个事(通常在线用户很少,小于千人),讲究的就是一个快,需求朝今夕改,业务逻辑杂乱繁琐,一个页面上恨不得塞上十几个按扭,这种情况下,就最适合GoSqlGo这种业务逻辑与界面绑定的开发方式了,所见即所得,根本不需要后端掺合。当天提要求,第二天就可以跑演示给客户了。

引用来自“itrice”的评论

@yong9981 那又何必前后分离呢?

引用来自“yong9981”的评论

现在开始流行全栈了,前后分离造成沟通成本,不利于快速开发。前端的要学点node.js,后端的要学Javascript和css,固守一端会被被开发效率更高的全栈汰淘的。前后分离的起源是EJB时代,美工和程序员分离,当前端美工角色淡化,越来越充当程序员角色,而后端技术越来越便利(参见GoSqlGo)的时候,对于简单的CRUD操作再去做什么前后分离就是教条主义了。
前后分离另一个原因是界面和逻辑分开,不管界面怎么变(PC/Mobile/App),后端接口可以不用变。但随着前端向跨平台化发展,一次写完,到处适应,这点理由也很快要不成立了。前后端分离是一个不得已的苦衷,并不是一个优点。
退一步来说,就算前后端分离,GoSqlGo也是支持的,因为它的工作原理是打包,当前端SQL和Java被移到后端并且给每个类起个名,并用SERV关键字hold在服务端供公开调用,这就是典型的前后分离了。
yong9981
yong9981

引用来自“exten”的评论

真的,没人敢用。各部分功能单一为好,前端只要做好自己的渲染和交互即可。大前端,越大的越不好。

引用来自“yong9981”的评论

这个要看情况, 你要是做过ERP/CRM就知道了,这种应用安全、流量、事务什么的都不叫个事(通常在线用户很少,小于千人),讲究的就是一个快,需求朝今夕改,业务逻辑杂乱繁琐,一个页面上恨不得塞上十几个按扭,这种情况下,就最适合GoSqlGo这种业务逻辑与界面绑定的开发方式了,所见即所得,根本不需要后端掺合。当天提要求,第二天就可以跑演示给客户了。

引用来自“itrice”的评论

@yong9981 那又何必前后分离呢?
现在开始流行全栈了,前后分离造成沟通成本,不利于快速开发。前端的要学点node.js,后端的要学Javascript和css,固守一端会被被开发效率更高的全栈汰淘的。前后分离的起源是EJB时代,美工和程序员分离,当前端美工角色淡化,越来越充当程序员角色,而后端技术越来越便利(参见GoSqlGo)的时候,对于简单的CRUD操作再去做什么前后分离就是教条主义了。
i
itrice

引用来自“exten”的评论

真的,没人敢用。各部分功能单一为好,前端只要做好自己的渲染和交互即可。大前端,越大的越不好。

引用来自“yong9981”的评论

这个要看情况, 你要是做过ERP/CRM就知道了,这种应用安全、流量、事务什么的都不叫个事(通常在线用户很少,小于千人),讲究的就是一个快,需求朝今夕改,业务逻辑杂乱繁琐,一个页面上恨不得塞上十几个按扭,这种情况下,就最适合GoSqlGo这种业务逻辑与界面绑定的开发方式了,所见即所得,根本不需要后端掺合。当天提要求,第二天就可以跑演示给客户了。
@yong9981 那又何必前后分离呢?
吃饼青年
吃饼青年
合久分?分久合?
yong9981
yong9981

引用来自“Holt_Vong”的评论

强烈要求推广到金融领域去
同意,见下。
yong9981
yong9981

引用来自“exten”的评论

真的,没人敢用。各部分功能单一为好,前端只要做好自己的渲染和交互即可。大前端,越大的越不好。
这个要看情况, 你要是做过ERP/CRM就知道了,这种应用安全、流量、事务什么的都不叫个事(通常在线用户很少,小于千人),讲究的就是一个快,需求朝今夕改,业务逻辑杂乱繁琐,一个页面上恨不得塞上十几个按扭,这种情况下,就最适合GoSqlGo这种业务逻辑与界面绑定的开发方式了,所见即所得,根本不需要后端掺合。当天提要求,第二天就可以跑演示给客户了。
返回顶部
顶部