2012-03-28 15 views
5

Ich habe SpringMVC Projekt mit Freemarker als View Resolver. In einigen Templates muss ich Links generieren, einschließlich Hostname, aber ich kann es nicht bekommen. In JSP ich so tun kann:Wie bekomme ich den Hostnamen in der Freemarker Vorlage?

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

Ich habe versucht, „requestContextAttribute“ zu verwenden, aber requestContext.getContextPath() Pfad ohne Hostnamen zurückgegeben. Wo kann ich den vollständigen Pfad oder Hostnamen getrennt erhalten?

Antwort

1

Wir können dies in JSTL tun. Versuchen Sie es in Freemarker Anpassung:

${pageContext.request.serverName} 
+1

Freemarker nicht pagecontext haben, jedoch habe ich Request-Objekt. Wie kann ich Hostnamen von ihm erhalten? –

-1

Dieser Code sollte in Freemarker arbeiten:

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

Aber mit Freemarker es besser ist, den Servernamen in Java zu bekommen und schieben Sie es in Vorlage als String.

+0

Das hat bei mir nicht funktioniert. 'Anfrage' war undefiniert. –

1

Es ist wichtig zu verstehen, dass Freemarker absichtlich Kenntnis des Kontextes nicht haben soll, in dem es verwendet wird, um es mehr Generika. Das bedeutet, dass es im Gegensatz zu JSPs standardmäßig keinen Zugriff auf die Objekte HttpServletRequest und Response hat. Wenn Sie Zugriff darauf haben möchten, müssen Sie es bereitstellen.

Die Art, wie ich dieses Problem gelöst war ein Servlet-Filter zu erstellen, um das HttpServletRequest Objekt als Antrag Attribut hinzufügen, die Freemarker Zugriff hat.

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

    } 

} 

Sie müssen dies in Ihrem web.xml definieren, um für sie arbeiten:

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

Dann in meiner .ftl Dateien, ich folgendes verwenden:

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

Sie können das Request-Objekt auch als Attribut von einem Ihrer Controller hinzufügen. Wenn Sie dies an vielen Stellen Ihrer Site nicht benötigen, ist das wahrscheinlich besser. –

Verwandte Themen