Lift 中文社区诚招发稿人
三月 14, 2012 分类:Uncategorized
欢迎加入lift 中文社区, 由于我的学习和工作原因,现在希望找有Liftweb和scala经验的人一起写这个社区.有意者请发邮件到readmangroup@gmail.com
三月 14, 2012 分类:Uncategorized
欢迎加入lift 中文社区, 由于我的学习和工作原因,现在希望找有Liftweb和scala经验的人一起写这个社区.有意者请发邮件到readmangroup@gmail.com
十月 9, 2012 分类:Lift
先发code
package code.snippet
import net.liftweb.http._
import net.liftweb._
import common.Full
import util._
import net.liftweb.http.provider.servlet.HTTPServletContext
import code.model.resume
import java.io._
import net.liftweb.util._
import net.liftweb.common._
import java.util.Date
import code.model._
import code.lib.util._
class writingresume extends LiftScreen{
override protected def hasUploadField = true
val resumeupload = makeField[Array[Byte], Nothing]("Upload Resume: ", new Array[Byte](0),
field => SHtml.fileUpload(fph => storeFile(fph)),
NothingOtherValueInitializer)
var filename = ""
def storeFile (file : FileParamHolder): Box[File] =
{
getBaseApplicationPath match
{
case Full(appBasePath) =>
{
val d:Date = new Date()
filename = d.getTime+file.fileName
var uploadDir = new File(appBasePath + "uploads")
val uploadingFile = new File(uploadDir, filename)
var output = new FileOutputStream(uploadingFile)
try
{
output.write(file.file)
}
catch
{
case e => println(e)
}
finally
{
output.close
output = null
}
Full(uploadingFile)
}
case _ => Empty
}
}
def getBaseApplicationPath: Box[String] =
{
LiftRules.context match
{
case context: HTTPServletContext =>
{
var baseApp: String = context.ctx.getRealPath("/")
if(!baseApp.endsWith(File.separator))
baseApp = baseApp + File.separator
Full(baseApp)
}
case _ => Empty
}
}
}
九月 2, 2012 分类:Lift
Modal Dialog是现在比较常用的一种提示, 和输入信息的手段. 因为在同一页面上显示, 所以更加user-friendly.
Lift上的, 我们一般用Jquery UI的插件.blockui, 完成实现.
先用
<script id="jquery-blockui" src="/scripts/jquery.blockui.js" type="text/javascript" ></script>
在你想引用modal的页面.
然后在snippet中
try {Templates(List("templates-hidden", "post")).map(html => ModalDialog(html, JsObj(("top" -> Str("30%"))))).openOr(Alert("missing template"))} catch {case error: Exception => Alert("exception: "+error.getMessage)}
这个code打开了位于templates-hidden下的名为post.html的网页. 并且把他当做一个MOdalDialog来引用.
六月 10, 2012 分类:Lift
最近在Google group, 有人提问Lift 与 play! 2.0的选择,以及Stateless和Stateful的选择.我摘出来, 翻译, 供大家做备用.
From DPP:
以下是Play的优势
From Christopher Poile, 关于stateful 和 stateless:
如果你在Play lists中, 你会发现一些人, 他们会装作fanboy对任何一个framework. 他们会说Play 是一个stateless的架构,而且比stateful的架构更容易scale. 这是错误的.
据我所知, 所有的web app都是有state的, 那些极少的,严格的stateless, 我们叫它web serices. 如果你想建立一个web app(一个有用户状态和setting的网站), 它就一定有state. Play是 "stateless" 但是它把所有的session varibles都放入一个product叫 memcached. 或者 Hazelcast. 关键的是, 几乎每一个web app 都需要state. 当一个纯粹的framework 是stateless的时候, 你则需要一些插件,模拟它的state.
最后, 不要让stateful 和stateless的争论动摇. 几乎很少的网站需要考虑 "scaling". 即使你需要scale, 你不会比FourSquare的scale快吧?
五月 13, 2012 分类:Scala
今天写上一篇文章的时候,有人问我这个问题, 我当时就回答说, 请用buildr, 但是他执意觉得IDEA有此功能, 我就google了一下, 果然很复杂.
五月 13, 2012 分类:Lift
请在右边的我的github上下载这个例子, 然后跟着我下边的步骤来运行这个例子.
Sun May 13 18:29:31 [websvr] admin web console waiting for connections on port 28017
Sun May 13 18:29:31 [initandlisten] waiting for connections on port 27017
打开一个新的控制台来一起看看这个例子:
首先, 在project/build/LiftProject中, 添加
"net.liftweb" %% "lift-mongodb-record" % liftVersion
然后, 看scala/bootstrap.liftweb/Boot中:
MongoDB.defineDb(
DefaultMongoIdentifier,
MongoAddress(MongoHost(), "lift_app")
)
这句话是添加mongodb的设置进lift. lift_app是数据库的名字.
在code/lib里, 有一个trait, ProtoUser. 这是lift和mongodb的接口.
object firstName extends StringField(this, 32) {
override def displayName: String = ??("first.name")
}
这里的??方法, 是一个查询后边是否为字符串, 如果是的话就返回它, 不是的话,在resource/i18n下的liftapp_en_US.properties里编写错误.
剩下的就是一些对table的定义, 这里需要注意的是这个例子,定义了一个方法thePath, 他是用来建立一个list用来保持数据库格式的.
然后在code/model里的User实现了上边的trait.
这是一个html和scala混写的Object, 我个人觉得这里应该严格的执行html和scala code分离的机制, 估计是原作者为了省事,没有用comet写吧.