Rocker는 Java 8+ 최적화 된 제로 카피 렌더링 근처의 빠른 템플릿 엔진으로, 나머지 프로젝트와 함께 컴파일되는 정적으로 입력 한 일반 Java 객체 템플릿을 생성합니다. 더 이상 생산에서의 "워밍업"시간, 느린 반사 기반 논리 또는 개발 중에 잡힌 불쾌한 놀라움이 없습니다.
논리, 반복 및 값에 대한 표준 Java 표현식으로 직관적이고 태그가없는 구문을 사용하여 템플릿을 작성하십시오. 로커 스페셜을 사용 하시겠습니까 ?
NULL-SAFE 평가를위한 존재 연산자. 모든 무거운 리프팅은 개발 중 Rocker Parser에 의해 수행되므로 런타임 종속성을 소수의 클래스로 유지합니다. 로커는 템플릿을 구문 분석하고 잘 문서화 된 Java 소스 파일을 생성합니다 (따라서 작동 방식을 쉽게 검사하고 이해할 수 있습니다).
다음 기능이 포함되어 있습니다.
?
존재 연산자는 널 값의 단순화 된 처리를 위해 구문을 확장합니다.Fizzed, Inc.의 프로젝트 (트위터에 따르면 : @fizzed_inc)
OpenSource 프로젝트를 개발하고 유지하려면 상당한 시간이 필요합니다. 이 프로젝트가 유용하거나 상업적 지원이 필요하다면 채팅을하고 싶습니다. [email protected]으로 이메일을 보내주세요
프로젝트 스폰서는 다음과 같은 혜택이 포함될 수 있습니다.
다음 템플릿 벤치 마크를 기반으로 Rocker는 명확한 승자입니다. ~ 프리 마커보다 ~ 250% 더 빠릅니다.
대부분의 템플릿은 웹 사이트에 사용되므로 렌더링 프로세스 중에 로커 템플릿이 작동하는 방법을 보여주는 빠른 샘플이 있습니다. 공통 헤더와 바닥 글을 포함하는 템플릿뿐만 아니라 신체 함량을위한 자리 표시자를 만듭니다. 템플릿 src/main/java/views/main.rocker.html
만듭니다
@args (String title, RockerBody content)
< html >
< head >
< title > @title </ title >
</ head >
< body >
@content
</ body >
</ html >
실제로 사용자에게 표시 할 템플릿은 공통/헤더 바닥 글의 맥락에서 콘텐츠를 렌더링합니다. Java 용어로는 다른 템플릿 내에서 실행되는 렌더링 코드 블록을 전달합니다. 템플릿 src/main/java/views/index.rocker.html
만듭니다
@args (String message)
@views.main.template("Home") - > {
< h1 > Hello @message! </ h1 >
}
이봐, RockerBody content
논쟁은 어떻습니까? 우리는 구문 readme에서 더 자세하게 다루지 만, 지금은 그것의 유일한 특수한 유형의 인수라는 것을 이해하고 템플릿이 "본문"을 기대할 것을 기대한다는 것을 로커에게 지시합니다.
Rocker Parser는 각 템플릿에 대한 Java 소스 파일을 생성합니다. target/generated-sources/rocker/views/main.java
및 target/generated-sources/rocker/views/index.java
입니다. 응용 프로그램에서 인덱스 템플릿을 그렇게 렌더링 할 수 있습니다.
static public void main ( String [] args ) {
String output = views . index . template ( "World" )
. render ()
. toString ();
}
출력은 다음과 같습니다.
< html >
< head >
< title > Home </ title >
</ head >
< body >
< h1 > Hello World! </ h1 >
</ body >
</ html >
Java 소스를 생성하고 코드 내부를 엿볼 때는 이것이 어떻게 작동하는지 보는 것이 간단합니다. views.index 클래스는 views.main 템플릿 인스턴스를 생성하고 렌더링을 제공하는 동시에 view.main이 @content
변수를 호출 할 때 렌더링 할 수 있도록 자체 블록을 전달합니다. 구문은 Java 8에서 Lambda가 정의되는 방법과 동일합니다 (Java 8 용 Lambdas 및 Java 6/7 용 익명 내부 클래스). 로커는 다른 템플릿을 만드는 템플릿이 동일한 렌더링 컨텍스트 (출력 버퍼, 응용 프로그램 별 컨텍스트/암시 적 상태)를 공유하도록하기 위해 무대 뒤에서 여러 가지 작업을 수행합니다.
Rocker Syntax에서 포괄적 인 깊은 다이빙을 위해 syntax.md 파일을 확인하십시오.
Rocker는 원활하게 통합 된 프레임 워크 목록이 점점 커지고 있습니다. 추가 된 새 프레임 워크에 링크하려면 문제를 제출하거나 PR을 제출하십시오.
각 로커 템플릿의 정적 (일반 텍스트)은 (기본적으로) 내부적으로 대상 숯으로 변환 된 정적 바이트 어레이 (예 : UTF-8)로 저장됩니다. 템플릿이 렌더링되면 정적 바이트 어레이는 모든 요청에서 재사용됩니다. 로커는 재사용 된 바이트 어레이와 동적 컨텐츠의 복합재 (링크 된 목록)보기를 저장하는 최적화 된 출력 스트림으로 렌더링됩니다. 템플릿은 주로 새로운 메모리를 할당하고 해당 컨텐츠를 복사 한 다음 각 요청에 대해 대상 숯으로 변환하는 대신 계속해서 동일한 숯으로 렌더링되는 정적 컨텐츠로 구성되므로 Rocker는 단순히 포인터를 반복해서 사용합니다. 다시. 이 기술은 빠르고 메모리 효율적인 렌더링을 생성합니다.
9000 바이트의 일반 정적 텍스트와 1000 바이트의 동적 콘텐츠로 구성된 템플릿이 있다고 가정 해 봅시다. 이 최적화가 없으면 100000 요청을 서비스하려면 ~ 100MB의 메모리가 필요합니다 (100000 바이트 x 100000 요청). 이 최적화를 위해서는 100000 요청 (1000 바이트 x 100000 요청)을 서비스하려면 ~ 10MB의 메모리가 필요합니다. 메모리가 낮은 것 외에도 90MB의 메모리 카피와 90MB의 UTF-8 문자열-> 바이트 변환을 잘라냅니다. 매우 유용한 최적화.
모든 것은 프로젝트 컴파일러에서 다른 Java 소스 코드와 함께 컴파일됩니다. 템플릿의 동적 코드는 궁극적으로 표준 Java로 변환되어 컴파일됩니다. 반사가 사용되지 않았습니다.
버전 0.10.0은 개발 중 핫 재 장전 템플릿에 대한 지원을 도입했습니다. Hot Reloading을 사용하면 템플릿 소스 코드를 수정하고 저장하고 JVM을 다시 시작하지 않고 다음 요청에서 변경 사항을 활성화 할 수 있습니다. 로커는 유연성을 위해 두 가지 다른 핫 재 장전 맛을 제공합니다.
로커 템플릿의 주요 특징은 템플릿이 Java 컴파일러에 의해 사용, 인수, 논리 등을 컴파일 타임으로 확인한다는 것입니다.
버전 0.10.0에서 템플릿이 두 개의 기본 클래스를 생성하는 템플릿의 기본 구조가 수정되었습니다. 각 템플릿은 모델 클래스 (인터페이스)와 구현 클래스 (렌더러)를 생성합니다. 응용 프로그램은 모델과 직접 상호 작용하므로 Rocker는 구현 클래스를 동적으로 재 컴파일하고 다시로드 할 수 있습니다.
Flavor One의 주요 이점은 응용 프로그램 코드가 동일하게 유지되며 Java 컴파일러가 Compile Time을 확인하는 반면 템플릿 컨텐츠는 런타임에 자동으로 다시로드 될 수 있다는 것입니다. 실제로 템플릿 인수를 변경하는 경우에만 응용 프로그램을 다시 시작해야합니다.
완전 동적 템플릿의 편의성을 선호하는 경우 Flavor Two는 템플릿 모델 클래스 (인터페이스)와 구현 클래스 (렌더러)를 모두 핫 재 장전을 지원합니다. 애플리케이션은 컴파일 타임 점검과 소규모 성능 히트를 잃지 만 다시로드 할 수있는 모든 것의 편의를 얻을 수 있습니다. 응용 프로그램에서 템플릿을 사용하는 방식도 다릅니다.
import com . fizzed . rocker . Rocker
...
// dynamic interfaces, dynamic implementation
String rendered = Rocker . template ( "views/index.rocker.html" )
. bind ( "val" , "ValueA" )
. render ()
. toString ();
템플릿 경로 및 인수는 런타임 확인됩니다. 각 바인딩 가능한 값은 템플릿에서 선언 된 이름과 유형과 일치해야합니다.
바인딩 가능한 맵에 필요한 값보다 더 많은 값이 포함 된 값을 포함 할 수있는 경우 편안한 바인드를 사용할 수 있습니다. 속성이 필요한 목록에 추가 된 경우 편안한 대안은 렌더링에 실패하지 않습니다. 예를 들어:
@args (String name)
Hello ${name}!
편안한 모드로 다음과 같이 렌더링됩니다.
Map map = new HashMap ();
map . put ( "name" , "Joe" );
map . put ( "age" , 42 );
Rocker . template ( "views/hello.rocker.html" )
. relaxedBind ( map )
. render ();
// -> Hello Joe!
핫 재 장전 지원은 기본적으로 0.10.0 버전으로 생성 된 템플릿에 추가됩니다. 지원을 비활성화하려면 구성/시스템 속성 rocker.optimize
설정하십시오. 빌드 중에 TRUE를 최적화하십시오. 기본적으로 템플릿에 코드가 존재하므로 런타임에 켜면 켜질뿐입니다.
rocker-compiler
의존성을 빌드에 추가해야합니다. 이 의존성은 개발 중에만 존재해야하며 생산에서 제거 할 수 있습니다. Maven에서는 provided
범위에 종속성을 추가하고 싶을 것입니다.
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-compiler</ artifactId >
< version >2.1.0</ version >
< scope >provided</ scope >
</ dependency >
런타임에서 핫 재 장전을 활성화하십시오. 시스템 속성 또는 프로그래밍 방식으로 핫 재 장전을 활성화 할 수 있습니다. Maven의 시스템 속성으로 핫 재 장전을 활성화합니다.
mvn -Drocker.reloading=true ...rest of args...
또는 프로그래밍 방식으로 핫 재 장전을 활성화 할 수 있습니다.
import com . fizzed . rocker . runtime . RockerRuntime
...
RockerRuntime . getInstance (). setReloading ( true );
핫 재 장전이 작동하는 간단한 예제가 있습니다. 이 프로젝트는 Blaze를 사용하여 스크립트 작업을 돕습니다. 다음을 실행하십시오
java -jar blaze.jar hot_reload
브라우저를 http : // localhost : 8080으로 가리 킵니다
그런 다음 rocker-test-reload/src/test/java/views/index.rocker.html
수정하고 저장하고 브라우저를 새로 고침하십시오.
로커는 파서/생성기와 런타임의 두 가지 구성 요소로 구성됩니다. 프로젝트에서 Rocker를 사용하려면 응용 프로그램에 런타임 종속성을 추가 한 다음 빌드 도구에서 구문 분석 한 다음 첫 번째 템플릿을 생성하십시오.
로커는 Maven Central에 출판되었습니다. Maven의 의존성으로 추가하려면 :
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-runtime</ artifactId >
< version >2.1.0</ version >
</ dependency >
<!-- for hot-reloading support only during development -->
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-compiler</ artifactId >
< version >2.1.0</ version >
< scope >provided</ scope >
</ dependency >
Gradle의 종속성으로 추가하려면 :
repositories {
mavenCentral()
}
dependencies {
compile group : ' com.fizzed ' , name : ' rocker-runtime ' , version : ' 2.1.0 '
// add rocker-compiler dependency as needed
}
로커는 Maven과 Gradle을 지원합니다.
POM에 다음을 추가하십시오
< build >
< plugins >
< plugin >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-maven-plugin</ artifactId >
< version >2.1.0</ version >
< executions >
< execution >
< id >generate-rocker-templates</ id >
< phase >generate-sources</ phase >
< goals >
< goal >generate</ goal >
</ goals >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >
기본적으로 Rocker는 src/main/java
에서 .rocker.html
로 끝나는 템플릿 파일을 재귀 적으로 처리합니다. 템플릿이 저장된 디렉토리는 생성 된 Java 클래스가 배치 될 표준 Java 패키지가됩니다. 생성 된 Java 소스 파일은 target/generated-sources/rocker
에 저장됩니다. 플러그인은이 생성 된 디렉토리를 소스 루트에 추가해야합니다.
다음 속성이 지원됩니다.
templateDirectory
는 템플릿 파일을 찾거나 구문 분석 할 때 재귀 적으로 시작하는 기본 디렉토리입니다. Java package
템플릿이 생성 되어이 디렉토리를 기본으로 사용합니다. 따라서 ${templateDirectory}/views/mytemplate.rocker.html
있으면 Rocker는 ${outputDirectory}/views/mytemplate.java
생성합니다. 기본값은 ${project.build.sourceDirectory}
에 대해입니다.
outputDirectory
는 파서가 템플릿 소스를 생성 할 디렉토리입니다. 기본값으로 ${project.build.directory}/generated-sources/rocker
classDirectory
는 디렉토리입니다. Hot Reload 기능은 런타임에 클래스를 컴파일합니다. 기본값으로 ${project.build.outputDirectory}
failOnError
구문 분석/생성 오류가 Maven이 실패하는지 여부를 결정합니다. 기본값은 참으로.
skip
플러그인 실행을 건너 뛰어야하는지 결정합니다. 기본값으로 거짓.
touchFile
은 Java 소스를 성공적으로 생성 한 후 "터치"파일입니다. 다른 워크 플로우를 트리거하는 데 유용합니다. 많은 IDE는 명시 적으로 다시로드하라고 또는 Maven Pom.xml 파일이 변경되지 않는 한 코드 완료를 위해 생성 된 소스를 자동으로 다시로드하지 않습니다. 따라서이 값은 기본적으로 ${basedir}/pom.xml
로 설정됩니다. 일반적 으로이 기능을 유지하는 것은 무해합니다.
skipTouch
TouchFile을 비활성화합니다. 기본값으로 거짓.
addAsSources
컴파일 할 소스로서 Maven에 출력 디렉토리를 추가합니다. 기본값은 참으로.
addAsTestSources
컴파일 할 테스트 소스로서 Maven에 출력 디렉토리를 추가합니다. 기본값으로 거짓. 사실이라면, 이것은 AddAsSources 전에 평가되며 Maven에게 템플릿을 테스트 코드로 컴파일하도록 효과적으로 지시합니다.
다음 속성도 지원되지만이를 이해하는 것이 중요합니다.이를 이해하는 것이 중요합니다. 이는 기본적으로 파서에 대한 패스 스루를 무시하고 모두 로커의 기본값으로 기본값을받습니다.
javaVersion
은 템플릿 컴파일 및 런타임과 호환되는 Java 버전입니다. Maven을 실행하는 JVM의 Java 버전의 기본값 (예 : "1.8").
optimize
생성 된 템플릿에서 핫 재 장전 지원이 제거 될지 결정합니다. 기본적으로 거짓.
extendsClass
는 모든 템플릿 구현이 확장되어야하는 클래스입니다. 모든 템플릿이 확장하려는 응용 프로그램 별 중간 클래스에 유용합니다. 로커의 기본값에 대한 기본값.
extendsModelClass
는 모든 템플릿 모델이 확장되어야하는 클래스입니다. 모든 템플릿 모델을 확장하려는 응용 프로그램 별 중간 클래스에 유용합니다. 로커의 기본값에 대한 기본값.
plainTextStrategy
는 템플릿의 일부로 일반 텍스트를 포함시키는 데 사용되는 전략입니다. 기본값은 static_byte_arrays_via_unloaded_class이지만 graalvm 호환성이 필요한 경우 static_byte_arrays를 사용해보십시오.
discardLogicWhitespace
논리/제어 블록의 일부로 결정된 템플릿의 공백을 폐기 해야하는지 여부를 결정합니다. 렌더링 된 컨텐츠를보다 전문적으로 보이게하는 동시에 여전히 많은 포맷을 그대로 유지합니다. 로커의 기본값에 대한 기본값.
targetCharset
은 템플릿 출력의 대상 숯입니다. 로커의 기본값에 대한 기본값.
suffixRegex
는 구문 분석 할 템플릿을 찾는 데 사용하는 정규 표현식입니다. 로커의 기본값에 대한 기본값.
markAsGenerated
생성 된 클래스에 @generated 주석을 추가합니다. 보존은 클래스이므로 주석이 소스 코드가 아닌 클래스 파일에만 의존하는 도구로 주석을 사용할 수 있습니다. 로커의 기본값에 대한 기본값.
Gradle 플러그인에 기여한 @victory
및 @mnlipp
에게 감사드립니다. @etiennestuder
또한 고려해야 할 대체 Gradle 플러그인도 가지고있었습니다. Rocker의 Gradle 플러그인은 gradle.org에 게시됩니다. 빌드 스크립트에 다음을 추가하십시오.
plugins {
id " com.fizzed.rocker " version " 2.1.0 "
}
sourceSets {
main {
rocker {
srcDir( ' src/main/java ' )
}
}
}
rocker {
// (All settings are shown with their defaults)
//
// Skips building templates all together
skip false
// Base directory for generated java sources, actual target is sub directory
// with the name of the source set. The value is passed through project.file().
outputBaseDirectory = " $b uildDir /generated-src/rocker "
// Base directory for the directory where the hot reload feature
// will (re)compile classes to at runtime (and where `rocker-compiler.conf`
// is generated, which is used by RockerRuntime.getInstance().setReloading(true)).
// The actual target is a sub directory with the name of the source set.
// The value is passed through project.file().
classBaseDirectory = " $b uildDir /classes "
failOnError true
skipTouch true
// must not be empty when skipTouch is equal to false
touchFile " "
javaVersion ' 1.8 '
extendsClass null
extendsModelClass null
optimize null
discardLogicWhitespace null
targetCharset null
suffixRegex null
postProcessing null
markAsGenerated null
}
템플릿 구문은 아래에 자세히 설명되어 있지만 현재는 ${templateDirectory}/views/HelloWorld.rocker.html
로 새 파일을 만듭니다.
@*
Example of hello world
*@
@args (String message)
Hello @message!
프로젝트를 컴파일하고 템플릿 사용을 시작할 시간입니다. Java에서 그렇게 부를 수 있습니다.
static public void main ( String [] args ) {
String output = views . HelloWorld
. template ( "World" )
. render ()
. toString ();
}
로커는 템플릿을 바이트 어레이로 출력하기 위해 (기본적으로) 크게 최적화됩니다. 템플릿이 렌더링하는 기본 RockerOutput
유형은 com.fizzed.rocker.runtime.ArrayOfByteArraysOutput
입니다. 이것은 바이트 어레이 또는 비동기 IO에 대한 탁월한 선택입니다. 그러나 프레임 워크에는 문자열 (또는 기타 사용자 정의 출력)에 최적화 된 렌더링 기능이 있습니다.
스트링으로 효율적으로 렌더링하려면 :
import com . fizzed . rocker . runtime . StringBuilderOutput ;
static public void main ( String [] args ) {
StringBuilderOutput output = views . HelloWorld
. template ( "World" )
. render ( StringBuilderOutput . FACTORY );
String text = output . toString ();
}
출력 스트림으로 효율적으로 렌더링하기 위해 :
import com . fizzed . rocker . runtime . OutputStreamOutput ;
static public void main ( String [] args ) throws Exception {
final OutputStream os = new FileOutputStream ( new File ( "test" ));
OutputStreamOutput output = views . HelloWorld
. template ( "World" )
. render (( contentType , charsetName ) -> new OutputStreamOutput ( contentType , os , charsetName ));
}
렌더링 중 예외가있는 경우 출력 스트림에는 부분 템플릿이 렌더링됩니다 (예외 지점까지). 대부분의 경우 기본 com.fizzed.rocker.runtime.ArrayOfByteArraysOutput
로 렌더링하고 BYTE 배열 버퍼를 출력 스트림으로 직접 작성하는 것이 좋습니다.
로커의 수많은 데모가 실제로 있습니다. 구문 분석 템플릿에서 모델로, 비동기로 HTTP 서버에서 결과를 보냅니다. 이 프로젝트는 Blaze를 사용하여 스크립트 작업을 돕습니다. 전체 목록을 위해 다음을 실행하십시오.
java -jar blaze.jar -l
저작권 (C) 2015+ Fizzed, Inc.
이 작업은 Apache 라이센스, 버전 2.0에 따라 라이센스가 부여됩니다. 자세한 내용은 라이센스를 참조하십시오.