본문 바로가기
Struts

Struts2 FreemarkerManager를 이용한 공통 변수

by 수앙 2011. 8. 26.

Struts2 에서 freemarker 를 쓸 경우

Java 클래스변수처럼 공통 변수를 사용할 때가 있다.

보통 Spring 에 xxx.xml 에 공통 변수를 정의하고 클래스에서 DI 로 호출하여

Java 와 Freemarker 에서 사용한다.


예)

1. xxx.xml

<bean id="consts" class="Consts">

    <property name="consts">

        <map>

            <entry key="A" value="A">

        </map>

    </property>

</bean>

 

2. Consts.java

private Map<String, String> consts;


public void setConsts(Map<String, String> consts) {

    this.consts = consts;

}


public Map<String, String> getConsts() {

    return this.consts;

}


public String getConst(String key) {

    return this.consts.get(key);

}

 

3. consts.ftl

${consts.getConst('A')}

 

하지만 이 방식말고 좀 더 간단한 방법을 소개하고자 한다.


@Inject

Struts2 에선 struts.xml 에서 <action> 태그의 <result type="freemarker">를 이용하여 Freemarker 를 사용한다.

이는 Struts2 내부에서 FreemarkerResult 클래스를 호출하여 뷰를 만드는데

FreemarkerResult 내에서 FreemarkerManager 클래스를 호출하여 Freemarker 에서 사용될 환경정보 등 여러 정보를

셋팅한다(처음 호출할 때 딱 한번 호출되어 그 이후 호출은 생성된 정보를 가지고 수행).


하지만 Struts2 에선 공통 변수를 선언하는 부분이 따로 설정파일로 제공하지 않는 걸로 보인다.

그래서 Struts2 Action 클래스에서 주입형식으로 FreemarkerManager 클래스를 호출하여 설정파일을 코딩해주면 된다.


예)

public class TestAction extends ActionSupport implements Preparable {

    private FreemarkerManager freemarkerManager;


    @Inject

    public void setFreemarkerManager(FreemarkerManager freemarkerManager) {

        this.freemarkerManager = freemarkerManager;

    }


    public void prepare() throws Exception {

        // 클라이언트에서 여러번 호출해도 처음 한번만 호출

        if (freemarkerManager.getConfig() == null) {

            Configuration config = freemarkerManager.getConfiguration(ServletActionContext.getServletContext());

            SimpleHash hash = new SimpleHash();

            hash.putAll(consts.getConsts());

            //hash.putAll(Map map); // 이렇게 추가 가능

            config.setAllSharedVariables(hash);

        }

    }

}


consts.ftl 파일에서

${A}

이런식으로 바로 쓸 수 있다.


끝.

댓글