`
allwefantasy
  • 浏览: 45607 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

超敏捷Java开发框架ServiceFramework

阅读更多


ServiceFramework 根据其名字就可以知道,是一个面向服务的一站式MVC框架。脱胎于内部的一个搜索项目,通常我们定位在移动应用后端.

 

ServiceFramework设计的理念

能否让用户能够用最简单的方式解决80%的问题才是框架真正应该追求的。Java 很多框架就是为了追求框架本身的完美和扩展性而忽略了上面的原则。

 

项目地址: https://github.com/allwefantasy/ServiceFramework

 

ServiceFramework 是为了快速开发而生的。大部分互联网应用是以数据为中心的,尤其是关系型数据库。所以如果能简化数据操作,便能有效减少代码。

所以我们参照Rails ActiveRecord 对模型类做了完善的充血实现。这其中绝对没有因为java是静态语言导致的一些限制而做任何妥协。后面示例我们可以看到这一点。

核心优势是,Model方面真正实现了Java的充血模型,Query使用了ActiveRecord的风格。相信我,没有任何妥协。举个例子:

从 Form 到 Model 再到 DB

 

 

Order order = Order.create(params());
if(order.save()){
  render(ok())
}
else{
  render(HTTP_403,"参数错误");
}
 

 

下面是一个很优秀的被Play所推荐的ORM框架Ebean的Query Interface.调用方式如下

 

 

Ebean.find(Order.class)  
                .fetch("details")  
                .setMaxRows(100)  
                .where().eq("status",Order.Status.NEW)  
                .order().desc("id")  
                .findList();  
 

说说几点

  1. 模型类还是被人操作来操作去,比如需要Ebean操作Order 模型。
  2. 链式关系比较诡异,有层级关系。比如 where()下有eq()等。

再看看ServiceFramework的query interface

 

 

 List<Order> orders = Order.where("status=:status",map("status",Order.Status.NEW))
                            .joins("details")
                            .limit(100)
                            .order("id desc")
                            .fetch();
   

其实我通常会这样子:

 

@Entity
  class Order extends Model
  {
     public static JPQL status_new(){
       return where("status=:status",map("status",Order.Status.NEW));
     }
  }

  List<Order> orders = Order.status_new()
                            .joins("details")
                            .limit(100)
                            .order("id desc")
                            .fetch();

   

 

非常简单直观,天然以sql关键字区分,没有任何学习成本,都是按程序员最直观的方式进行。

其实不仅仅是Model层,controller层的设计也极尽简化。我们也对过滤器(拦截器)做了重新实现,这不同于一般的如Struts2的实现。同时我们还提出了一个理念,在Controller层应该提供一个函数库,就像PHP那样。当然,我们现在只是提供一些比较实用的函数。但是以后会慢慢添加。

此外还有一些小特点,譬如

  • 一站式,不需要你整合各个框架
  • 随时clone随时使用,十分钟wiki之后便能着手开发。
  • 你不用考虑项目结构
  • 你不用考虑如何分层
  • 你不需要考虑配置文件。我们提供一个统一的配置对象供你使用
  • 我们尽量使用一些最佳实践来组织项目。比如使用IOC做基础。这意味着,你大部分类都会自动被容器所管理。

最后,欢迎Rails开发者回归Java。^-^

分享到:
评论
10 楼 allwefantasy 2012-09-25  
chinasofthz 写道

大牛哥,网上full-stack的资料很少啊,我就知道些ssh的小菜鸟。看到这个项目很不适应,jetty的服务开起来但是例子没运行成功过。。。我是在windows下在eclipse中建了个java工程,用junit运行TagControllerTest中的testsave()方法。在走到Map<String, Settings> groups = tuple.v1().getGroups(ServiceFramwork.mode.name() + ".datasources");v1()为空

测试需要全部运行。就你目前的情况。建议你删除数据库重新建表。然后用eclipse里的junit 运行DynamicSuiteRunner。  jetty 开起来后,你可以使用curl 进行测试,比如创建一个tag_group,你可以这样:

curl -XPOST 'http://127.0.0.1:9400/tag_group' -d 'name=java'
9 楼 chinasofthz 2012-09-23  
char1st 写道
chinasofthz 写道
下了你的项目看了下 说的好像有view层 但是项目中没有,前台怎么传数据呢 是一个java工程?好像也不用发布到服务器什么的

你可以了解下full-stack这个概念。

大牛哥,网上full-stack的资料很少啊,我就知道些ssh的小菜鸟。看到这个项目很不适应,jetty的服务开起来但是例子没运行成功过。。。我是在windows下在eclipse中建了个java工程,用junit运行TagControllerTest中的testsave()方法。在走到Map<String, Settings> groups = tuple.v1().getGroups(ServiceFramwork.mode.name() + ".datasources");v1()为空
8 楼 char1st 2012-09-21  
chinasofthz 写道
下了你的项目看了下 说的好像有view层 但是项目中没有,前台怎么传数据呢 是一个java工程?好像也不用发布到服务器什么的

你可以了解下full-stack这个概念。
7 楼 chinasofthz 2012-09-21  
下了你的项目看了下 说的好像有view层 但是项目中没有,前台怎么传数据呢 是一个java工程?好像也不用发布到服务器什么的
6 楼 dingbuoyi 2012-08-20  
慢慢等这个框架完善。。。
5 楼 mistbow 2012-08-19  
可不可以建一个Q~Q~群 来一起学习学习这个框架呀:)
4 楼 char1st 2012-08-15  
allwefantasy 写道
char1st 写道
net.csdn.jpa.type.DBInfo 在mysql 获取的数据库表名和列名有大小写的问题的 ,导致用ctClass.getSimpleName()得到字符串和dbinfo中的表名和列名不一致 。

你应该是windows下的Mysql数据库 对吗? 那可能会遇到这个问题。

是的  ctClass.getSimpleName().toLowerCase() 就暂时不会有问题了。
3 楼 allwefantasy 2012-08-15  
char1st 写道
net.csdn.jpa.type.DBInfo 在mysql 获取的数据库表名和列名有大小写的问题的 ,导致用ctClass.getSimpleName()得到字符串和dbinfo中的表名和列名不一致 。

你应该是windows下的Mysql数据库 对吗? 那可能会遇到这个问题。
2 楼 allwefantasy 2012-08-15  
char1st 写道
net.csdn.jpa.type.DBInfo 在mysql 获取的数据库表名和列名有大小写的问题的 ,导致用ctClass.getSimpleName()得到字符串和dbinfo中的表名和列名不一致 。

allwefantasy@gmail.com 这是我的邮箱,能不能发一个你debug后的截图给我。另外说下你的mysql数据库版本.非常感谢您提出了问题。
1 楼 char1st 2012-08-15  
net.csdn.jpa.type.DBInfo 在mysql 获取的数据库表名和列名有大小写的问题的 ,导致用ctClass.getSimpleName()得到字符串和dbinfo中的表名和列名不一致 。

相关推荐

Global site tag (gtag.js) - Google Analytics