2012-03-28 6 views
5

Ho un progetto SpringMVC con Freemarker come risolutore di viste. In alcuni template devo generare link che includono hostname, ma non riesco a ottenerlo. In JSP posso fare come questo:Come ottenere il nome host nel modello freemarker?

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

ho cercato di usare "requestContextAttribute", ma requestContext.getContextPath() percorso restituito senza nome di host. Dove posso ottenere il percorso completo o il nome host separatamente?

risposta

1

Possiamo farlo in JSTL. Prova adattandolo in FreeMarker:

${pageContext.request.serverName} 
+1

Freemarker non ha pageContext, tuttavia ho oggetto Request. Come posso ottenere l'hostname da esso? –

-1

Questo codice dovrebbe funzionare in freemarker:

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

Ma con freemarker è meglio per ottenere il nome del server in java e spingerlo modello come stringa.

+0

Questo non ha funzionato per me. 'richiesta' era indefinita. –

1

È importante capire che Freemarker è intenzionalmente progettato per non conoscere il contesto in cui è utilizzato, per renderlo più generico. Ciò significa che, diversamente dai JSP, non ha accesso agli oggetti HttpServletRequest e Response per impostazione predefinita. Se vuoi che abbia accesso, dovrai fornirlo.

Il modo in cui ho risolto questo problema era creare un filtro servlet per aggiungere l'oggetto HttpServletRequest come attributo di richiesta a cui Freemarker ha accesso.

/** 
* 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() 
    { 

    } 

} 

È necessario definire questo nel vostro web.xml in modo per farlo funzionare:

<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> 

Poi, nei miei file .ftl, posso utilizzare il seguente:

${Request.RequestObject.getServerName()} 
+1

È anche possibile aggiungere l'oggetto Request come attributo all'interno di uno dei controller. Se non ne hai bisogno in molti punti del tuo sito, probabilmente è meglio. –