사용자의 자바 객체를 데이터 모델로 사용할 때, 데이터 모델을 위한 메소드를 만들어 제공할 수도 있다. 예를 들어 템플릿을 작성할 때 데이터 모델에 'user_,method()'라는 메소드를 정의해 줄 수 있다. 'user_method()'는 템플릿에서 다음과 같이 사용할 수 있다.
${user_method(“abc”, x)}
이와 같은 사용자 정의 메소드는 TemplateMethodModelEx 인터페이스를 구현함으로써 제공할 수 있다. TemplateMethodModelEx 인터페이스는 다음과 같은 메소드를 가지고 있다.
Object exec(java.util.List arguments);
템플릿 언어에서 사용자 정의 메소드를 호출하면, 메소드 이름에 대응되는 TemplateMethodModelEx 구현체의 exec() 메소드가 수행된다. 이 때, 사용자 정의 메소드에 입력된 파라미터들이 java.util.List에 담겨서 exec() 메소드에 전달된다.
TemplateMethodModelEx 인터페이스를 구현한 사용자 정의 메소드를 살펴보자.
import java.util.List;
import freemarker.template.SimpleNumber;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
public class TestAdder implements TemplateMethodModelEx {
@Override
public Object exec(List arguments) throws TemplateModelException {
if (arguments == null)
throw new TemplateModelException();
int sum = 0;
for (Object elem : arguments) {
SimpleNumber number = (SimpleNumber)elem;
sum += number.getAsNumber().intValue();
}
return sum;
}
}
파라미터로 Number 타입을 입력받아서 모두 더한 값을 리턴해주는 메소드 타입이다. 이 클래스를 구현하여
root.put("adder", new TestAdder());
데이터 모델에서 루트의 자식으로 메소드 이름에 설정을 해주면 된다. 이 데이터 모델을 사용하는 템플릿에서 다음과 같이 위에서 구현한 사용자 정의 메소드를 호출 할 수 있다.
${adder(1,2,3)}
이외에 TempateDirectiveModel 인터페이스를 구현하여 사용자 정의 디렉티브를 만들어 제공할 수도 있다. 이 내용은 너무 깊게 들어가는 것 같으니 이 포스트에서 다루지는 않을 예정이고, 프리마커 메뉴얼의 가이드 문서를 참고하길 바란다.
댓글