spring에서 freemarker 사용해 보기..
그냥 간단하게 사용해 보았다..
(아놔 이거 하고 있을 때 아닌데..괜히 손 대었다가 ㅠㅠ)
프리마커는..음.. UI단의 프레임워크라고 하면 될까..?
일단, 시작 해보자..
기본적인 spring의 설정은 되어있다고 가정하고..
[servletname]-serviet.xml은 action-config.xml로 설정한다.
우선은 라이브러리를 카피해야 하는데, freemarker.jar를 webapp lib에 넣는다.
spring 2.5.5를 받았다면 그 안에서 찾을 수 있다.
그리고, actions-config.xml을 설정한다.
(servletDispatcher가 바라보는 [servletname]-servlet.xml이랑 같은 녀석이다.. 이름만 다를뿐)
<!-- freemarker config -->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
<property name="defaultEncoding" value="UTF-8" />
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
</bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<!--
View resolvers can also be configured with ResourceBundles or XML
files. If you need different view resolving based on Locale, you have
to use the resource bundle resolver.
-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8" />
<property name="suffix" value=".ftl" />
<property name="exposeSpringMacroHelpers" value="true" />
</bean>
설정의 전부를 알지는 못하는데...
일단 , templateLoaderPath는 프리마커 템플릿 파일이 위치 할 곳을 지정한다고 보면 된다.
defaultEncoding 은 인코딩인데 resolver에도 인코딩 시켜주는 부분이 있다. 처음에는 resolver에서만 인코딩 설정을 해주었는데 계속 한글이 깨지길래 FreeMarkerConfigurer에도 설정 해주니 한글이 정상적으로 나왔다..
근데 뭔가 이상하긴 하다.. 저렇게 이중으로 설정하도록 만들어놨을까..? -_-ㅋ
그리고 freemarker.template.utility.XmlEscape 이게 무슨 역할을 하는건지는 아직 레퍼런스를 찾아보지는 못 했다....
일단,
<property name="defaultEncoding" value="UTF-8" />
요 두개만 설정해도 잘 돌아가긴 한다...
그리고 freemarker/welcome.ftl 파일을 만들어 놓는다.
그 다음 controller를 만들어보자.
@Controller
public class FreeMarkerTestController {
Log logger = LogFactory.getLog(FreeMarkerTestController.class);
@SuppressWarnings("unchecked")
@RequestMapping("/welcome.gs")
public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
HashMap map = new HashMap();
map.put("key1","value1");
map.put("key2", new Long(3L));
logger.debug("in cotroller...");
List list = new ArrayList();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
map.put("key3",list);
String requestString = "myString";
long requestLong = 5L;
request.setAttribute("requestString",requestString);
request.setAttribute("requestLong",requestLong);
return new ModelAndView("/welcome","welcomeMap",map);
}
몇가지 데이터 출력의 예를 살펴보기 위해 map과 list 그리고 request에 String과 long형을 담는다.
welcome.ftl을 만들어보자.
${welcomeMap.key1}
${welcomeMap.key2}
request에서 값 받기
requestString : ${Request.requestString}
requestLong : ${Request.requestLong}
맵에 있는 list의 값 꺼내기
welcomeMap.key3[0] : ${welcomeMap.key3[0]}
welcomeMap.key3[1] : ${welcomeMap.key3[1]}
welcomeMap.key3[2] : ${welcomeMap.key3[2]}
welcomeMap.key3[3] : ${welcomeMap.key3[3]}
list 루프 돌려보기
<#list welcomeMap.key3 as x3>
${x3}
<#if x3 = "list3"><#break></#if>
</#list>
이렇게 하고 해보면 값들이 나오게 된다..
간단한 설정으로 사용 할 수 있는데, 까옥과장님 말씀으로는 그냥 java , jsp 익숙한 사람이
혼자 개발 할 때는 jsp로 하는게 훨씬 빠르다고 한다. 이거는 그냥 jsp와 java를 모르는 사람도 간단한 reference만으로도 데이터 구조만 알면 프론트 작업에 투입이 가능하다는 점이 장점으로 작용 될 수 있다고 합니다.
그외에도.. mvc를 강제 시켜 버리는 효과도 있을 것 같습니다.
일단 해보는게 목적이어서.. 저런 자세한 설정들은 좀 더 찾아봐야겠습니다..
혹시 아시는 분은 덧글로 알려주세요~~~
아... 만약
resolver가 이미
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" p:cache="true" p:order="0" /-->
이런식으로 설정 되어 있다면 없애주셔야 제대로 ftl 파일을 찾아가더군요..
<참고: controller와 ftl의 소스 일부는 kkaok 님의 소스를 참고하였습니다.>