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

栏目: Html · 发布时间: 5年前

内容简介:GoSqlGo  (天下武功,唯快不破,程序无非就是接收用户输入、存到数据库。GoSqlGo能让前端直接存取数据库,独立完成项目开发。GoSqlGo是一个运行于后端的开发工具,它的特点是在运行期动态编译客户端Java代码,所有SQL和Java代码都可以在前端Html页面完成,可以彻底甩掉后端。开发完成后再利用打包工具将SQL和Java从前端移到后端,以实现安全性。忘掉MVC吧,因为现在架构变成MV两层了;忘掉FreeMaker之类模板吧,因为Java内嵌到HTML里去了;忘掉后端程序员吧,因为前端把后端的活

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

点赞 | Star

点赞很重要,必须的


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Host Your Web Site In The Cloud

Host Your Web Site In The Cloud

Jeff Barr / SitePoint / 2010-9-28 / USD 39.95

Host Your Web Site On The Cloud is the OFFICIAL step-by-step guide to this revolutionary approach to hosting and managing your websites and applications, authored by Amazon's very own Jeffrey Barr. "H......一起来看看 《Host Your Web Site In The Cloud》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具