hellolift学习笔记(5)

6.view Blog的实现1--Mapper
很容易定位到com.hellolift.snippet.BlogUtil.viewblog方法,这个方法根据请求的参数id(用户id),在数据库中查找该用户的文章(Entry对象),如果找到,则通过comet显示博客列表,没找到则显示到所有用户文章列表的链接。

这里进行数据库操作时,使用的是liftweb所提供的Mapper框架(《The Definitive Guide To Lift》Ch.6)
为了使用Mapper框架,做了一下几件事情
i) 配置数据库链接,在Boot.scala中实现,现在知道这个工作就行了,暂时不深究

if (!DB.jndiJdbcConnAvailable_?) DB.defineConnectionManager(DefaultConnectionIdentifier, DBVendor)


ii)实现Mapper-Enabled的类,具体来说就是继承KeyedMapper,KeyedMetaMapper等,我们可以看到Entry和User 都继承者了这些trait。

Mapper-Enabled的细节回头再来看,我们先关注一下怎么样使用这些类(因为这个好像简单些 :wink: )
 val t = Entry.findAll(By(Entry.author, toLong(S.param("id"))),
OrderBy(Entry.id, Descending), MaxRows(20))

还是先来看语法
i. toLong(S.param("id"))
S.param 返回http请求中的参数值,返回值是 Box[String],当id参数不存在是,返回Empty
toLong 是net.liftweb.util.BasicTypesHelpers.toLong 方法这里用到的有两种情况

case Full(n) => toLong(n)
case None | Empty | Failure(_, _, _) => 0L


ii. findAll是定义在MetaMapper中的方法,定义如下
def findAll(by: QueryParam[A]*): List[A]

和定义Loc时的LocParam一样,这也是一个可重复的参数,所有参数均为QueryParam。看一下QueryParam(trait net.liftweb.mapper.QueryParam)的api可以看到以下子类Ignore, Distinct, ByList, Cmp, StartAt, MaxRows, OrderBy, BySql, PreCache, InRaw, OrderBySql, InThing。这些子类都可以作为查询的附加控制。我们能看到这里用到的OrderBy和MaxRows,但是没有By。
By(net.liftweb.mapper.By)是一个object,他的apply方法将返回Cmp对象,Cmp对象是QueryParam的一个子类。相似的,还有NotBy,By_>,By_<,ByList,NullRef,NotNullRef,Like 等等。
现在findAll的几个参数都已经明晰了,虽然api中的说明很简单,但是根据名称我们我们比较容易看懂这个查询的含义。

这行代码的执行结果t是一个List[Entry]


t match {
// If no 'id' was requested, then show a listing of all users.
case Nil =>
{
User.findAll().map(u => <span><a href={"/blog?id=" + u.id}>
{u.firstName + " " + u.lastName}</a>
<br /></span>)
}
case entries =>
.....
}

Nil是List的子类,含义是空的List(),在输入错误id或者id为空时,findAll返回的就是一个Nill,这时将重新查找所有User用户,显示用户列表的链接
User.findAll() 返回List[User]
map方法的结果返回一个List[Elem],并将作为viewblog方法的返回值。
且慢,根据viewblog方法的定义,返回值应该是NodeSeq,List[Elem]是怎样作为NodeSeq返回的呢?这里用到了scala的Implicit Conversions (《Programming In Scala》Ch.21 P465)
在NodeSeq中定义了转换方法
implicit def view(s : scala.Seq[scala.xml.Node]) : scala.xml.NodeSeq

至于里面究竟是如何转换的,我就暂时不关心了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值