2014-09-16 4 views
1

ST4 템플릿 안에 실행 가능한 자바 코드를 삽입 할 수 있습니까? 예를 들어 문자열을 그대로 내 템플릿에 전달하려고 할 때 가끔씩 문자열을 그대로 출력하고 때로는 대문자로 인쇄하기 때문에 필요한 변환을 수행하는 Java 코드가 필요합니다. 이 기능이 없으면 같은 기능을 수행하는 3 가지 방법이 있습니다 :템플릿 안에 자바 코드를 삽입하십시오.

(1) java에서 대체 값을 미리 계산하여 한 번에 모두 템플릿에 전달합니다 (그러나 너무 많은 인수가 발생할 수 있음) :

// in the below code, if the template can compute DESCRIPTION_CAPS from DESCRIPTION, using embedded java code, that reduces one argument 
test(DESCRIPTION, DESCRIPTION_CAPS) ::= << 
this is original <DESCRIPTION> 
this is caps <DESCRIPTION_CAPS> 
>> 

(2) 너무 많은 그런 논쟁이 될 경우, 다른 옵션은 작은 부분에 temlpate을 파괴하는 것입니다,하지만 그 추한 읽을 코드합니다 :

test1(DESCRIPTION) ::= << 
this is original <DESCRIPTION> 
>> 

test2(DESCRIPTION_CAPS) ::= << 
this is caps <DESCRIPTION_CAPS> 
>> 

(3) 클래스 내의 모든 관련 값을 미리 계산하고 템플릿에서 get ter 함수 (인수없이)를 사용하여 클래스에서 관련 값을 가져옵니다.

test() ::= << 
this is original <values.description> 
this is caps <values.description_caps> 
>> 

지금부터 (포함 자바 클래스를 사용할 수없는 경우) 세 번째 옵션이 최상의 솔루션으로 보입니다. 더 나은 해결책이 있는지 조언하십시오.

참고 : 위의 예에서 CAPS를 예로 들었으므로보다 복잡한 Java 함수도 필요할 수 있습니다.

답변

1

아니요, 템플릿에 삽입하는 자바 코드는 의도하지 않았으며 제공되지 않습니다. 따라서보기/모델/논리의 엉망/혼합을 쉽게 방지 할 수 있습니다.

귀하의 경우, 계산 된 것들을 Java Property getter 함수에 쉽게 넣을 수 있습니다.이 함수는 StringTemplate에 의해 bean 속성의 일종으로 참조되고 평가 될 수 있습니다.

자바 소스 코드에 넣어

myTemplate(f) ::= << 
... 
Blabla <f.message> blabla 
... 
>> 

가 :

class MyClass() { 
    ... 
    private String internal_message; 
    public getMessage() { 
    return internal_message; 
    } 
    ... 
} 

템플릿 호출 : 귀하의 템플릿 그룹 파일 MyTemplate.stg에서

넣고이와

STGroupFile stg = new STGroupFile("MyTemplate.stg"); 
ST templ = stg.getInstanceOf("myTemplate"); 
templ.add("f", new MyClass()); 

을 템플릿 로직 <f.message>은 java 객체 inst의 getMessage()을 호출합니다. ance f.

1

@Hartmut은 템플리트 안에 자바 코드를 임베드 할 수는 없지만 원하는 방식으로 문자열을 형식화하는 데 사용할 수있는 사용자 정의 StringRenderer을 작성할 수 있습니다.

당신은 다음과 같은 렌더러에 사용자 지정 형식 문자열을 전달할 수 :

test(description) ::= << 
    this is original <description> 
    this is caps <description; format="upper"> 
    this is custom format <description; format="my-format-string"> 
>> 

P.를당신은 당신이 자신의 롤하지 않아도됩니다 텍스트 사건을 변경에만 관심이 있다면 S, 그냥 사용 StringTemplate와 함께 제공되는 StringRenderer에 대한 참조를 추가 :

templateGroup.registerRenderer(String.class, new StringRenderer()); 

및 통과가 "낮은"위 " "또는"cap "을 형식 문자열로 사용

See my answer here for more info