freemarker的模板是没有继承功能的。rapid-framework提供了几个directive实现了这个功能。
不过官方文档上给出的例子只有跟spring-mvc的支持
struts的展示层支持做的比较死,只靠修改配置无法实现。当然更可能是我没有发现,如果您知道往不吝赐教。
需要编写几行代码来实现这个功能。我们的目标是让Configuation对象包含rapid-framework的几个directive
首先要覆盖FreemarkerManager
public class MyFreemarkerManager extends FreemarkerManager {
public synchronized freemarker.template.Configuration getConfiguration(ServletContext servletContext) throws TemplateException {
freemarker.template.Configuration config = (freemarker.template.Configuration) servletContext.getAttribute(CONFIG_SERVLET_CONTEXT_KEY);
if (config == null) {
config = createConfiguration(servletContext);
DirectiveUtils.exposeRapidMacros(config);
servletContext.setAttribute(CONFIG_SERVLET_CONTEXT_KEY, config);
}
config.setWhitespaceStripping(true);
return config;
}
}
然后我们还要覆盖FreemarkerResult
public class MyFreemarkerResult extends FreemarkerResult {
private static final long serialVersionUID = 5911119577245406888L;
@Inject("my")
public void setFreemarkerManager(MyFreemarkerResult mgr){
super.setFreemarkerManager(mgr);
}
/**
* 覆盖父类的方法以移除注解
*/
public void setFreemarkerManager(FreemarkerManager mgr) {
this.freemarkerManager = mgr;
}
}
接下来要修改配置文件使用我们自己的 manager和result了
<bean class="com.mycompany.view.FreemarkerManager " name="my" />
<package name="struts-my" extends="struts-default">
<result-types>
<result-type name="freemarker" class="com.mycompany.view.MyFreemarkerResult"/>
</result-types>
</package>
注意struts的注入是按照类型和名字来注入的。