发布于 2014-09-12 23:51:38 | 180 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!


这是 form-binder 的第一版,不过已经相当完善,一般情况应该够用了。

测试覆盖率相当高,加上代码并不复杂,质量应该是有保障的。

有问题或建议请发 issue,我一般都会及时处理的。

=================================

 

form-binder 是一个容易使用和定制的微型数据绑定和校验框架。

它有如下特点:

  • 非常轻量,总共才 700 来行代码(框架 + 内置扩展)

  • 容易使用,使用过程没有冗余代码,所见及所得

  • 高度可定制,你可以扩展几乎每一个执行点

  • 容易扩展,每个扩展接口都只是一个 FunctionN 的别名

  • 不可变性,让你可以安全的共享/(嵌套)复用 mapping定义对象

 

form-binder 一开始是为我一个基于 Scalatra 的项目准备的,用起来会比 Scalatra 内置的 Command 框架方便不少。但是你可以把它用在其他地方,因为它不依赖 Scalatra 的代码(甚至都没有对 Scalatra 的集成做内置支持),非常容易和其他框架集成。

它单纯使用的示例代码是这样的:

import com.github.tminglei.bind.simple._

case class Order(name: String, email: String, price: Float, count: Int)

val binder = expandJsonData("json") pipe_: FormBinder(messages).withErr(errsToJson4s)
val mappings = tmapping(
  "id" -> long(),
  "json" -> mapping(
    "name"  -> text(maxlength(100)),
    "email" -> text(email()),
    "price" -> (cleanPrefix("$") pipe_: float()),
    "count" -> number().verifying(min(3))
  )(Order.apply).label("order")
).verifying { case ((id, order), messages) =>
    //do some extra verifying
    Nil
  }

///
val data = Map(
  "id" -> "133",
  "json" -> """{"name":"xxxx", "email":"123@example.com", "price":"$137.5", "count":5}"""
)
binder.bind(mappings, data) { case (id, order) =>
  //do something ...
}

和 Scalatra 的集成,我是这样做的:

// firstly, create your FormBindSupport.scala
import com.github.tminglei.bind.simple._

object MyFormBindSupport {
  val BindMessagesKey = "bind-messages"
}

trait MyFormBindSupport extends I18nSupport { this: ScalatraBase =>
  import MyFormBindSupport._

  before() {
    request(BindMessagesKey) = Messages(locale, bundlePath = "i18n/bind-messages")
  }

  def binder(implicit request: HttpServletRequest) =
    expandJsonData("json") pipe_: FormBinder(bindMessages.apply).withErr(errsToJson4s)

  ///
  private def bindMessages(implicit request: HttpServletRequest): Messages = if (request == null) {
    throw new ScalatraException("There needs to be a request in scope to call bindMessages")
  } else {
    request.get(BindMessagesKey).map(_.asInstanceOf[Messages]).orNull
  }
}

// then use it in your xxxxxxxxServlet.scala
import com.github.tminglei.bind.simple._

class FeatureServlet extends ScalatraServlet with MyFormBindSupport {

  get("/:id") {
    val mappings = tmapping(
      "id" -> long()
    )
    binder.bind(mappings, params) { case (id) =>
      repos.features.get(id)
    }
  }
}

更多细节请浏览项目主页。

 



相关阅读 :
form-binder v0.3.0 发布,微型数据绑定和校验框架
form-binder 0.8.0 发布,微型数据绑定和校验框架
form-binder-java v0.10.2 发布,微型数据绑定和校验框架
Form-binder v0.9.0 发布,微型数据绑定
Form-binder v0.8.1 发布,微型数据绑定框架
form-binder v0.10.1,微型数据绑定和校验框架
form-binder v0.10.0 发布,Scala 微型数据绑定和校验框架
form-binder-java v0.11.0 发布,Java 微型数据绑定和校验框架
form-binder-java v0.13.0 发布,Java 微型数据绑定和校验框架
Form-binder 0.6.0 发布,微型数据绑定和数据校验
form-binder v0.12.2 发布,Scala 微型数据绑定和校验框架
form-binder-java v0.10.0 发布,Java 微型数据绑定及校验框架
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务