LiftWebで最もシンプルなWebアプリケーション

最近、あるトピックを読んで、プロセッサフ​​ラグの復号化を表示するユーティリティをインターネット上で少し検索しましたが、見つかりませんでした。 LiftWebを使用します



また、執筆プロセスを共有したいと思います。 内部に多くのテキストがあることをすぐに警告しますが、理論的な部分をスキップして練習に直接行くことができます。



そのため、次のものが必要です。



アプリケーションスケルトンを作成するには、mavenを使用します。

mvn archetype:generate -DarchetypeGroupId=net.liftweb -DarchetypeArtifactId=lift-archetype-blank_2.8.1 -DarchetypeVersion=2.2-RC6 -DarchetypeRepository=http://scala-tools.org/repo-snapshots -DremoteRepositories=http://scala-tools.org/repo-snapshots -DgroupId=app.example -DartifactId=cpuflags -Dpackage=app.example.cpuflags







そして、プロジェクトはすでに起動できます! mvn jetty:実行してローカルホストに移動:8080





はい、機能は十分ではありませんが、修正します。



しかし、最初は少し理論


プロジェクトは、通常のJ2EE Webアプリケーションです。 LiftFilterをロードすることだけを目的としたweb.xmlがあり、すべての魔法を実行します。



初期化時に、フィルターはフレームワークのセットアップを担当するbootstrap.liftweb.Boot.bootメソッドを呼び出します。 特に、どのパッケージでスニペットを検索するかについて説明します(それらについては後で詳しく説明します)。 また、この生成されたばかりのメソッドでメニューが作成されますが、メニューは必要ないため削除できます。



次に、リクエストのライフサイクルについて説明します。 URLにアクセスすると、フレームワークは適切なテンプレートを見つけてレンダリングし、ユーザーに結果を提供します。 テンプレートを見つけるためのルールはブート方法で変更できますが、これは別の記事のトピックです。 まず、テンプレートがwebappディレクトリに配置され、リクエストURLで1つずつマッピングされること、つまり、localhost:8080 / index.htmlがリクエストされると、index.htmlテンプレートがレンダリングされるなどの十分な知識があります。



各テンプレートはxmlファイルです。 プロジェクト用に生成されたindex.htmlは次のとおりです。

 <lift:surround with="default" at="content"> <h2>Welcome to your project!</h2> <p> <lift:helloWorld.howdy> <span>Welcome to cpuflags at <b:time/></span> </lift:helloWorld.howdy> </p> </lift:surround>
      
      





ここでは、LiftWebの最も重要な部分であるスニペットが使用されます。 スニペットは、入力としてhtmlを受け入れ、何らかの方法でそれを処理し、出力として発行するscalaメソッドです。



たとえば、lift:サラウンドスニペットは最も重要な機能を実行します:htmlテンプレートのマッピング。 この例では、次のことが起こります。

  1. templates-hiddenディレクトリで、default.htmlという名前のファイルが検索されます(名前はwith属性から取得され、さらにhtml拡張子が付けられます)

    ファイルは次のとおりです。

     <html xmlns="http://www.w3.org/1999/xhtml" xmlns:lift="http://liftweb.net/"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <title>app.example:cpuflags:1.0-SNAPSHOT</title> <script id="jquery" src="/classpath/jquery.js" type="text/javascript"></script> </head> <body> <lift:bind name="content" /> <lift:Menu.builder /> <lift:msgs/> </body> </html>
          
          



  2. このファイル内では、lift:bindノードが名前コンテンツで検索されます(名前はat属性から取得されます)
  3. lift:bindの内容は、テンプレートのlift:サラウンドの内容に置き換えられます


スニペットリフト:helloWorld.howdyは標準スニペットではなく、生成されたスニペットです。 LiftWebがスニペットリンクを検出し、それが標準スニペットではない場合、scalaコード内で検索が行われます。 このため、起動方法でapp.example.cpuflagsパッケージが指定されました。 この場合、app.example.cpuflags.HelloWorldクラスの新しいインスタンスが作成され、howdyメソッドが呼び出されます。



メソッドは次のとおりです。

  def howdy(in: NodeSeq): NodeSeq = Helpers.bind("b", in, "time" -> (new _root_.java.util.Date).toString)
      
      





ここではすべてが単純です。in(入力に来るhtml)内で、b:timeノード(テンプレートにあります)が検索され、現在の日付に置き換えられます。 結果はメソッドによって返されます。



十分な理論、練習を開始する時間


テンプレートを変更します。

 <lift:surround with="default" at="content"> <h2>Enter your CPU flags</h2> <form method="get"> <input type="text" name="flags"/> <input type="submit"/> </form> <table cellpadding="10"> <lift:CpuInfo.flags> <tr> <td><flag:name/></td> <td><flag:description/></td> </tr> </lift:CpuInfo.flags> </table> </lift:surround>
      
      





app.example.cpuflags.snippet.CpuInfo.scalaスニペットを作成します。

 package app.example.cpuflags.snippet import xml.NodeSeq import net.liftweb.util.BindHelpers._ import net.liftweb.http.{S} import java.util.Properties class CpuInfo { def flags(html: NodeSeq): NodeSeq = { val a1 = CpuFlags.getInfo(S.param("flags").openOr("")) a1.flatMap( p => bind("flag", html, "name" -> p._1, "description" -> p._2) ) } } object CpuFlags { val propertyMap = { val props = new Properties props.load(this.getClass.getClassLoader.getResourceAsStream("cpuflags.properties")) props } def getInfo(flags: String) = { val s = flags.trim.toUpperCase if (s.size>0) s.split(" +").toList.map( (flag) => (flag, if (propertyMap.getProperty(flag)!=null) propertyMap.getProperty(flag) else "UNKNOWN FLAG") ) else List() } }
      
      





cpuflags.properties ここからの情報を使用して作成しました 。 リストは完全ではありませんが、面倒であり、さらに検索することはできません。



それだけです、jettyを再起動します:実行して喜ぶ:





便利なリンク



All Articles