Важно понимать, что 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()}
У Freemarker нет страницыContext, однако у меня есть объект Request. Как я могу получить имя хоста? –