Es importante comprender que Freemarker está diseñado intencionalmente para no tener conocimiento del contexto en el que se utiliza, para hacerlo más genérico. Eso significa que a diferencia de los JSP, no tiene acceso a los objetos HttpServletRequest y Response de manera predeterminada. Si desea que tenga acceso, deberá proporcionarlo.
La manera en que resolví esto fue crear un filtro de servlet para agregar el objeto HttpServletRequest como un atributo de solicitud al que Freemarker tiene acceso.
/**
* 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()
{
}
}
Tendrá que definir esto en su web.xml con el fin de que funcione:
<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>
Luego, en mis archivos .ftl, puedo usar lo siguiente:
${Request.RequestObject.getServerName()}
Freemarker no tiene pageContext, pero tengo el objeto Request. ¿Cómo puedo obtener el nombre de host de él? –