2012-03-28 3 views
5

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

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

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

ответ

1

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

${pageContext.request.serverName} 
+1

У Freemarker нет страницыContext, однако у меня есть объект Request. Как я могу получить имя хоста? –

-1

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

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

Но FreeMarker это лучше, чтобы получить имя сервера в Java и вставьте его в шаблон в виде строки.

+0

Это не сработало для меня. «запрос» не определен. –

1

Важно понимать, что 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

Вы также можете добавить объект Request в качестве атрибута внутри одного из ваших контроллеров. Если вам это не нужно во многих местах вашего сайта, это, вероятно, лучше. –

Смежные вопросы