ServcieFramework是一个敏捷、快速、富领域模型的Java MVC 框架,其设计理念是让用户真正能够用简单的方式解决80%的问题。

  该项目目前应用于作者公司内部的一个产品中,刚开源不久,便引起了开发者的广泛关注与讨论。为了使大家进一步了解该框架,我们专访了作者祝海林。

  先来个自我介绍吧!

  网名 WilliamZhu,微博@PrinceCharmingJ。Java程序员,4年开发经验,2010年懵懂来京。有过短暂几天Rails程序员生涯,颇为自豪。曾经为了创建一个音乐新模式的尝试而奋斗过,至今仍念念不忘。现专注于搜索和数据挖掘领域。平常的爱好是向大牛们提问、聆听、学习。

  ServcieFramework 是什么?

  ServcieFramework,一个敏捷、快速、其ORM 和 Controller等设计会 surprize 你的一个 Java MVC 框架,专为移动应用后端量身定做,适用于快速搭建一个后端服务(说的好像有点拗口,oh yeah~~~)

  ServcieFramework 三大亮点:

  ORM 实现真正的充血模型,非常 ActiveRecord 化。

  非常轻量,你完全看不到servlet api,因为压根没有使用Servlet规范。应用本身是一个普通的Java程序,http监听只是其中的一个模块。

  便于测试。模型类和controller都可以当作普通的类来进行测试。

  发起这个项目的初衷是什么?

  项目的起源是我们要用Java写一个后台服务,提供Web API,但觉的Spring太重,后来我们用nutz开发,但仍然觉得nutz有很多限制,比如,我们对response status比较重视。客户端会根据不同状态码进行不同处理,nutz显得支持有点弱了。后我跟老板说,给我机会,我可以写个更轻量,更 RESTFul的。于是便在老板的支持下有了ServcieFramework。目前该项目应用在我们的搜索产品中。

  开发效率比肩Rails,如何体现?是如何实现的?

  你可以 clone ServiceFramework一份下来试试。当然从文档也是能够直观看到的。待会我会举几个小例子。

  另外之前我也发过一篇关于ServiceFramewok的资讯,不愿意看文档的同学也可以看看这篇简短的资讯。

  为了充分说明开发的便捷性,我直接在这篇采访稿中做个例子。

  建立一张表:

  [sql] view plaincopy--标签表

  CREATE TABLE `tag` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(255) DEFAULT NULL,

  `tag_synonym_id` int(11) DEFAULT NULL,

  `weight` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  --标签组。一个标签可以属于多个标签组。一个标签组包含多个标签

  CREATE TABLE `tag_group` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `id` (`id`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  定义两个类:

  [java] view plaincopypublic class Tag extends Model {

  @Validate

  private final static Map $name = map(

  presence, map("message", "{}字段不能为空"),

  uniqueness, map("message", "{}字段不能重复")

  );

  @ManyToMany

  private List tag_groups = list();

  }

  public class TagGroup extends Model {

  @ManyToMany

  private List tags = list();

  }

  Ok了,模型类建立完毕。 写一个controller:

  [java] view plaincopypublic class TagController extends ApplicationController {

  @BeforeFilter

  private final static Map $check_params = map(only, list("save"));

  @At(path = "/blog", types = POST)

  public void save() {

  if(!Tag.save(params())){

  render(HTTP_400,tag.validateResults);

  }

  render(ok());

  }

  private void check_params(){

  if(isEmpty(param("tag")))render(HTTP_400,"您至少需要传递一个name字段");

  }

  }

  一个简单的例子做完了。查询方面提供了Arel的查询形式。比如:

  [java] view plaincopyList orders = Order.where("status=:status",map("status",Order.Status.NEW)).joins("details").fetch();

  ServiceFramewok实现重点有三个方面:

  简化ORM框架。在我看来,Rails 的ActiveRecord是ORM的佳实践。ServiceFramework的ORM基本是照着它改的。

  重新设计Controller中的 filter(interceptor)。各种before filter、around filter 可以有效简化逻辑应用。而框架本身则努力简化filter的使用。

  规范化项目目录。目前大部分新的框架都是这么做到的。一开始给你生成一个标准的项目目录结构。ServiceFramework则进一步简化了这个操作。

  顺带提一下目前类似Rails的Java框架可能会用到的一些技术:

  字节码增强。比如javassist、cglib等。代表有PlayFramework。

  AOP 通过对注解等的解析,生成相应的切面文件。不过这需要特定的编译器。代表有 Spring ROO。

  还有是通过IDE生成根据模板生成一些文件。这个可操作性不强。