2012-03-28 16 views
5

Tengo el proyecto SpringMVC con Freemarker como view resolver. En algunas plantillas, tengo que generar enlaces, incluido el nombre de host, pero no puedo obtenerlo. En JSP se me permite hacer la siguiente manera:¿Cómo obtener el nombre de host en la plantilla de freemarker?

`<% String hostName=request.getServerName();%>` 

He intentado utilizar "requestContextAttribute", pero volvieron requestContext.getContextPath() camino sin nombre de host. ¿Dónde puedo obtener la ruta completa o el nombre de host por separado?

Respuesta

1

Podemos hacer esto en JSTL. Intente adaptarlo en FreeMarker:

${pageContext.request.serverName} 
+1

Freemarker no tiene pageContext, pero tengo el objeto Request. ¿Cómo puedo obtener el nombre de host de él? –

-1

Este código debe trabajar en FreeMarker:

<#assign hostname = request.getServerName() /> 
<a href="http://${hostname}/foo">bar</a> 

Pero con FreeMarker que es mejor para obtener el nombre del servidor en Java y empuje en su plantilla como cadena.

+0

Esto no funcionó para mí. 'solicitud' no estaba definido. –

1

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()} 
+1

También podría agregar el objeto Request como un atributo desde el interior de uno de sus Controladores. Si no necesita esto en muchos lugares de su sitio, probablemente sea mejor. –

Cuestiones relacionadas