如何从Freemarker TemplateDirectiveModel访问Spring RequestContext

时间:2011-05-26 14:02:54

标签: spring spring-mvc freemarker

我正在使用Spring MVC和Freemarker作为视图技术。我有一个TemplateDirectiveModel对象,需要在execute方法中访问Spring的RequestContext。目前我这样做:

public class MyDirective implements TemplateDirectiveModel
{
    public void execute(Environment env, Map params, TemplateModel[] loopVars,
        TemplateDirectiveBody body) throws TemplateException, IOException
    {
        StringModel model = (StringModel) env.getGlobalVariable("springMacroRequestContext");
        RequestContext requestContext = (RequestContext) model.getWrappedObject();
    }
}

但我无法相信这是正确的做法。我觉得我错过了重要的事情。也许有一些特殊的类和注释用于处理Spring中的Freemarker指令?也许我可以让Spring在指令类中注入一些东西,我可以使用它来访问Springs请求范围?

2 个答案:

答案 0 :(得分:0)

您可以继承FreeMarkerConfigurer,覆盖其postProcessConfiguration(Configuration config)方法。 您的实现只会在配置中放置一个请求感知依赖项,例如shared variable(由FM documentation预先设定)。

应该做的,春天风格...

答案 1 :(得分:0)

有一种更简单的方法可以做到这一点。如果你已经在使用spring的FreeMarkerConfigurer,你可以将它变成一个变量图:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" 
p:templateLoaderPath="/some_path_here">
    <property name="freemarkerVariables">
        <map>
            <entry key='macroName' value-ref="templateModelRef" />
        </map>  
    </property>
</bean>

<bean id="templateModelRef" class="...class..extends TemplateModel">
    <property name="someResource" value-ref="resourceRef"/>
</bean>

现在至少在扩展TemplateDirectiveModel执行方法的类中,您可以访问该注入属性。

public class MyDirective extends TemplateDirectiveModel {
    private MyResource someResource;
    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException, IOException {

        StringModel sharedVariable = (StringModel)env.getConfiguration().getSharedVariable("beanName");
        MyClass sweetness = (MyClass)sharedVariable.getWrappedObject();
    }       
}

现在你的.ftl可以使用:

&lt; @macroName /&gt;

它将自动注入spring依赖项。