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