Важно понимать, что Freemarker специально разработан, чтобы не знать контекст, в котором он используется, чтобы сделать его более общим. Это означает, что в отличие от JSP, он не имеет доступа к объектам HttpServletRequest и Response по умолчанию. Если вы хотите, чтобы он имел доступ, вам нужно будет предоставить его.
Я решил это путем создания фильтра сервлетов для добавления объекта HttpServletRequest в качестве атрибута запроса, к которому у Freemarker есть доступ.
/**
* This simple filter adds the HttpServletRequest object to the Request Attributes with the key "RequestObject"
* so that it can be referenced from Freemarker.
*/
public class RequestObjectAttributeFilter implements Filter
{
/**
*
*/
public void init(FilterConfig paramFilterConfig) throws ServletException
{
}
public void doFilter(ServletRequest req,
ServletResponse res, FilterChain filterChain)
throws IOException, ServletException
{
req.setAttribute("RequestObject", req);
filterChain.doFilter(req, res);
}
public void destroy()
{
}
}
Вам нужно определить это в вашем файле web.xml, чтобы он работал:
<filter>
<filter-name>RequestObjectAttributeFilter</filter-name>
<filter-class>com.foo.filter.RequestObjectAttributeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RequestObjectAttributeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Тогда в моих файлах .ftl я могу использовать следующее:
${Request.RequestObject.getServerName()}