2011-07-26 17 views
0

私はSpring MVCアプリケーションのビュー技術としてFreemarkerを使用しています。私はサーバー名とスキームを見つけ出す必要があり、私が試してみるものは何も動作していないようです。 JSPでは、この情報を持つ暗黙のrequestオブジェクトがありますが、Freemarkerには同等のものがないようです。私はrequestContextrcとして公開していますが、rc.requestはnullです。私はRequestContext#getRequestはFreeMarkerの/反射から、すなわちアクセスすることはできません、保護されているため、あなたがrc.requestを介して要求にアクセスすることはできませんだと思うSpring MVCでフリーメーカのサーバ名とスキームを取得しますか?

<bean id="freemarkerViewResolver" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <property name="cache" value="false" /> 
    <property name="suffix" value=".ftl" /> 
    <property name="order" value="1" /> 
    <property name="exposeRequestAttributes" value="true" /> 
    <property name="requestContextAttribute" value="rc" /> 
    <property name="exposeSpringMacroHelpers" value="true" /> 
</bean> 


<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPaths"> 
     <list> 
      <value>${freemarker.templatePath}</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

答えて

3

は、ここに私のビューリゾルバの設定です。

免責事項:私はSpring MVCの専門家ではないので、次のアプローチは完全に狂気かもしれませんが、動作するはずです!

ローリクエストは、カスタムFreeMarkerViewFreeMarkerViewResolverで公開できます。

public class CustomFreeMarkerView extends FreeMarkerView { 
    protected SimpleHash buildTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) { 
     SimpleHash fmModel = super.buildTemplateModel(model, request, response); 
     fmModel.put("RawRequest", request); 
     return fmModel; 
    } 
} 

public class CustomFreeMarkerViewResolver extends AbstractTemplateViewResolver { 
    public CustomFreeMarkerViewResolver() { 
     setViewClass(requiredViewClass()); 
    } 
    @Override 
    protected Class requiredViewClass() { 
     return CustomFreeMarkerView.class; 
    } 
} 

次に、例えばあなたのfreemarkerViewResolver豆の設定で、あなたのカスタムビューリゾルバクラスを使用することができますし、${RawRequest}を経由して、あなたのテンプレートに生のリクエストにアクセス

Scheme: ${RawRequest.scheme} 
Server Name: ${RawRequest.serverName} 

このアプローチは、Spring Framework 3.0.5で役に立ちました。

+0

Hm、それはうまくいくはずです。私は完全性のために '応答'と 'セッション'を投げ込むことができたと思います。なぜ私はこれをしていないのだろうか? – jiggy

+0

Spring-MVCはすでにリクエストをテンプレートに公開していますが、サーブレットリクエスト属性にのみアクセスでき、serverNameやschemeなどのプロパティは要求しないFreeMarker HttpRequestHashModelとしてラップします。 – Chaquotay

関連する問題