Keren...
Spiffy adalah kerangka web yang menggunakan Scala, Akka (implementasi aktor Scala), dan Java Servelet 3.0 API. Itu menggunakan antarmuka async dan bertujuan untuk menyediakan lingkungan paralel dan terukur secara besar-besaran untuk aplikasi web. Berbagai komponen Spiffy semuanya didasarkan pada gagasan bahwa mereka harus berupa modul minimalis independen yang melakukan sejumlah kecil pekerjaan dengan sangat cepat dan meneruskan permintaan ke komponen berikutnya dalam pipeline. Setelah komponen terakhir selesai memproses permintaan, ia memberi sinyal pada wadah servlet dengan "menyelesaikan" permintaan dan mengirimkannya kembali ke klien.
Tambahkan beberapa rute:
// index page, no code, just text
"""^/$""".r -> "Welcome to Spiffy!",
// main news page
new Regex("""^/(news)/$""") -> NewsController(),
// view some news by id
new Regex("""^/(news)/(view)/(d+)/$""") -> NewsController()
Tulis pengontrolnya:
def receive = {
// handles "news/add/"
case ControllerMsg(List("news", "save"), req, res, ctx) => {
// run validation on the request using Spiffy's validation DSL
var errors:Map[String, Set[String]] = validate (req) (
"email" as email confirmedBy "email_confirm",
"email_confirm" as email,
"title" as (string, 32),
"body" as string,
"tag" as string optional
) match {
case Some(List(errs,warns)) => { // Problem validating
errs
}
case None => None.toMap // passed validation
}
}
// handles "/news/"
case ControllerMsg(List("news"), req, res, ctx) => {
// load up news and stuff in map then render
val params = loadNews
view() ! ViewMsg("news", params, req, res, ctx)
}
// handles "/news/view/$newsId/"
case ControllerMsg(List("news", "view", newsId), req, res, ctx) => {
// usually you want to load the item, in this example we dont
// load item and set the params that the view will render
val news = loadNewsItem(newsId)
val params:Map[Any,Any] = Map("news" -> news)
// ask the view to render
view() ! ViewMsg("newsView", params, req, res, ctx)
}
}
Kemudian buat beberapa template. Anda dapat mengetahui lebih lanjut tentang contoh ini dengan melihat NewsController dan SpiffyConfig
Saat ini, untuk menggunakan Spiffy Anda harus membuat toples (mvn jar:jar) dan menambahkannya ke classpath aplikasi Anda. Anda juga harus mendefinisikan variabel lingkungan berikut (context.xml bisa digunakan):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
Anda perlu mengganti org.spiffy.config.SpiffyBuiltinConfig
dengan objek yang memperluas org.spiffy.config.SpiffyConfig
dan menyediakan semua nilai yang diperlukan. Lihatlah SpiffyConfig sebagai contoh.
Spiffy mengandalkan aktor Akka untuk memilah-milah dan mengisolasi semua komponennya. Setiap komponen dalam pipa Spiffy (kecuali filter awal) terdiri dari sekelompok aktor Akka. Aktor keren didukung oleh kumpulan penyeimbangan beban dari berbagai jenis operator.
Keren diimplementasikan sebagai filter Setelah filter menerima permintaan, filter menempatkannya dalam mode asynchronous dan mengirimkannya ke router. Router kemudian memutuskan apa yang harus dilakukan terhadap permintaan tersebut dengan memeriksa URL permintaan dan mengevaluasinya berdasarkan daftar pemetaan pengontrol yang diketahui. Pemetaan adalah ekspresi reguler yang cocok dengan URL yang diminta dan menetapkannya ke pengontrol yang sesuai. Jika kecocokan berhasil ditemukan, router akan mengirim pesan kepada pengontrol dengan permintaan tersebut (dan semua objek yang diperlukan yang perlu dikirim bersamanya). Pada titik ini, tugas router telah selesai dan bebas memproses permintaan baru yang masuk. Setelah pengontrol menerima permintaan, pengontrol akan menjalankan logika apa pun yang diperlukan pada permintaan tersebut dan dapat memutuskan untuk mengakhiri permintaan atau meneruskannya ke komponen Spiffy lainnya (biasanya pengendali tampilan).
Spiffy menggunakan konsep hooks untuk menjalankan logika yang dapat dienkapsulasi dan dijalankan sebelum dan sesudah komponen tertentu dari pipeline framework. Hooks dapat dijalankan sebelum dan sesudah pengontrol dan tampilan. Sebuah hook yang akan berjalan sebelum pengontrol dapat memutuskan untuk melewati pengontrol sama sekali atau mungkin hanya menjalankan beberapa logika seperti otentikasi atau memodifikasi permintaan itu sendiri sebelum pengontrol mempunyai kesempatan untuk bekerja dengannya. Hook yang berjalan setelah pengontrol juga dapat merutekan ulang permintaan ke pengontrol lain, memodifikasinya, atau menghentikannya di sana dan kemudian mengirimkannya kembali ke klien. Logika yang sama digunakan pada tampilan depan dan belakang di mana hook dapat menghentikan tampilan agar tidak dirender sama sekali atau mungkin meneruskan keluaran yang dirender ke bagian lain kerangka kerja yang dapat melakukan pekerjaan tambahan pada keluaran yang dirender.