- Lift基础 ==============
本章讲简要Lift项目的目录结构和构建它所需要的一些基础配置
进入Lift
首先看看一个简单的Lift应用的目录结构:
.├── main│ ├── resources│ │ └── props│ ├── scala│ │ ├── bootstrap│ │ │ └── liftweb│ │ └── code│ │ ├── lib│ │ └── snippet│ └── webapp│ ├── images│ ├── templates-hidden│ └── WEB-INF
Lift处理请求的第一步的拦截HTTP,这由一个 net.liftweb.http.LiftFilter
来处理。只需要在 web.xml
的配置下就可以了。
在Lift中,程序是从 bootstrap.liftweb.Boot.boot()
开始启动的。而在 webapp/templates-hidden
目录下放置的是页面模板代码。
Boot类
启动Lift应用时,如果在接收请求处理前想做一些事情。比如建立站点菜单SiteMap, URI rewrite, 自定义分发(dispatch),classpath搜索等,Lift Servlet会先执行 bootstrap.liftweb.Boot
类中的 boot
方法。当然,也可以在 LiftFilter
的 bootstrap
启动参数中指定自己的 Boot
实例,如:
... filter setup here ... bootloader yangbajing.setup.MyBoot
需要注意的是 MyBoot
必须是 Bootable
的子类并实现其 boot
方法。该方法运行一次,要以把 其它类库的初始化调用放在此处。
Class查找
Boot类中将设置在何处查找View、Snippet及Comet。 LiftRules.addToPackages
方法将告诉Lift 在哪些包下查找指定类。若指定 yangbajing.learn
包,Lift将在 yangbajing.learn.snippet
中查找Snippet,在 yangbajing.learn.view
中查找Comet,在 yangbajing.learn.comet
中查找Comet。
Lift中的主要对象
这里先简要说说在Lift编程中经常使用的几个对象
- S对象
net.liftweb.http.S
对象表示当前请求的状态(Stateful),用于获取客户端的请求信息和发送给客 户端的响应信息。也用于通知、cookie管理、本地化/国际化和重定向。
- SHtml
net.liftweb.http.SHtml
对象的主要用途是定义生成HTML的函数,可用于生成表单(form)中的一般 元素,以及Ajax和JSON元素。
- LiftRules
net.liftweb.http.LiftRules
对象用于处理几乎所有的Lift全局配置。
渲染流程
Lift把HTTP请求转换到响应的的流程简单如下:
- 完成所有配置好的URI重写
- 执行符合匹配的自定义dispatch分发函数,分为有壮态和无状态的分发
- 完成Comet和Aajx请求的自动处理
- 守成SiteMap的安装和匹配。SiteMap不仅提供全站点的菜单,也提供安全控制。URI重写和其它自定义功能
- 定位用于请求的HTML模板,有3个机制:
- 检查
LiftRules.viewDispatch
RulesSeq
看是否有自定义的分发规则 - 如果没有匹配的
viewDispatch
,定位匹配的模板文件 - 如果没有定位到匹配的模板文件,尝试基于隐式分发定位一个View
- 检查
- 处理模板文件,包括插放其它模板文件,合并<head />内容,执行snippet方法
通知、警告和错误信息
给用户以反馈信息很重要,应用需要能够通知用户错误消息,警告用户潜在问题……当系统状态改变时通知客户。 Lift为这些消息处理提供了统一的模型,包括静态内容和Ajax、Comet调用。