Java/Framework & Libs

[thymeleaf] dialect 정의하기

허니몬 2016. 6. 10. 18:22

타임리프의 확장은 쉽다. 방언(다이얼렉트,Dialect)를 생성하고 템플릿엔진에 추가하면 된다.

Dialect

타임리프 다이얼렉트는 템플릿에서 사용할 수 있는 기능이다.

다음과 같이 동작하는 다이얼렉트를 작성해보자.

<p hello:sayto="Jake">Hi ya!</p>

모든 다이얼렉트 는 IDialect 를 구현해야한다. 이를 용이하게 할 수 있도록AbstractDialect 을 이용한다. IProcessorDialect 는 실제로 Dialect 가

HelloDialect
public class HelloDialect extends AbstractDialect implements IProcessorDialect {
    public static final String PREFIX = "hello";
    public static final int PRECEDENCE = 501;
 
    public TimezoneDateDialect() {
        super("hello-dialect");
    }
 
    @Override
    public String getPrefix() {
        return PREFIX;
    }
 
    @Override
    public int getDialectProcessorPrecedence() {
        return PRECEDENCE;
    }
 
    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        Set<IProcessor> iProcessors = Sets.newHashSet()
        iProcessors.add(new SayToProcessor(dialectPrefix)); (1)
        return iProcessors;
    }
}
뭔가~ 다른 것들을 추가할 수 있을 것 같지 않은가??

그럼 이제 이 다이얼렉트가 호출하여 실체 로직처리를 수행할 프로세스를 작성해보자.

SayToProcessor
public class SayToProcessor extends AbstractStandardExpressionAttributeTagProcessor {
 
    public static final String ATTR_NAME = "sayTo";
    public static final int PRECEDENCE = 1501;
 
    public SayToProcessor(String dialectPrefix) {
        super(TemplateMode.HTML, dialectPrefix, ATTR_NAMEPRECEDENCEtrue);
    }
 
    @Override
    protected void doProcess(ITemplateContext contextIProcessableElementTag tagAttributeName attributeNameString attributeValueObject expressionResultIElementTagStructureHandler structureHandler) {
        //TODO 비즈니스로직처리!! 
        structureHandler.setBody("Hello, " + expressionResult, false);
    }
}

작성한 다이얼렉트 를 템플릿엔진에 추가하자.

@Bean
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());
    engine.setMessageSource(messageSource);
    engine.addDialect(new HelloDialect());
    return engine;
}

을 구현하고 나면!! 끝이 난다. 실제로 화면을 불러와 보면

<p>HelloJake!</p>

으로 출력되는 것을 볼 수 있을 것이다.