【问题标题】:How to get hostname in freemarker template?如何在 freemarker 模板中获取主机名?
【发布时间】:2012-04-12 00:05:03
【问题描述】:

我有使用 Freemarker 作为视图解析器的 SpringMVC 项目。在某些模板中,我必须生成包含主机名的链接,但我无法获得它。 在 JSP 中我可能会这样做:

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

我尝试使用“requestContextAttribute”,但requestContext.getContextPath() 返回的路径没有主机名。 我在哪里可以单独获取完整路径或主机名?

【问题讨论】:

    标签: java spring freemarker


    【解决方案1】:

    我们可以在 JSTL 中做到这一点。尝试在 FreeMarker 中调整它:

    ${pageContext.request.serverName}
    

    【讨论】:

    • Freemarker 没有 pageContext,但是我有 Request 对象。如何从中获取主机名?
    【解决方案2】:

    重要的是要了解 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()}
    

    【讨论】:

    • 您还可以将 Request 对象作为属性从您的一个控制器内部添加。如果您网站的很多地方都不需要这个,那可能会更好。
    【解决方案3】:

    此代码应该可以在 freemarker 中使用:

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

    但是使用freemarker最好在java中获取服务器名称并将其作为字符串推送到模板中。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2019-11-05
      • 2016-04-21
      • 2017-10-22
      • 2010-11-17
      • 2015-06-13
      • 1970-01-01
      • 2013-08-13
      • 2011-01-18
      相关资源
      最近更新 更多