Lang/Freemarker

Jsp 에서 Freemarker 로 전환하기 [2] (문법)

호형 2022. 3. 17. 18:28

앞서 jsp to freemarker 전환에 대해 문법 외의 부분을 알아보았다. 

 

Jsp 에서 Freemarker 로 전환하기 (w. springboot & tiles) [1]

Jsp와 Freemarker는 모두 template engine이다. 둘의 가장 큰 차이라고 생각되는 부분은 JavaEE에 종속적이냐 그렇지 않느냐의 차이인것 같다. 그리고 spring 진영에서 정식으로 지원을 하느냐 아니냐도 분

oingdaddy.tistory.com

이번에는 문법적인 측면은 어떤 부분이 다른지 살펴보자. 


주석

jsp

<%--주석입니다--%>

freemarker

<#--주석입니다-->

tag library 선언

jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>

freemarker

<#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>
<#assign spring=JspTaglibs["http://www.springframework.org/tags"]>

jstl tag 같은 경우는 freemarker에 내장되어 있는 기능으로 사용하면 된다. tiles나 spring 같은 경우는 위와 같이 JspTaglibs라는것을 사용해서 선언할 수 있다. 


page include

jsp

<%@ include file="/WEB-INF/jsp/include/pageImport.jsp"%>

freemarker

<#include "/WEB-INF/freemarker/include/pageImport.ftl">

contextPath 가져오기

jsp

<c:set var="contextPath" value="${pageContext.request.contextPath}" />

freemarker

<#assign contextPath='${rc.contextPath}'>

contextPath를 가지고 오기 위해서는 jsp에서는 pageContext라는것을 썼다. 하지만 freemarker에서는 이와 같은 기능이 지원되지 않는다. (내가 못찾은건지..) 이것에 대한 대안은 전환 1탄에서 다룬 부분 중 tilesViewResolver 설정하는 부분이 있는데 이곳에서 urlBasedViewResolver.setRequestContextAttribute("rc") 라고 선언을 해 놓은것이 있다. 여기에 선언한 request context에 대한 값을 위와 같이 rc.contextPath 와 같은 방식으로 꺼내어 사용할 수 있다. 

그리고 c:set 와 같은 변수를 정의하는 tag는 #assign으로 대체할 수 있다. 


tag 사용법

jsp

<spring:eval var="basePath" expression="@environment.getProperty('base.path')" />
<tiles:insertAttribute name="contents" ignore="true" />

freemarker

<@spring.eval var="baseBase" expression="@environment.getProperty('base.path')" />
<@tiles.insertAttribute name="contents" ignore=true />

tag 는 사용법이 거의 비슷하여 일괄 치환이 가능할 정도이다. 아래에는 예외적인 것들을 기술했다. 


그 밖의 것

위의 특징적인 것들을 빼고 나머지는 다른 분이 작성한 글을 참조하자. (사실 하나하나 쓰기 힘들다!)

jsp freemarker
<c:out value="${variable}" />  ${variable}
<spring:message code="messages.properties.entry"/>  <@spring.message 'messages.properties.entry'/>
<c:url value="/relative/url"/> <@spring.url '/relative/url'/>
<c:if test="${items.recentUpdate}" >
  <span><fmt:message key="pls.browse.new"/></span>
</c:if>  
<#if item.recentUpdate >
  <span><@spring.message "pls.browse.new"/></span>
</#if>
<c:forEach items="${dir}" var="item">   
  <a href="<c:url value="/browse/${item.absoluteFileName}"/>">
</c:forEach>
<#list dir as item>      
  a href="<@spring.url "/browse/${item.absoluteFileName}"/>">
</#list>
<c:if test="${empty files && empty dir}">  <#if (files?size > 0) || (dir?size > 0)>
<li>      
  <label for="contentFolder">        
    <fmt:message key="pls.configure.folder"/>
  </label>    
  <form:errors path="contentFolder" cssClass="errors"/>
</li>
<li>
  <form:input path="contentFolder" size="30" maxlength="80"/>
</li>
<li>    
  <@spring.bind "settings.contentFolder"/>    
  <label for="contentFolder">  
    <@spring.message 'pls.configure.folder'/>
  </label>    
  <@spring.showErrors ' ', 'errors'/>
</li>
<li>  
  <@spring.formInput 'settings.contentFolder', 'size="30" maxlength="80"'/>
</li>
<form:form modelAttribute="profile" method="POST">     <form:errors cssClass="errors"/> <@spring.bind "profile"/>
<@spring.showErrors ' ', 'errors'/>
<spring:theme var="css" code="css"/>
<link rel="stylesheet" type="text/css" href="<c:url value="${css}/style.css"/>"/>
<#assign css>    
  <@spring.theme "css"/>
</#assign>
<link rel="stylesheet" type="text/css" href="<@spring.url '${css}/style.css'/>"/>

출처 : https://maruhgar.blogspot.com/2011/01/converting-from-jsp-to-freemarker.html

 

끝!