простой запрос к базе данных в веб-странице платформы лифта - PullRequest
1 голос
/ 10 декабря 2011

Я начинаю с Lift и читаю несколько учебников и книг, которые доступны онлайн.Исходя из JSP (или GWT) фона, это огромный скачок, тем более что я все еще изучаю Scala.

В любом случае ... Я создал базовый сайт, загрузив материал lift tar.gzс их сайта, скопировал каталог lift_blank "и переименовал его в" test ". Сделал всю вещь" sbt update ~ jetty-run "и т. д. и т. д.

Что я хочу сделать, это изменить" index.html "«на странице просто есть текстовое поле для ввода и кнопка с надписью« поиск ». Основная идея: вы вводите свое имя, нажимаете« Поиск », выполняется запрос к базе данных для поиска записей с именем« что-вы-вошли в текстовое поле ", а затем результаты форматируются и отображаются на веб-странице; после обновления страницы текстовое поле должно также содержать введенное имя. Вы вводите другоеимя, нажмите «поиск», и новые результаты отображаются на странице. Первоначально (при первом посещении страницы) результаты, конечно, пустые. Простые вещи ...

Однако примеры, которые я имеювсе видятn использовать формы html и POST и т. д .;Мне это очень не нравится, например, пользователи теряют сознание при обновлении страницы и получают всплывающее окно Firefox "Чтобы отобразить эту страницу, Iceweasel должен отправить информацию, которая будет повторять любое действие (например, поиск или подтверждение заказа), которое было выполнено ранее.«... страница также обновлена, чего я хотел бы избежать.

Раньше, когда я собирал это в JSP, я использовал весь javascript;никаких тегов "form" или чего-либо еще, просто простое поле с событиями javascript для нажатия клавиши ввода или нажатия кнопки "..." события, которые направляются в основную функцию javascript "onQuery", которая затем создает запрос AJAX;когда результат возвращается с сервера, javascript изменяет элемент «div» обертки, изменяя значение «innerHTML» и т. д. Здесь приятно то, что страница не обновляется, а только в небольшом подразделе «table "(на самом деле div), который содержит результаты.

Как бы я воссоздал очень похожую вещь в Lift?Я как бы потерялся здесь.В последние несколько дней я следовал нескольким примерам, но все они снова используют POST / формы.Я могу обрабатывать запросы к базе данных Scala и понимаю, как работают шаблоны Lift, это просто фрагмент кода / кометы, на котором я мог бы использовать несколько указателей.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Вы можете попытаться использовать функцию 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")
}

Не знаюзнаю, если это абсолютно строго, но это моя лучшая мысль для вашей проблемы.Более подробную информацию о проводке вы найдете в официальной демонстрации и блоге *1013* Seven Things .Я надеюсь, что это поможет!

0 голосов
/ 13 декабря 2011

Ниже приведено то, что я в итоге использовал.Одна вещь, которая мне не нравится в 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» (некоторые операторы импорта не используются, оставшийся результат попыток применения различных подходов):

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
...