我的应用程序最终通过Actors进行大量后台处理,特别是加载Mapper实例,然后对它们进行一些工作.这是非常重复的,我想在我的Actor代码中缓存一些这些查找.
我通常会使用ThreadLocal.但是,由于线程初始化是由Actor线程池处理的,所以它似乎是唯一一个初始化并随后清除ThreadLocal的地方是在actor的PartialFunction中接收传入的消息.
我现在正在做的是在我的Actor中创建另一个方法,如下所示:
override def aroundUpdates[T](fn: => T) : T = {
clientCache.init {
fn
}
}
Run Code Online (Sandbox Code Playgroud)
凡init方法处理以清除ThreadLocal的finally块.我不喜欢这种方法,因为aroundUpdates只存在于设置缓存的目的,它闻起来像代码味道.
有一个更好的方法吗?
我对Lift非常陌生,而我一直试图找到的一件事就是如何在一个片段的上下文中找到当前页面URL中的"#".因此,如果用户访问,http://www.example.com/some/path/page#stuff那么我想从中提取"东西".我一直在谷歌搜索和搜索API文档,还没有找到任何东西.
我想创建Web应用程序,同时学习一些很酷的新框架/技术.起初我在看Spring-Roo和Vaadin,但后来我认为使用纯java以外的东西会更有趣(也可能更有效).
到目前为止,我决定使用scala.但是必须说我真的很喜欢Vaadin的gui,如果可能的话我想用它.可能我可以使用纯vaadin + scala来构建一些简单的Web应用程序,但如果它有意义,那么我宁愿使用一些现有的框架来帮助我安全,强制执行适当的mvc或mvp等等.
使用Play是否有意义!还是以Vaadin为前端?或者别的什么?是否有任何教程或文档(我没有找到任何东西)?
或者也许我会更好地使用标准的Spring(Spring-Roo)和java?
我是一个Lift初学者,经常编写这样的代码:我使用Java方法返回一个对象或者null找不到值.所以我需要检查空值:
val value = javaobject.findThing(xyz)
if(value != null) {
value.doAnotherThing()
} else {
warn("Value not found.")
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Box概念更短地编写此代码吗?我已经阅读了有关Box概念的Lift-Wiki文档,但我不明白如何将它与Java null值一起使用.
在Lift中管理状态的一种典型方法是创建一个扩展SessionVar的单例对象,就像这个例子中的文档一样:
object MySnippetCompanion {
object mySessionVar extends SessionVar[String]("hello")
}
Run Code Online (Sandbox Code Playgroud)
使用SessionVars 的情况很清楚,我已经根据需要在实践中使用它们.我也大致了解它们是如何在里面工作的.
尽管如此,我还是不禁想知道为什么"会话变量"的机制与当前会话明显相关(通常只是系统中许多会话中的一个),设计为通过单例使用?这与我的直觉object相反,乍看之下我很想相信Lift能够以某种方式覆盖Scala的语言特征,并在常规Scala中创造出与众不同的东西.
即使我现在明白它是如何运作的,我也无法理解这种设计的理由,至少在我看来,这种设计打破了最不惊讶的规则.有人可以指出任何优势,或者解释为什么可以做出这样的设计决定?
我正在使用Scala Liftweb并拥有此模型对象:
object Product extends Product with LongKeyedMetaMapper[Product] {
override def dbTableName = "products"
override def dbIndexes = UniqueIndex(slug) :: super.dbIndexes
def menus = sitemap
lazy val sitemap: List[Menu] = List(editProductMenuLoc, listProductsMenuLoc, createProductMenuLoc, indexProductsMenuLoc).flatten(a => a)
protected def editProductMenuLoc =
Full(Menu(Loc("EditProduct" + menuNameSuffix, editPath, S.?("edit.product"))))
protected def listProductsMenuLoc = Full(Menu(Loc("ListProduct" + menuNameSuffix, listPath, S.?("list.products"))))
protected def indexProductsMenuLoc = Full(Menu(Loc("ListProduct" + menuNameSuffix, indexPath, S.?("index.products"))))
protected def createProductMenuLoc =
Full(Menu(Loc("CreateProduct" + menuNameSuffix, createPath, S.?("create.product"))))
protected val menuNameSuffix = ""
protected val editSuffix …Run Code Online (Sandbox Code Playgroud) 我想开始一个项目,我想为在我办公室工作的人们建立一个内部网网站和移动应用程序进行汽车共享.基本的想法是,如果有人有兴趣寻找拼车的人,应该在时间X发布从A到B的帖子.然后人们可以回复它.
我已经缩小了我对Scala + Lift + MongoDB或Node.JS + Redis/MongoDB + HTML5的选择范围.对于我提到的问题,我不知道哪一个更好或更差.同时考虑为同一个应用程序开发移动应用程序,人们可以通过手机发送拼车请求.寻找可以补充移动开发的堆栈.
我知道有各种各样的解决方案,但我希望学习一些新的和令人兴奋的东西,并在开发过程中获得乐趣.
我认为它将附带的代码编译成Javascript,但代码是如何编译而不是执行的?例如,Simply Lift的代码:
object AjaxExample {
def render = {
// state
var name = ""
var age = "0"
val whence = S.referer openOr "/"
?
// our process method returns a
// JsCmd which will be sent back to the browser
// as part of the response
def process(): JsCmd= {
?
// sleep for 400 millis to allow the user to
// see the spinning icon
Thread.sleep(400)
// do the matching
asInt(age) match {
// display …Run Code Online (Sandbox Code Playgroud)