أنيق...
Spiffy هو إطار ويب يستخدم Scala وAkka (تطبيق ممثل Scala) وJava Servicelet 3.0 API. إنه يستخدم الواجهة غير المتزامنة ويهدف إلى توفير بيئة متوازية وقابلة للتطوير على نطاق واسع لتطبيقات الويب. تعتمد جميع مكونات Spiffy المتنوعة على فكرة أنها تحتاج إلى أن تكون وحدات مستقلة صغيرة الحجم تقوم بكميات صغيرة من العمل بسرعة كبيرة وتسليم الطلب إلى المكون التالي في خط الأنابيب. بعد انتهاء المكون الأخير من معالجة الطلب، فإنه يرسل إشارة إلى حاوية servlet عن طريق "إكمال" الطلب وإرساله مرة أخرى إلى العميل.
إضافة بعض الطرق:
// 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()
اكتب وحدة التحكم:
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)
}
}
ثم قم بإنشاء بعض القوالب. يمكنك العثور على المزيد حول هذا المثال من خلال النظر إلى NewsController وSpiffyConfig
في الوقت الحالي، لاستخدام Spiffy، يجب عليك إنشاء الجرة (mvn jar:jar) وإضافتها إلى مسار فئة التطبيقات الخاصة بك. يجب عليك أيضًا تحديد متغير البيئة التالي (سيقوم context.xml بذلك):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
تحتاج إلى استبدال org.spiffy.config.SpiffyBuiltinConfig
بكائن يمتد org.spiffy.config.SpiffyConfig
ويوفر كافة القيم المطلوبة. ألق نظرة على SpiffyConfig على سبيل المثال.
يعتمد Spiffy على ممثلي Akka لتقسيم وعزل جميع مكوناته المختلفة. يتكون كل مكون في خط أنابيب Spiffy (باستثناء الفلتر الأولي) من مجموعة من ممثلي Akka. يتم دعم الممثلين الأنيقين من خلال مجموعات موازنة التحميل لأنواع مختلفة من المرسلين.
يتم تنفيذ Spiffy كمرشح بعد أن يتلقى المرشح الطلب، فإنه يضعه في الوضع غير المتزامن ويرسله إلى جهاز التوجيه. يقرر جهاز التوجيه بعد ذلك ما يجب فعله بالطلب من خلال فحص عنوان URL للطلب وتقييمه مقابل قائمة تعيينات وحدات التحكم المعروفة الخاصة به. التعيين هو تعبير عادي يطابق عنوان URL المطلوب ويعينه لوحدة التحكم المقابلة. إذا تم العثور على تطابق ناجح، فسيرسل جهاز التوجيه رسالة إلى وحدة التحكم تتضمن الطلب (وجميع الكائنات المطلوبة التي يجب إرسالها معه). عند هذه النقطة تكون مهمة جهاز التوجيه قد انتهت ويكون له الحرية في معالجة الطلبات الواردة الجديدة. بعد أن تتلقى وحدة التحكم الطلب، ستقوم بتنفيذ أي منطق تحتاجه على الطلب ويمكنها أن تقرر إنهاء الطلب أو تمريره إلى مكون آخر من Spiffy (عادةً معالج العرض).
يستخدم Spiffy مفهوم الخطافات لتنفيذ المنطق الذي يمكن تغليفه وتشغيله قبل وبعد مكونات معينة من خط أنابيب إطار العمل. يمكن تشغيل الخطافات قبل وبعد وحدات التحكم وطرق العرض. خطاف سيتم تشغيله قبل أن تقرر وحدة التحكم تجاوز وحدة التحكم تمامًا أو قد تؤدي ببساطة بعض المنطق مثل المصادقة أو تعديل الطلب نفسه قبل أن تتاح لوحدة التحكم فرصة العمل معه. يمكن للخطاف الذي يتم تشغيله بعد وحدة التحكم أيضًا إعادة توجيه الطلب إلى وحدة تحكم مختلفة أو تعديله أو إنهائه هناك ثم إرساله مرة أخرى إلى العميل. يتم استخدام نفس المنطق في طرق العرض الأمامية واللاحقة حيث يمكن للخطاف إيقاف العرض من العرض تمامًا أو قد يقوم بتمرير الإخراج المقدم إلى جزء آخر من إطار العمل الذي يمكنه القيام بعمل إضافي على الإخراج المقدم.