2012-03-28 83 views
5

我有SpringMVC項目與Freemarker作爲視圖解析器。在一些模板中,我必須生成包括主機名的鏈接,但我無法獲取它。 在JSP中我可以做這樣的:如何獲取freemarker模板中的主機名?

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

我試圖用「requestContextAttribute」,但requestContext.getContextPath()返回的路徑沒有主機名。 我可以在哪裏分別獲得完整路徑或主機名?

回答

1

我們可以在JSTL中做到這一點。嘗試在FreeMarker的適應它:

${pageContext.request.serverName} 
+1

Freemarker沒有pageContext,但是我有Request對象。我如何從中獲取主機名? – 2012-03-28 12:24:22

-1

此代碼應在freemarker的工作:

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

但隨着freemarker的,最好用Java來獲得服務器名稱,並將其推入模板字符串。

+0

這不適合我。 '請求'未定義。 – 2015-02-19 22:56:00

1

重要的是要明白,Freemarker是故意設計爲不知道其使用的上下文,使其更通用。這意味着與JSP不同,它默認情況下不能訪問HttpServletRequest和Response對象。如果你想讓它有訪問權限,你需要提供它。

我解決這個問題的方法是創建一個Servlet過濾器,將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()} 
+1

您也可以將請求對象作爲來自您的控制器之一的屬性添加。如果你的網站很多地方不需要這個,那可能會更好。 – 2015-03-25 18:49:38