2012-03-28 15 views
5

私は、ビューリゾルバとしてFreemarkerでSpringMVCプロジェクトを持っています。いくつかのテンプレートでは、ホスト名を含むリンクを生成する必要がありますが、取得できません。 JSPでは 私はこのように行うには可能性がありますfreemarkerテンプレートでホスト名を取得する方法は?

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

私は「requestContextAttribute」を使用しようとしましたが、requestContext.getContextPath()は、ホスト名なしでパスを返されました。 完全パスまたはホスト名は個別にどこで取得できますか?

答えて

1

私たちはJSTLでこれを行うことができます。 FreeMarkerの中にそれを適応してみてください。

${pageContext.request.serverName} 
+1

FreemarkerにはpageContextがありませんが、私はRequestオブジェクトを持っています。どのようにしてホスト名を取得できますか? –

-1

このコードはFreeMarkerの中で動作するはずです:

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

しかしFreeMarkerのと、それはJavaでサーバ名を取得し、文字列としてテンプレートにそれをプッシュする方が良いでしょう。

+0

これは私には役に立たなかった。 '要求'は未定義です。 –

1

Freemarkerは、それがより一般的なものになるように、使用されているコンテキストを知らないように意図的に設計されていることを理解することが重要です。これは、JSPとは異なり、デフォルトではHttpServletRequestおよびResponseオブジェクトへのアクセス権がないことを意味します。アクセス権を持っている場合は、それを提供する必要があります。

私がこれを解決したのは、Freemarkerがアクセスできるリクエスト属性としてHttpServletRequestオブジェクトを追加するServlet Filterを作成することでした。

あなたはそれが機能するためには、あなたのweb.xmlにこれを定義する必要があります
/** 
* 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() 
    { 

    } 

} 

<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

また、リクエストオブジェクトをコントローラの1つの内部から属性として追加することもできます。サイトの多くの場所でこれを必要としない場合は、おそらくそれが良いでしょう。 –

関連する問題