Как получить имя хоста в шаблоне freemarker? - PullRequest
5 голосов
/ 28 марта 2012

У меня есть проект SpringMVC с Freemarker в качестве распознавателя представлений.В некоторых шаблонах я должен генерировать ссылки, включая имя хоста, но я не могу его получить.В JSP я могу сделать так:

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

Я пытался использовать "requestContextAttribute", но requestContext.getContextPath() вернул путь без имени хоста.Где я могу получить полный путь или имя хоста отдельно?

Ответы [ 3 ]

1 голос
/ 25 марта 2015

Важно понимать, что Freemarker специально разработан, чтобы не знать контекст, в котором он используется, чтобы сделать его более общим. Это означает, что в отличие от JSP, он не имеет доступа к объектам HttpServletRequest и Response по умолчанию. Если вы хотите, чтобы он имел доступ, вам нужно будет предоставить его.

Я решил это путем создания фильтра сервлетов для добавления объекта 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 голос
/ 28 марта 2012

Мы можем сделать это в JSTL. Попробуйте адаптировать его во FreeMarker:

${pageContext.request.serverName}
0 голосов
/ 28 марта 2012

Этот код должен работать в freemarker:

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

Но с помощью freemarker лучше получить имя сервера в java и вставить его в шаблон в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...