
RIFE2是一個全堆棧,無陳述的框架,可快速而輕鬆地使用現代Java創建Web應用程序。
Rife2建立在2002 - 2010年最受歡迎的原始Rife框架的基礎上。從那時起,世界和爪哇發生了變化,許多原始的RIFE API最終可以用純Java,No-XML,No-Yaml代替,僅保留類型安全的表達代碼。
RIFE2保留了大多數原始功能並添加了新功能,比以前更大的佔地面積,並且具有更高的開發人員生產率。 Rife2是由Geert Bevin創建的,Geert Bevin是許多Java會議上的首批Java冠軍之一,也是演講者之一。
提示:如果您將Intellij Idea用作IDE,請考慮安裝RIFE2 Idea插件。
它將大大增強您的編碼體驗。
這是一個快速的教程,完整的文檔包含更多信息。
RIFE2 Javadocs用更多細節補充了該文檔。
一個常見的問題是:“為什麼選擇RIFE2而不是其他流行框架”?
簡短的答案是Rife2不同,旨在通過小型團隊快速創建Web應用程序。它已經挑戰,並將始終挑戰現狀。儘管我將其用於企業應用程序,但這並不是要替換諸如Spring或JEE之類的企業級框架。 RIFE2利用Java平台的功能來用於您通常使用腳本語言編寫的Web應用程序。生產力和可維護性是關鍵,您會發現您完成了90%的工作量工作的90%,並且仍然可以與其他需要的Java庫和框架集成。
Rife2具有20年後仍找不到其他地方的功能:
Web連續性,雙向模板引擎,以豆類為中心的元數據系統,無依賴關係的全堆棧,元數據驅動的SQL構建器,內容管理框架,完整的本地化支持,資源抽象,持續存在的CRON樣品調度程序,基於Continutions的工作流程。
這些功能大多數都經受了時間的考驗,在20年之後,仍然被證明是Web應用程序開發的絕佳選擇。 Rife2從數十年的經驗中學到了這些東西,並在許多方面都改進了這些原始功能。
Rife2還具有其他人採用的功能,但通常缺乏整個堆棧中緊密整合的便利性。
For instance: out-of-container tests can analyze the structure of the resulting templates without having to parse HTML, the authentication system is built from all the other pieces of the full-stack and seamlessly integrates into your web application, URLs are generated from the configuration you created without the risk of becoming stale, the logic-less templates are really purely content driven and can generate any text-based format (JSON, XML, 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中,絕對需要對開發和生產之間的代碼沒有更改。
Oncontainer測試是RIFE2中的一流公民,直接與您的Site類互動以模擬完整的請求響應交互,而不必旋轉servlet容器。
這就是您可以使用Junit 5:
class HelloTest {
@ Test void verifyHelloWorld () {
var m = new MockConversation ( new HelloWorld ());
assertEquals ( "Hello World" , m . doRequest ( "/hello" ). getText ());
}
}Web應用程序開發最脆弱的方面之一是將鏈接和URL鍵入文本文字,而沒有保證當您的路線更改或在不同的Web應用程序上下文中部署應用程序時它們保持正確。 RIFE2的路由API允許您無需您的任何努力就可以正確生成所有應用程序鏈接。
讓我們添加一條新路線,其中包含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/}}值標籤,該標籤將自動替換為活動Site中該字段名稱可用的路由的URL。
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形式的參數輸入,而不是查詢字符串參數。
您可以看到該模板包含所有零件以創建兩個頁面:
content的值form塊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帶有一本易於閱讀的手冊,其中包含許多示例和務實的解釋。
如果您有任何疑問,建議,想法或只是想聊天,請隨時在論壇上發布或加入我們的不和諧。
在完整文檔和Rife2 Javadocs中閱讀更多內容。