
Rife2는 현대식 Java와 함께 웹 애플리케이션을 빠르고 쉽게 만들기위한 풀 스택, 디크라레이션, 프레임 워크입니다.
Rife2는 2002-2010 년부터 인기있는 원래 Rife 프레임 워크의 기초를 기반으로합니다. 그 이후로, 세계와 Java는 바뀌었고 많은 원래의 Rife API는 마침내 순수한 Java, No-XML, No-YAML로 대체되어 유형-안전 표현 코드 만 남겨 둘 수 있습니다.
Rife2는 대부분의 원래 기능을 보존하고 발자국의 일부를 위해 새로운 기능을 추가하고 이전보다 개발자 생산성이 훨씬 높습니다. Rife2는 많은 Java 회의에서 최초의 Java 챔피언이자 스피커 중 하나 인 Geert Bevin에 의해 만들어졌습니다.
팁 : INTELDIJ 아이디어를 IDE로 사용하는 경우 Rife2 아이디어 플러그인 설치를 고려하십시오.
코딩 경험을 크게 향상시킬 것입니다.
이것은 빠른 튜토리얼이며 전체 문서에는 더 많은 정보가 포함되어 있습니다.
Rife2 Javadocs는 자세한 내용으로 문서를 보완합니다.
자주 묻는 질문은 "다른 인기있는 프레임 워크보다 Rife2를 선택하는 이유"입니다.
짧은 대답은 Rife2가 다르다는 것입니다. 소규모 팀과 함께 웹 애플리케이션을 신속하게 만들도록 설계되었습니다. 그것은 도전을 받았으며 항상 상태에 도전 할 것입니다. Spring 또는 JEE와 같은 엔터프라이즈 수준의 프레임 워크를 대체하는 것은 아니지만 엔터프라이즈 애플리케이션에 사용했습니다. Rife2는 일반적으로 스크립팅 언어로 작성하는 웹 애플리케이션을위한 Java 플랫폼의 힘을 활용합니다. 생산성과 유지 관리가 핵심이며, 노력의 10%에 대한 작업의 90%가 완료되며 필요한 경우 다른 Java 라이브러리 및 프레임 워크와 통합 할 수 있습니다.
Rife2는 20 년이 지난 후에도 여전히 다른 곳에서 찾을 수없는 기능이 있습니다.
웹 연속, 양방향 템플릿 엔진, Bean 중심 메타 데이터 시스템, 종속성없는 풀 스택, 메타 데이터 중심의 SQL 빌더, 컨텐츠 관리 프레임 워크, 전체 현지화 지원, 리소스 추상화, 지속 된 CRON과 유사한 스케줄러, 연속 기반 워크 플로 엔진.
이러한 기능의 대부분은 시간의 테스트를 견뎌냈으며 20 년이 지난 후에도 여전히 웹 애플리케이션 개발을위한 훌륭한 선택이라는 것이 입증되었습니다. Rife2는 수십 년의 경험을 통해 이러한 독창적 인 기능을 여러 가지 방법으로 향상 시켰습니다.
Rife2에는 또한 다른 사람들이 채택한 기능이 있지만 일반적으로 풀 스택 전체에 걸쳐 긴밀한 통합의 편의성이 부족한 기능이 있습니다.
예를 들어 : 외부 컨테이너 테스트는 HTML을 구문 분석하지 않고도 결과 템플릿의 구조를 분석 할 수 있으며, 인증 시스템은 전체 스택의 다른 모든 부분에서 구축되며 웹 응용 프로그램에 원활하게 통합되며, URL은 안내가 될 위험없이 생성 된 구성에서 생성됩니다. 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 클래스와 직접 상호 작용하여 서블릿 컨테이너를 회전시키지 않고도 전체 요청-응답 상호 작용을 시뮬레이션합니다.
이것은 Junit 5로 위의 예를 테스트 할 수있는 방법입니다.
class HelloTest {
@ Test void verifyHelloWorld () {
var m = new MockConversation ( new HelloWorld ());
assertEquals ( "Hello World" , m . doRequest ( "/hello" ). getText ());
}
}웹 애플리케이션 개발의 가장 부서지기 쉬운 측면 중 하나는 링크와 URL을 텍스트 리터럴로 입력하는 것입니다. 경로가 변경 될 때 또는 다른 웹 응용 프로그램 컨텍스트에 응용 프로그램을 배포 할 때는 올바르게 유지되도록 보장하지 않고 텍스트 리터럴로 입력하는 것입니다. Rife2의 라우팅 API를 사용하면 모든 응용 프로그램 링크를 귀하를 대신하지 않고 올바르게 생성 할 수 있습니다.
이전 Hello World Route에 대한 HTML 링크가 포함 된 새로운 경로를 추가하겠습니다.
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 and 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는 많은 예와 실용적인 설명과 함께 포괄적이고 읽기 쉬운 매뉴얼과 함께 제공됩니다.
질문, 제안, 아이디어가 있거나 채팅을하고 싶다면 포럼에 게시하거나 Discord에 참여하십시오.
전체 문서 및 Rife2 Javadocs에서 자세한 내용을 읽으십시오.