Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在freemarker模板中获取主机名?_Java_Spring_Freemarker - Fatal编程技术网

Java 如何在freemarker模板中获取主机名?

Java 如何在freemarker模板中获取主机名?,java,spring,freemarker,Java,Spring,Freemarker,我有一个SpringMVC项目,使用Freemarker作为视图解析器。在一些模板中,我必须生成包括主机名在内的链接,但我无法获得它。 在JSP中,我可以这样做: `<% String hostName=request.getServerName();%>` `` 我试图使用“requestContextAttribute”,但是requestContext.getContextPath()返回了没有主机名的路径。 在哪里可以分别获得完整路径或主机名?我们可以在JSTL中实现这一

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

`<% 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获取服务器名称,并将其作为字符串推送到模板中。

重要的是要理解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>

Freemarker没有pageContext,但我有请求对象。如何从中获取主机名?您还可以从一个控制器中添加请求对象作为属性。如果你在网站的很多地方不需要这个,那可能更好。
${Request.RequestObject.getServerName()}