我有SpringMVC項目與Freemarker作爲視圖解析器。在一些模板中,我必須生成包括主機名的鏈接,但我無法獲取它。 在JSP中我可以做這樣的:如何獲取freemarker模板中的主機名?
`<% String hostName=request.getServerName();%>`
我試圖用「requestContextAttribute
」,但requestContext.getContextPath()
返回的路徑沒有主機名。 我可以在哪裏分別獲得完整路徑或主機名?
我有SpringMVC項目與Freemarker作爲視圖解析器。在一些模板中,我必須生成包括主機名的鏈接,但我無法獲取它。 在JSP中我可以做這樣的:如何獲取freemarker模板中的主機名?
`<% String hostName=request.getServerName();%>`
我試圖用「requestContextAttribute
」,但requestContext.getContextPath()
返回的路徑沒有主機名。 我可以在哪裏分別獲得完整路徑或主機名?
我們可以在JSTL中做到這一點。嘗試在FreeMarker的適應它:
${pageContext.request.serverName}
此代碼應在freemarker的工作:
<#assign hostname = request.getServerName() />
<a href="http://${hostname}/foo">bar</a>
但隨着freemarker的,最好用Java來獲得服務器名稱,並將其推入模板字符串。
這不適合我。 '請求'未定義。 – 2015-02-19 22:56:00
重要的是要明白,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()}
您也可以將請求對象作爲來自您的控制器之一的屬性添加。如果你的網站很多地方不需要這個,那可能會更好。 – 2015-03-25 18:49:38
Freemarker沒有pageContext,但是我有Request對象。我如何從中獲取主機名? – 2012-03-28 12:24:22