
Rife2 เป็นกรอบการทำงานแบบเต็มรูปแบบไม่มีการประกาศกรอบการทำงานเพื่อสร้างเว็บแอปพลิเคชันด้วย Java ที่ทันสมัยอย่างรวดเร็วและง่ายดาย
Rife2 ถูกสร้างขึ้นบนพื้นฐานของกรอบ Rife ดั้งเดิมที่ได้รับความนิยมตั้งแต่ปี 2545-2553 ตั้งแต่นั้นมาโลกและชวามีการเปลี่ยนแปลงและ APIs Rife ดั้งเดิมจำนวนมากในที่สุดก็สามารถถูกแทนที่ด้วย Java บริสุทธิ์, No-XML, No-Yaml, ออกจากรหัสการแสดงออกที่ปลอดภัยเท่านั้น
Rife2 รักษาคุณสมบัติดั้งเดิมส่วนใหญ่และเพิ่มคุณสมบัติใหม่สำหรับเศษส่วนของรอยเท้าและด้วยการผลิตที่ดียิ่งขึ้นกว่าเดิม Rife2 ถูกสร้างขึ้นโดย Geert Bevin หนึ่งในแชมป์ Java คนแรกและวิทยากรในการประชุม Java หลายครั้ง
เคล็ดลับ: หากคุณใช้ Intellij Idea เป็น IDE ของคุณให้พิจารณาการติดตั้งปลั๊กอิน Rife2 Idea
มันจะช่วยยกระดับประสบการณ์การเข้ารหัสของคุณอย่างมาก
นี่คือการสอนอย่างรวดเร็วเอกสารฉบับเต็มมีข้อมูลเพิ่มเติมมากมาย
Rife2 Javadocs เสริมเอกสารด้วยรายละเอียดเพิ่มเติมมากมาย
คำถามที่พบบ่อยคือ: "ทำไมต้องเลือก Rife2 เหนือเฟรมเวิร์กยอดนิยมอื่น ๆ "
คำตอบสั้น ๆ คือ Rife2 แตกต่างกัน มันถูกออกแบบมาเพื่อสร้างเว็บแอปพลิเคชันอย่างรวดเร็วด้วยทีมเล็ก ๆ มันมีความท้าทายและจะท้าทายสถานะที่ไม่ได้อยู่เสมอ มันไม่ได้หมายถึงการแทนที่เฟรมเวิร์กระดับองค์กรเช่น Spring หรือ JEE แม้ว่าฉันจะใช้มันสำหรับแอปพลิเคชันระดับองค์กร Rife2 ใช้ประโยชน์จากพลังของแพลตฟอร์ม Java สำหรับเว็บแอปพลิเคชันที่คุณมักจะเขียนด้วยภาษาสคริปต์ ผลผลิตและการบำรุงรักษาเป็นกุญแจสำคัญและคุณจะพบว่าคุณได้รับ 90% ของงานที่ทำมา 10% ของความพยายามและยังสามารถรวมเข้ากับห้องสมุด Java และเฟรมเวิร์กอื่น ๆ ที่คุณต้องการ
Rife2 มีคุณสมบัติที่หลังจาก 20 ปียังไม่พบที่อื่น:
ความต่อเนื่องของเว็บ, เอ็นจิ้นเทมเพลตแบบสองทิศทาง, ระบบเมตาดาต้าที่เน้นถั่ว, เต็มรูปแบบโดยไม่ต้องพึ่งพาผู้สร้าง SQL ที่ขับเคลื่อนด้วยข้อมูลเมตา, กรอบการจัดการเนื้อหา, การสนับสนุนการแปลเต็มรูปแบบ
คุณสมบัติเหล่านี้ส่วนใหญ่มีการทดสอบเวลาและหลังจาก 20 ปียังคงพิสูจน์ได้ว่าเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการพัฒนาเว็บแอปพลิเคชัน Rife2 ได้เรียนรู้จากประสบการณ์มานานหลายทศวรรษและปรับปรุงคุณสมบัติดั้งเดิมเหล่านี้ในหลาย ๆ ด้าน
Rife2 ยังมีคุณสมบัติที่ผู้อื่นนำมาใช้ แต่มักจะขาดความสะดวกสบายของการรวมเข้าด้วยกันอย่างแน่นหนาตลอดทั้งกองเต็ม
ตัวอย่างเช่น: การทดสอบนอกคอนท์เนอร์สามารถวิเคราะห์โครงสร้างของเทมเพลตที่เกิดขึ้นโดยไม่ต้องแยก 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 หมุนเซิร์ฟเวอร์ Jetty แบบฝังตัวในตัวเพื่อให้คุณสามารถเริ่มการเข้ารหัสได้ทันที คลาส 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 เป็นตัวอักษรข้อความโดยไม่มีสิ่งใดรับประกันได้ว่าพวกเขายังคงถูกต้องเมื่อเส้นทางของคุณเปลี่ยนไปหรือเมื่อคุณปรับใช้แอปพลิเคชันของคุณในบริบทของแอปพลิเคชันเว็บที่แตกต่างกัน API การกำหนดเส้นทางของ 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 ());
}
}แรงผลักดันหลักที่ทำให้ฉันสร้าง Rife2 คือเอ็นจิ้นเทมเพลตที่เป็นเอกลักษณ์ของ 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 ภายในโดยการสร้างไบต์ที่ดีที่สุด
สิ่งนี้เกิดขึ้นทันทีระหว่างการพัฒนา สำหรับการผลิตเทมเพลตสามารถคอมไพล์ล่วงหน้าทำให้พวกเขาเร็วอย่างไม่น่าเชื่อ
ลองเปลี่ยนตัวอย่างเพิ่มเติมและสร้างเส้นทางเดียวที่สามารถตอบสนองต่อการร้องขอทั้ง 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 ที่ซ่อนอยู่สำหรับพารามิเตอร์แทนพารามิเตอร์สตริงแบบสอบถาม
คุณจะเห็นว่าเทมเพลตมีชิ้นส่วนทั้งหมดเพื่อสร้างทั้งสองหน้า:
contentformtextใน 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
อ่านเพิ่มเติมในเอกสารฉบับเต็มและ Rife2 Javadocs