
RIFE2 عبارة عن إطار عمل كامل ، لا ينفصل ، لإنشاء تطبيقات ويب بسرعة وبدون عناء مع Java الحديثة.
تم بناء RIFE2 على أسس إطار RIFE الأصلي الذي كان شائعًا في الفترة من 2002-2010. منذ ذلك الحين ، تغير العالم وجافا ، ويمكن أخيرًا استبدال العديد من واجهات برمجة التطبيقات الأصلية بالجافا النقي ، No-XML ، لا يامل ، مما يترك رمزًا صامتًا فقط من النوع.
يحافظ RIFE2 على معظم الميزات الأصلية ويضيف ميزات جديدة ، لجزء صغير من البصمة ومع إنتاجية مطور أكبر من ذي قبل. تم إنشاء RIFE2 بواسطة Geert Bevin ، أحد أبطال Java الأولى والمتحدثين في العديد من مؤتمرات Java.
نصيحة: إذا كنت تستخدم Idea intellij كـ IDE الخاص بك ، ففكر في تثبيت المكون الإضافي Idea Rife2.
سوف يعزز بشكل كبير تجربة الترميز الخاصة بك.
هذا برنامج تعليمي سريع ، يحتوي الوثائق الكاملة على مزيد من المعلومات.
يكمل Rife2 Javadocs الوثائق مع العديد من التفاصيل.
السؤال الذي يتم طرحه بشكل متكرر هو: "لماذا تختار RIFE2 على الأطر الشهيرة الأخرى"؟
الإجابة المختصرة هي أن RIFE2 مختلفة ، فهي مصممة لإنشاء تطبيقات الويب بسرعة مع فرق صغيرة. لقد تحدى ذلك وسيتحدى دائمًا حالة Quo. ليس المقصود استبدال الأطر على مستوى المؤسسة مثل Spring أو JEE ، على الرغم من أنني استخدمتها لتطبيقات المؤسسات. تقوم RIFE2 بتعزيز قوة منصة Java لتطبيقات الويب التي عادة ما تكتبها بلغات البرمجة النصية. تعد الإنتاجية والصيانة هي المفتاح ، وستجد أنك تحصل على 90 ٪ من العمل الذي تم إنجازه بنسبة 10 ٪ من الجهد ، ولا يزال بإمكانه الاندماج مع مكتبات Java الأخرى والأطر التي تحتاج إليها.
RIFE2 لديه ميزات أنه بعد 20 عامًا لا يمكن العثور عليها في مكان آخر:
استمرارية الويب ، محرك القالب ثنائي الاتجاه ، نظام بيانات التعريف المتمحورة حول الفاصوليا ، الكامل بدون تبعيات ، بناة SQL التي تعتمد على البيانات الوصفية ، إطار إدارة المحتوى ، دعم التوطين الكامل ، تجريد الموارد ، جدولة شبيهة بالتواصل ، ومحرك سير العمل القائم على التواصل.
لقد صمدت معظم هذه الميزات اختبار الوقت ، وبعد 20 عامًا ما زالت تثبت خيارات رائعة لتطوير تطبيقات الويب. لقد تعلم RIFE2 منذ عقود من الخبرة ويحسن هذه الميزات الأصلية بعدة طرق.
يحتوي RIFE2 أيضًا على ميزات تم تبنيها من قبل الآخرين ، ولكن عادةً ما تفتقر إلى راحة التكامل الضيق في جميع أنحاء الكامل.
على سبيل المثال: يمكن أن تحلل اختبارات خارجة عن الوصية بنية القوالب الناتجة دون الحاجة إلى تحليل HTML ، تم تصميم نظام المصادقة من جميع الأجزاء الأخرى من الكامل الكامل وتكاملها بسلاسة في تطبيق الويب الخاص بك ، يتم توليد عناوين URL من التكوين ، وتولد من التكوين ، وتوليد نصوص (json). HTML ، SVG ، SQL) ، ... وأكثر من ذلك بكثير.
RIFE2 هي الحبة الحمراء ، على استعداد لتظهر لك مدى عمق ثقب الأرنب ، إذا كنت على استعداد لذلك!
هذه هي الطريقة التي تبدأ بها موقع Hello World .
public class HelloWorld extends Site {
public void setup () {
get ( "/hello" , c -> c . print ( "Hello World" ));
}
public static void main ( String [] args ) {
new Server (). start ( new HelloWorld ());
}
} تدور الطريقة main لخادم رصيف مضمن المدمج ، بحيث يمكنك بدء الترميز على الفور. يمكن إضافة نفس فئة HelloWorld كقيمة معلمة إلى web.xml
يعد اختبار خارج الوسط مواطنًا من الدرجة الأولى في RIFE2 ، ويتفاعل مباشرة مع فئة Site لمحاكاة تفاعلات الاستجابة الكاملة للطلب ، دون الحاجة إلى تدوير حاوية servlet.
هذه هي الطريقة التي يمكنك بها اختبار المثال أعلاه مع Junit 5:
class HelloTest {
@ Test void verifyHelloWorld () {
var m = new MockConversation ( new HelloWorld ());
assertEquals ( "Hello World" , m . doRequest ( "/hello" ). getText ());
}
}أحد الجوانب الأكثر هشاشة لتطوير تطبيقات الويب هو كتابة الروابط وعنوان URL كحرفيات نصية ، دون أن يضمن أي شيء أنها تظل صحيحة عندما تتغير طرقك أو عند نشر تطبيقك في سياقات تطبيقات الويب المختلفة. تتيح واجهة برمجة تطبيقات RIFE2 التوجيهية إنشاء جميع روابط التطبيق الخاصة بك بشكل صحيح دون أي جهد نيابة عنك.
دعنا نضيف طريقًا جديدًا يحتوي على رابط HTML نحو مسار Hello World السابق.
يمكنك أن ترى أنه لا يجب إنشاء الطرق داخل طريقة setup() ، ولكن يمكن إنشاءها أيضًا كجزء من بناء Site ، مما يسمح بتخزين الطرق في الحقول.
public class HelloLink extends Site {
Route hello = get ( "/hello" , c -> c . print ( "Hello World" ));
Route link = get ( "/link" , c -> c . print ( "<a href='" + c . urlFor ( hello ) + "'>Hello</a>" ));
public static void main ( String [] args ) {
new Server (). start ( new HelloLink ());
}
}يمكننا الآن اختبار هذا على هذا النحو:
class HelloTest {
@ Test void verifyHelloLink () {
var m = new MockConversation ( new HelloLink ());
assertEquals ( "Hello World" , m . doRequest ( "/link" )
. getParsedHtml (). getLinkWithText ( "Hello" )
. follow (). getText ());
}
}كان الدافع الرئيسي الذي جعلني أقوم بإنشاء محرك القالب الفريد لـ Rife.
تحتوي قوالب RIFE2 على مفهومين رئيسيين:
سيؤلف رمز Java الخاص بك التخطيط النهائي عن طريق تعيين الكتل وإلحاقها ، ومن خلال وضع البيانات في القيم. دعنا نعيد كتابة مثال HelloLink أعلاه مع قالب.
في هذا المثال ، لا يتم معالجة قالب في Java حتى الآن.
بدلاً من ذلك ، يقدم علامة القيمة {{v route:hello/}} ، والتي سيتم استبدالها تلقائيًا بعنوان URL للمسار المتوفر باسم الحقل في Site النشط.
public class HelloTemplate extends Site {
Route hello = get ( "/hello" , c -> c . print ( "Hello World" ));
Route link = get ( "/link" , c -> c . print ( c . template ( "HelloTemplate" )));
public static void main ( String [] args ) {
new Server (). start ( new HelloTemplate ());
}
} مع HelloTemplate.html يجري:
<!DOCTYPE html >
< html lang =" en " >
< body >
< a href =" {{v route:hello/}} " > Hello </ a >
</ body >
</ html >لاحظ أن RIFE2 يقوم داخليًا بتحويل القوالب الخاصة بك إلى فئات Java عن طريق إنشاء رمز BYTECODE المحسّن.
هذا يحدث على نحو الطيران أثناء التطوير. بالنسبة للإنتاج ، يمكن أن تكون القوالب مبللة مسبقًا ، مما يجعلها سريعة بشكل لا يصدق.
دعنا نغير المثال أكثر وإنشاء مسار واحد يمكنه الاستجابة لكل من طلبات get و post .
get على نموذج مع زر واحد للنقر.post تقديم النموذج وعرض Hello World . public class HelloForm extends Site {
Route hello = route ( "/hello" , c -> {
var t = c . template ( "HelloForm" );
switch ( c . method ()) {
case GET -> t . setBlock ( "content" , "form" );
case POST -> t . setBlock ( "content" , "text" );
}
c . print ( t );
});
public static void main ( String [] args ) {
new Server (). start ( new HelloForm ());
}
} مع HelloForm.html يجري:
<!DOCTYPE html >
< html lang =" en " >
< body >
<!--v content/-->
<!--b form-->
< form action =" {{v route:action:hello/}} " method =" post " name =" hello " >
<!--v route:inputs:hello/-->
< input type =" submit " name =" Submit " >
</ form >
<!--/b-->
<!--b text--> < p id =" greeting " > Hello World </ p > <!--/b-->
</ body >
</ html >ملاحظة: تم تقسيم علامة
route:القيمة من ما سبق إلىroute:action:route:inputs:، توليد مدخلات نموذج HTML المخفية للمعلمات بدلاً من معلمات سلسلة الاستعلام.
يمكنك أن ترى أن القالب يحتوي على جميع القطع لإنشاء كلتا الصفحتين:
contentform المسمى الكتلةtextفي Java ، نقوم ببساطة بتعيين كتلة للقيمة ، اعتمادًا على ما نريد عرضه.
فائدة أخرى هي أن علامات قالب RIFE2 يمكن أن تكون تعليقات HTML ، مما يجعلها غير مرئية تمامًا. يتيح لك ذلك العمل على تصميم HTML الخاص بك كالمعتاد ومعاينة ملف القالب مع متصفح عادي.
أخيرًا ، دعونا ندرج اختبارًا لهذه الوظيفة:
class HelloTest {
@ Test void verifyHelloForm () {
var m = new MockConversation ( new HelloForm ());
var r = m . doRequest ( "/hello" ). getParsedHtml ()
. getFormWithName ( "hello" ). submit ();
assertEquals ( "Hello World" , r . getParsedHtml ()
. getDocument (). body ()
. getElementById ( "greeting" ). text ());
}
}شكرا للقراءة حتى النهاية!
كانت هذه مجرد مقدمة سريعة لإثارة شهيتك ، وتأتي RIFE2 مع دليل شامل وسهل القراءة مع العديد من الأمثلة والتفسيرات العملية.
إذا كانت لديك أي أسئلة أو اقتراحات أو أفكار أو تريد فقط الدردشة ، فلا تتردد في النشر في المنتديات أو الانضمام إلينا في Discord.
اقرأ المزيد في الوثائق الكاملة و javadocs reife2.