
Rife2-это полная сбоя, без декларации, рамки для быстрого и без особых усилий для создания веб-приложений с современной Java.
Rife2 построен на основе оригинальной рамки Rife, которая была популярна с 2002-2010. С тех пор мир и Java изменились, и многие из оригинальных Rife API, наконец, могли быть заменены чистыми Java, NO-XML, без YAML, оставляя только экспрессивный код для защиты типа.
Rife2 сохраняет большинство оригинальных функций и добавляет новые, для доли следа и с еще большей производительностью разработчика, чем раньше. Rife2 создан Гиртом Бевином, одним из первых чемпионов Java и докладчика на многих конференциях Java.
Совет: если вы используете INTELLIJ IDEA в качестве IDE, рассмотрите возможность установки плагина Idea Rife2.
Это значительно улучшит ваш опыт кодирования.
Это быстрое руководство, полная документация содержит гораздо больше информации.
Rife2 Javadocs дополняет документацию еще много деталей.
Часто задаваемый вопрос: «Почему выбирают Rife2 по сравнению с другими популярными рамками»?
Короткий ответ заключается в том, что Rife2 отличается , он предназначен для быстрого создания веб -приложений с небольшими командами. Он бросил вызов и всегда будет оспаривать статус-кво. Он не предназначен для замены каркас на уровне предприятия, таких как Spring или JEE, хотя я использовал их для предприятий. Rife2 использует силу платформы Java для веб -приложений, которые вы обычно пишете с помощью языков сценариев. Производительность и обслуживание являются ключевыми, и вы обнаружите, что вы получите 90% работы, выполненную для 10% усилий, и все еще можете интегрироваться с другими библиотеками Java и рамками, где вам это нужно.
У Rife2 есть особенности, которые через 20 лет все еще нельзя найти в другом месте:
Веб-продолжения, двунаправленный шаблонный двигатель, система метаданных, ориентированные на бобов, полная стек без зависимостей, строители SQL, управляемые метадатами, структура управления контентом, поддержка полной локализации, абстракция ресурсов, сохраняемый Cron-подобный планировщик, двигатель рабочего потока на основе продолжений.
Большинство из этих функций выдержали испытание временем, и через 20 лет все еще оказывается отличным выбором для разработки веб -приложений. Rife2 узнал из десятилетий опыта и во многом улучшает эти оригинальные функции.
У Rife2 также есть особенности, которые были приняты другими, но обычно не хватает удобства жесткой интеграции на протяжении всего стека.
Например: тесты вне контейнера могут проанализировать структуру полученных шаблонов без необходимости проанализировать HTML, система аутентификации создается из всех других частей полного стека и плавно интегрируется в ваше веб-приложение, URL-адреса генерируются из созданной вами конфигурации без риска становления устаревшего, без логических шаблонов. 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 для моделирования полного взаимодействия с запросом и ответом, без необходимости вращения контейнера сервлета.
Вот как вы могли бы проверить пример выше с 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.
Вы можете видеть, что маршруты не должны быть созданы внутри метода 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.