Giiwa 是一个 Java Web 的快速开发框架。
模块化:模块化开发,模块之间可以复用和重载。最大化地复用代码和资源,使得构建跨项目之间的模块更加容易。
快速开发:直观简单的程序入口出口,更容易开发和维护。避免冗重设计模式,更加快速的构建模块,快速开发和部署。
轻量级分布式:并行对等分布式计算节点关系。更容易从一个节点扩展到N个节点,构建可伸缩的分布式并行计算环境。
简洁的MVC,更加简单程序逻辑。
后台支持Java开发,View支持Velocity, Thymeleaf, FreeMaker,HTML等。系统提供文件仓库,支持前后端代码完全分离开发。
请参考:Controller。
样例程序:https://www.giisoo.com/helo/test?name=ttttt
//org.giiwa.app.web.helo.java
//helo.java
package org.giiwa.app.web;
import org.giiwa.framework.web.Controller;
import org.giiwa.framework.web.Path;
public class helo extends Controller {
@Path(path = "test")
public void test() {
String name = this.getString("name");
this.set("name", name);
this.show("/helo.html");
}
}
//end of helo.java
// /view/helo.html
//helo.html
<!DOCTYPE html>
<html>
<body>
名字:&!name
</body>
</html>
//end of helo.html
优化的数据库访问设计,更加简单高效。
请参考: Bean, BeanDAO, Helper.W, Helper.V。
支持内嵌数据库,Postgresql,Mysql,Oracle,和MongoDB数据库,支持大数据量的高效访问,提供统一API。
//org.giiwa.demo.bean.Demo.java
//begin of the Demo Bean
package org.giiwa.demo.bean;
import org.giiwa.dao.Bean;
import org.giiwa.dao.BeanDAO;
import org.giiwa.dao.Table;
import org.giiwa.dao.Helper.V;
import org.giiwa.dao.Column;
import org.giiwa.dao.UID;
import org.giiwa.dao.X;
/**
* Demo bean
*
* @author joe
*
*/
// mapping the table name in database
@Table(name = "tbl_demo")
public class Demo extends Bean {
/**
*
*/
private static final long serialVersionUID = 1L;
// define a DAO for each Bean
public static final BeanDAO<Long , Demo> dao = BeanDAO.create(Demo.class);
// mapping the column and field
@Column(name = X.ID)
long id;
@Column(name = "name")
String name;
public long getId() {
return id;
}
public String getName() {
return name;
}
// ------------
// insert a data in database
public static long create(V v) {
/**
* generate a unique id in distribute system
*/
long id = UID.next("demo.id");
try {
while (dao.exists(id)) {
id = UID.next("demo.id");
}
dao.insert(v.force(X.ID, id));
return id;
} catch (Exception e1) {
log.error(e1.getMessage(), e1);
}
return -1;
}
}
// end of the Demo Bean
//org.giiwa.demo.web.admin.demo.java
//begin of the Controller
package org.giiwa.demo.web.admin;
import org.giiwa.dao.Beans;
import org.giiwa.dao.X;
import org.giiwa.json.JSON;
import org.giiwa.dao.Helper.V;
import org.giiwa.dao.Helper.W;
import org.giiwa.demo.bean.Demo;
import org.giiwa.web.Controller;
import org.giiwa.web.Path;
public class demo extends Controller {
@Path(login = true, access = "access.demo.admin")
public void onGet() {
// get the parameters from the request
int s = this.getInt("s");
int n = this.getInt("n", 10);
// create the query condition
W q = W.create();
String name = this.getString("name");
if (!X.isEmpty(name)) {
q.and("name", name, W.OP.like);
this.set("name", name);
}
// load data from database
Beans<Demo> bs = Demo.dao.load(q, s, n);
// set the data in the controller
this.set(bs, s, n);
// show (print) the list HTML page
this.show("/admin/demo.index.html");
}
@Path(path = "detail", login = true, access = "access.demo.admin")
public void detail() {
// get the parameter from the request
long id = this.getLong("id");
// load data from the database
Demo d = Demo.dao.load(id);
// set the data in controller
this.set("b", d);
this.set("id", id);
// show (print) the detail HTML page
this.show("/admin/demo.detail.html");
}
@Path(path = "delete", login = true, access = "access.demo.admin")
public void delete() {
// get the parameter from the request
long id = this.getLong("id");
// delete the data from the database
Demo.dao.delete(id);
// response (print) the json to response
this.response(JSON.create().append(X.STATE, 200).append(X.MESSAGE, lang.get("delete.success")));
}
@Path(path = "create", login = true, access = "access.demo.admin")
public void create() {
// is POST method?
if (method.isPost()) {
// create the value object
V v = V.create();
v.set("name", this.getString("name"));
// insert the data into database
Demo.create(v);
// response(print) the json to response
this.response(JSON.create().append(X.STATE, 200).append(X.MESSAGE, lang.get("save.success")));
return;
}
// show (print) the create HTML page
this.show("/admin/demo.create.html");
}
// web api: /admin/demo/edit?id=
@Path(path = "edit", login = true, access = "access.demo.admin")
public void edit() {
// get the parameter from the request
long id = this.getLong("id");
// is POST method?
if (method.isPost()) {
// create the value object
V v = V.create();
v.set("name", this.getString("name"));
// update the data in database
Demo.dao.update(id, v);
// response (print) the json to response
this.response(JSON.create().append(X.STATE, 200).append(X.MESSAGE, lang.get("save.success")));
return;
}
// load the data from the database
Demo d = Demo.dao.load(id);
// set the data in Controller
this.set(d.getJSON());
this.set("id", id);
// show (print) the edit HTML page
this.show("/admin/demo.edit.html");
}
}
// end of the Controller
模块化开发,轻松创建模块工程文件,生成模块样例文件。
包含完整的模块生命周期管理,应用模块可以添加自己的处理逻辑在模块生命周期各个阶段。
//module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module version="1.0">
<id>652</id>
<name>demo</name>
<package>org.giiwa.demo.web</package>
<version>1.0</version>
<build>0</build>
<enabled>true</enabled>
<readme>demo</readme>
<listener>
<!--add module listener here, please refer IListener interface-->
<class>org.giiwa.demo.web.DemoListener</class>
</listener>
<filter>
<!--TODO, please refer web.IFilter, eg. <pattern>/user/login</pattern>,<class>org.giiwa.demo.web.UserFiler</class>-->
</filter>
<required>
<!--add all required modules here-->
<module name="default" minversion="1.6.1901131542"
maxversion="1.6.*" />
</required>
<key>MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKWDm99lG8Oy5b93ptb+v0lrI2O4PK4oujb4pHfq9FUJiFECe/lotkgEpjwT+4Q2LmUJpTBRSpEAGrAJfxidGgOs6kxUtEBSEfPvkifUDCmKzsvOd3R4dbfBiF0qDSxiwBV9PWwXg1TBYio345yJIRosO1JETnLdgPk/6zokMDvLAgMBAAECgYEAm6rKQTNRB6AMISYhzndN5XlUkYdH2u0HJoh39ykNn6UVhkt12j83oUhuKHcKyXBD9lc5+9WY8gNNFl/4H2gye9tEJQ5CAVoUdky79kVtkB55Aa+io0cGNA/xmhsRnpZB/ZRazBZ4dIeRoEfLWM0Ki/zr6H2VFFi737jIUlf/8DECQQDN/ZvJ/aNe6AugNaLIryZpBzIrBa2xxyK/REnpFVJGeNq84hb6n8TqZVCkk9nTTBazCptcWjuod8mJwMITANJNAkEAzbJeLjtg5r8EWza6na8kIB871ouKJdxYwr88hrx0A9aClcrYpFvA8rbgQ76Z1QJjV3dQfP38Bg+0g6MK3AFidwJAS7CBWwIw0oGvK+opa1Y4ZeU4AOjwPt+uG9uq0NN9zNlBfqAQ03x7balWrXKKWoKd4KHoHlIlk6yYSF6ksTjfDQJABV+TdkG21lBHHNrhJR1eJDisp34drb+D0hKM0jg6D5+a6a7S2fhLoguE8EAaZKYbUj2brKg13TKr1IR91CF1IQJASVILcBNP83XF/WHny5YacSalyxTdTihIISV6Jw42KFEcgIQ85iqKhZFOhibZYq9w45/XXZPgr4vP64ScUXq3iA==</key>
</module>
//end of the module.xml
//org.giiwa.demo.web.DemoListener.java
//begin of the DemoListener
package org.giiwa.demo.web;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.giiwa.demo.task.TestTask;
import org.giiwa.bean.License;
import org.giiwa.web.IListener;
import org.giiwa.web.Module;
public class DemoListener implements IListener {
static Log log = LogFactory.getLog(DemoListener.class);
@Override
public void onStart(Configuration conf, Module m) {
log.info("webdemo is starting ...");
// set the license of this module
m.setLicense(License.LICENSE.free,
"f3VOF0UAnJPBRlucnMpWXrn/7q9cbeY2VVXsphwE/iLJGPB1+1hUUHLdZOLWEafPm6hbOkvXAK9xGZuNCyTBczpib+NNizqqhLis4eODBQYHLePmEYJDdMwnDi+Z8TMNOL/uCm6rverY06qWzedJ6IWdq5ev8LJ5mUkI8gHrhcg=");
// start a test task here
TestTask.start();
}
@Override
public void onStop() {
log.info("webdemo is stopping ...");
// stop the test tasj
TestTask.stop();
}
@Override
public void uninstall(Configuration conf, Module m) {
//uninstall the module
}
@Override
public void upgrade(Configuration conf, Module m) {
//upgrade the module
}
}
// end of the DemoListener
轻量级分布式计算平台,从1个节点到n个节点任意扩展,节点之间都为对等关系,没有主从区别。
分布式计算环境包括:高速缓存,消息系统,分布式锁,分布式文件系统,分布式计算任务。
请参考: Task, MQ, Cache, Global.getLock。
//org.giiwa.demo.task.TestTask.java
//begin of the TestTask
package org.giiwa.demo.task;
import java.util.Arrays;
import org.giiwa.bean.X;
import org.giiwa.task.Task;
public class TestTask extends Task {
/**
*
*/
private static final long serialVersionUID = 1L;
public static TestTask inst = new TestTask();
private boolean stop = false;
@Override
public String getName() {
// the task name, MUST global unique in JVM
return "test.tsk";
}
@Override
public void onFinish() {
// re-run this task at a minute alter
if (!stop) {
this.schedule(X.AMINUTE);
}
}
@Override
public void onExecute() {
// do something
try {
// mapreduce, create sub task for the stream and dispatch the task to each node
// and each core
Task.mapreduce(Arrays.asList(1, 2, 3, 4), e -> {
return e * 100;
}, e -> {
System.out.println(e);
});
} catch (Exception e1) {
e1.printStackTrace();
}
}
public static void start() {
inst.stop = false;
inst.schedule(0);
}
public static void stop() {
inst.stop = true;
inst.stop(true);
}
}
//end of the TestTask
问题内容: 是否有一个提供发布/订阅模式的Java轻量级框架? 一些理想的功能 支持泛型 向发布者注册多个订阅者 API主要是接口和一些有用的实现 完全不需要内存,持久性和事务保证。 我了解JMS,但这对我来说太过分了。发布/订阅的数据是文件系统扫描的结果,扫描结果被馈送到另一个组件进行处理,然后在将其馈给另一个组件之前进行处理,依此类推。 编辑:所有在同一过程中。bean的PropertyCha
本文向大家介绍轻量级javascript 框架Backbone使用指南,包括了轻量级javascript 框架Backbone使用指南的使用技巧和注意事项,需要的朋友参考一下 Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用。 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,
本文向大家介绍轻量级的Web框架Flask 中模块化应用的实现,包括了轻量级的Web框架Flask 中模块化应用的实现的使用技巧和注意事项,需要的朋友参考一下 Flask是一个轻量级的Web框架。虽然是轻量级的,但是对于组件一个大型的、模块化应用也是能够实现的,“蓝图”就是这样一种实现。对于模块化应用的实现,在Flask 0.2版本中进行了设计。本文暂时不对“蓝图”做详细的介绍,而是先从0.2版本
本文向大家介绍前端轻量级MVC框架CanJS详解,包括了前端轻量级MVC框架CanJS详解的使用技巧和注意事项,需要的朋友参考一下 选择正确的库 创建一个JS APP没有好的工具是很有难度的,jQuery只是操作DOM的库,没有提供任何创建APP的基础,这就是为什么我们要一个类似CanJS的专门的库。 CanJS 是一个轻量级的MVC库,提供你创建一个JS APP所需的工具。 CanJS 是一个轻
定义 在一个包含了若干Erlang节点的分布式系统中,可能需要以分布的方法来控制应用。如果某个节点——上面运行了某个应用——挂了,应用要在另一个节点上被重启。 这样一个应用被称之为一个分布式应用。注意是对于应用的控制是分布的,所有应用当然都可以是分布——比如,使用其它节点上的服务。 因为一个分布式应用可能会在节点之间移动,所以必须有某种寻址机制来确保它可以被其他应用找到,无论它当前运行于哪个节点上
本文向大家介绍超好用轻量级MVC分页控件JPager.Net,包括了超好用轻量级MVC分页控件JPager.Net的使用技巧和注意事项,需要的朋友参考一下 JPager.Net MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象。 JPager.Net MVC好用的轻量级分页控件,实现非常简单,使用也非常简单。 JPager.Net MVC好用的轻量级分页控件,代码精心推敲,经多
同时,当前稳定的Debian版本仍然没有Java 11软件包(Ubuntu在openjdk-11软件包下安装了Java10),这就是为什么不稳定的sid版本被用于基本docker映像 当前可用的Oracle openjdk-11映像构建未剥离的模块,该模块具有数百兆字节,必须单独剥离: 从openjdk创建的JLink运行时映像大小(特别是libjvm.so)非常大。预期它会小得多。 解决方案:h
本文向大家介绍浅谈Android轻量级的数据缓存框架RxCache,包括了浅谈Android轻量级的数据缓存框架RxCache的使用技巧和注意事项,需要的朋友参考一下 请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个APP的感觉,因此合理地使用缓存对网络请求的数据进行处理极为重要。合理的进行缓存和网络请求,可以为APP带来更优秀的体验。图片的缓存有Picasso、Gl