电梯框架网页中的简单数据库查询

时间:2011-12-09 22:37:48

标签: lift

我开始使用Lift并阅读了一些在线提供的教程和书籍。来自JSP(或GWT)背景,这是一个巨大的飞跃,特别是因为我还在学习Scala。

无论如何......我通过从他们的网站下载电梯tar.gz的东西创建了基本网站,复制了lift_blank“目录并将其重命名为”test“。整个”sbt update~prayty-run“东西等等。

我想要做的是修改“index.html”页面,只需输入一个文本字段,然后按一下“搜索”按钮。基本思路,你输入你的名字,点击“搜索”,执行数据库查询,找到名字为“你输入的文本字段”的记录,然后结果被格式化并显示在网页;页面刷新后,文本字段也需要包含输入的名称。您键入不同的名称,点击“搜索”,页面上会显示新的结果。最初(第一次访问该页面),结果当然是空的。简单的东西......

然而,我所见过的例子都使用html表单和POST backs等;我真的不喜欢这个,例如用户在刷新页面时会感到慌乱并且他们得到一个firefox弹出窗口“为了显示这个页面,Iceweasel必须发送信息,这些信息将重复之前执行的任何操作(例如搜索或订单确认)。 “...页面也刷新了,这是我想避免的。

以前当我在JSP中构建它时,我会使用所有的javascript;没有“形式”标签或任何东西,只是一个带有javascript事件的简单字段,用于点击输入或点击“按钮”...事件被引导到主要的javascript函数“onQuery”,然后创建一个AJAX请求;当结果从服务器返回时,javascript会通过更改“innerHTML”值来修改包装器“div”元素。这里的好处是页面不刷新,只是它的一小部分,“表“(实际上是一个div)保存结果。

我如何在Lift中重新创建一个非常相似的东西?我有点迷失在这里。我在过去的几天里跟随了几个例子,但他们都使用了POST /表格。我可以处理scala数据库查询,我理解Lift的模板是如何工作的,它只是我可以使用几个指针的片段/彗星的东西。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用SHtml.ajaxText函数获取输入并使用服务器端的Wiring来处理请求并自动更改结果。

但是,使用此解决方案,您不再需要提交按钮,但由于您不需要表单,因此它不应该太重要。

以下是我对HTML文件的看法:

<div id="myHtml" class="lift:surround?with=default;at=content">
    <form class="lift:form.ajax">
        <input class="lift:SearchForm.name"/>
    </form>
    Value searched : <span class="lift:SearchForm.display">
</div>

现在在服务器端,它有点复杂

class SearchForm{
  val name = SHtml.ajaxText("", s=>{ SearchWiring.name.set(s); Noop})

  def display = {
     WiringUI.apply(SearchWiring.name)(name:String => {"*" #> name} )
  }
}

object SearchWiring{
    val name = ValueCell("All")
}

我不知道这是否完全严格,但我最好的想法是你的问题。您可以在the official liftweb demoSeven Things blog上找到有关接线的更多详细信息。我希望它会有所帮助!

答案 1 :(得分:0)

以下是我最终使用的内容。我不喜欢Lift的一件事是需要在各个点插入的所有“魔法”。我可以理解大部分内容,但整个“++隐藏”的东西可以使用一些解释......

“index.html”页面,包括“body”标签在内的所有内容:

<body class="lift:content_id=main">
    <div id="main" class="lift:surround?with=default;at=page">
            <lift:Search.search>
                    Search Query: <query:text/>&nbsp;<query:button/><br/>
                    <div id="results">
                    </div>
            </lift:Search.search>
    </div>
</body>

“Snippet”代码,在一个名为“Search.scala”的类中(某些import语句未使用,是尝试不同方法的剩余结果):

package code
package snippet

import scala.xml.{NodeSeq, Text}
import net.liftweb.util._
import net.liftweb.common._
import java.util.Date
import code.lib._
import Helpers._
import common.Main
import common.solr.{Hitlist, Solr}
import net.liftweb.http.{S, StatefulSnippet, SHtml}
import net.liftweb.http.js.JsCmds.SetHtml

import _root_.net.liftweb.http.SHtml._
import _root_.net.liftweb.util.Log
import net.liftweb.http.js.JsCmd
import net.liftweb.http.js.JE.JsRaw

object Search {
    def search(xhtml:NodeSeq):NodeSeq = {
        var queryText = "(initial)"

        def runQuery() = {
            println("\n\nQuery: " + queryText)
            SetHtml("results", <span>Query: {queryText}</span>)
        }//runQuery

        ajaxForm(
            bind("query", xhtml,
                "text" -> text(queryText, queryText = _),
                "button" -> submit("Post", runQuery)
            ) ++ hidden(runQuery _)
        )
    }//search
}//Search