
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中阅读更多内容。