我正在使用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请求范围?
答案 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依赖项。