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的细节回头再来看,我们先关注一下怎么样使用这些类(因为这个好像简单些
)
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
至于里面究竟是如何转换的,我就暂时不关心了
分享到:
相关推荐
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf
Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...
人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能...
CCNA学习笔记 CCNA学习笔记 CCNA学习笔记
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
nginx学习笔记(软件+学习笔记) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! nginx学习笔记(软件+学习笔记) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! nginx学习笔记(软件+学习笔记) ...
PHP个人学习笔记
2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip...
docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,...
Deeplearning深度学习笔记v5.53 吴恩达机器学习笔记更新--在这 5 堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,并用在包括吴 恩达本人在内的多位业界顶尖专家指导下创建自己的机器学习项目。...
Contiki学习笔记:进程、事件、etimer关系 Contiki 实例: Contiki学习笔记:创建两个交互进程 Contiki 主函数剖析: Contiki学习笔记:main函数剖析 Contiki学习笔记:启动一个进程process_start Contiki学习笔记...
ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1