Scala Lift Frameworkの概要

はじめに


Liftは、Scala言語の機能を積極的に使用しているため、現時点ではほとんど知られていませんが、現時点で最も複雑で強力なWebフレームワークの1つと考えられています。 それを勉強するには、多くの努力をする必要があります。 しかし、それが価値があるのは、それが標準のMVCフレームワークとは大きく異なり、代替技術の知識があなたの視野を広げるからです。

この記事では、このフレームワークの主な機能について説明します。

最初に見る


おそらく最も重要な機能は、View Firstコンセプトです。 これは、ビュー(XMLテンプレート)がアプリケーションへのエントリポイントであることを意味します(コントローラがエントリポイントである従来の方法とは異なります)。 Scalaコードはビューに組み込まれていません(Liftでは-ページにロジックを書くことはできません)が、テンプレートから呼び出されます。 View Firstコンセプトのおかげで、各要素(フォーム、検索フィールド、チャット、何かのリストなど)は、別のスニペットで他の要素から完全に分離できます。 これにより、コンポーネントの接続性が大幅に低下し、サイトの他の部分でコンポーネントを簡単に再利用できます。

これは、フォームのロジックを担当するスニペットがどのように見えるかです:

class Snippet = { def form_elements = { var textValue: String = "" var selectValue: String = "" def process() { println(textValue) println(selectValue) } // SHtml.onSubmit -      ,        .         - . "#textField" #> SHtml.onSubmit(value => textValue = value) & "#selectField" #> SHtml.onSubmit(value => selectValue = value) & "#hidden" #> SHtml.onSubmitUnit(process) // hidden      process() } } 


そしてテンプレート:

 <form lift="Snippet.form_elements"> <input id="textField" type="text"/> <select id="selectField"> <option></option> <option></option> <option></option> </select> <input id="hidden" type="hidden"> <input type="submit"/> </form> 


セレクター


また、サーバー変数とViewを「リンク」する方法についても少し説明したいと思います。 このために、セレクターメカニズムが使用されます。これは、実際のCSSセレクターに非常によく似ています。 次に例を示します。
id =“ elemid”の要素を見つけ、その属性“ class”を設定します

 def snippet = "#elemid [class]" #> "someclass" 


&メソッドを使用すると、複数のセレクターを組み合わせることができます

 def snippet = { "button [onclick]" #> Alert("some reaction") & "button [class]" #> "someclass" } 


セレクターが変更するXMLをメソッドに渡すには、lift属性を対応するタグに追加する必要があります(他にも方法がありますが、私はこれが最も好きです)。これは、このXMLを処理するスニペットを示します。

 <div lift="Snippet_class.snippet"> <button>  </button> </div> 


私の意見では、これは論理と表現をリンクする理想的な簡潔な方法です。 ビューはまったく触れません(リフトタグのみが追加されます)。スニペットのロジックは非常に簡単に読み取れます。 設計者はリフトタグに触れるだけで済みます。

構成


すべての構成はScalaで行われます。 つまり、柔軟な構成を作成するために、コードの40%をXMLファイルに実装する必要はありません。 これは、構成のどこかで無効なパラメーターを指定した場合、コンパイラーがプロンプトを出すことも意味します。 プロジェクトの構成が大きくて長い場合、これは非常に便利です。

安全性


OWASPによると、エレベーターは多くの一般的な脆弱性に対する保護を保証します。 おもしろいことは、このために何もする必要はなく、Liftでコードを書くだけです。 Rasmus Lerdorf(Yahooのセキュリティ担当者)がFourSquare(Liftで完全に記述されたプロジェクト)について次のように述べています。

「@foursquareへの4つの星-しばらくして最初のサイトをよく見てきましたが、セキュリティの問題は1つもありませんでした」


twitter.com/rasmus/status/5929904263

つまり、開発者はセキュリティについて心配する必要がなく、ビジネスロジックに完全に集中できます。

Ajaxサポート


通常のajaxボタンを実装する方法は次のとおりです。

 class Snippet { def button = { def process() = { println("      "); Alert(" ,      ") } "button [onclick]" #> SHtml.ajaxInvoke(process) } } 


そしてxmlテンプレート:

 <button lift="Snippet.button">  -   </button> 


ボタンがクリックされると、サーバーに対してajax呼び出しが行われ、サーバー上でプロセス関数が呼び出され、javaScriptの反応が返されます。 最小コード、最大ロジック。 この原則は、フレームワーク全体で追跡できます。

彗星のサポート


Liftは非常に優れたCometサポートを備えており、これがフレームワークの実質的な誇りです。 以下は、10秒ごとにサーバーから更新される時計の簡単な例です。
 object Tick class Clock extends CometActor { Schedule.schedule(this, Tick, 10 seconds) def render = "#time *" #> now.toString override def lowPriority = { case Tick => val js = SetHtml("time", Text(now.toString)) partialUpdate(js) //  js-    Schedule.schedule(this, Tick, 10 seconds) //   } } 

模様
 <div lift="comet?type=Clock"> <span id="time"></span> </div> 

彗星の優れたサポートのおかげで、遅延ロードなどの複雑なものは非常に簡単に実装されます。 必要なコンテンツで、組み込みスニペットLazyLoadを呼び出す必要があります。 同時に、コンテンツを作成するスニペットで何も変更する必要はありません。
 <div lift="LazyLoad"> <div lift="Snippet.lazy_content"> -  ,     </div> </div> 

スニペット:
 def lazy_content = { Thread.sleep(3000) //    "div *" #> "   3    " } 


コンパクトさ


Liftで記述する場合、Javaフレームワークで記述する場合よりも2〜3倍少ないコードを記述します(たとえば、あるプロガーがプロジェクトをPlayからLiftに書き直し、実装では24k行、Lift 6k リンクで書き直しました) 。 また、Spring MVC / Strutsなどのフレームワークと比較すると、違いはさらに大きくなります。 さらに、すべてのコードは静的に型付けされます。

おわりに


機能のごく一部しか説明していません。 ある記事では、このような大規模なフレームワークのすべての側面を明らかにすることは不可能です。 より深く掘り下げたい人のために、ここにリンクがあります:
liftweb.net-メインサイト
www.assembla.com/wiki/show/liftweb-wiki
exploring.liftweb.net/onepage-フレームワークの作者が書いた本

Source: https://habr.com/ru/post/J152067/


All Articles