Spring Framework 提供了对多种视图技术的支持,包括 FreeMarker。在 Spring 中集成 FreeMarker 主要是通过 FreeMarkerConfigurer
和 FreeMarkerView
这两个类实现的。这两个类分别用于配置 FreeMarker 配置和处理视图渲染。
FreeMarkerConfigurer
是用于设置 FreeMarker 相关配置的类,如模板位置、编码方式等。它实现了 InitializingBean
和 ApplicationContextAware
接口,使其能在初始化时获得 ApplicationContext
并进行配置。
public class FreeMarkerConfigurer extends FreeMarkerConfigurationFactory
implements InitializingBean, ApplicationContextAware {
private Configuration configuration;
public void setApplicationContext(ApplicationContext applicationContext) {
// 设置 ApplicationContext
}
public void afterPropertiesSet() throws IOException, TemplateException {
// 初始化 FreeMarker configuration
this.configuration = createConfiguration();
}
public Configuration getConfiguration() {
// 返回初始化后的 Configuration
return this.configuration;
}
// 更多代码...
}
在 Spring 的配置文件中,你可以这样配置 FreeMarkerConfigurer
:
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>
FreeMarkerView
继承自 AbstractTemplateView
,是用于生成视图的类。它将模型数据与 FreeMarker 模板整合生成 HTML 输出。
public class FreeMarkerView extends AbstractTemplateView {
@Override
protected void renderMergedTemplateModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 获取 FreeMarker configuration
Configuration config = (Configuration) getApplicationContext().getAttribute(FreeMarkerConfigurer.FREEMARKER_CONFIG_ATTRIBUTE);
// 获取模板
Template template = getTemplate(config);
// 合并模型数据和模板
FreeMarkerTemplateUtils.processTemplate(template, model, response.getWriter());
}
protected Template getTemplate(Configuration config) throws IOException {
// 加载 FreeMarker 模板
return config.getTemplate(getUrl());
}
// 更多代码...
}
在 Spring 的配置文件中,你可以这样配置视图解析器,使其能够解析 FreeMarker 视图:
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
</bean>
在 FreeMarkerView
中使用的 FreeMarkerTemplateUtils
是一个帮助类,它封装了模板合并操作的通用逻辑。
public abstract class FreeMarkerTemplateUtils {
public static void processTemplate(Template template, Object model, Writer writer)
throws IOException, TemplateException {
try {
// 合并模型数据和模板
template.process(model, writer);
} catch (TemplateException ex) {
throw ex;
} finally {
writer.flush();
}
}
// 更多代码...
}
在 Spring Framework 中,FreeMarker 的整合遵循了 Spring 的常用模式,即配置和使用分离。FreeMarkerConfigurer
负责配置和初始化 FreeMarker 的 Configuration
对象,而 FreeMarkerView
则用这个配置对象渲染视图。
Spring 提供了相应的抽象类和接口来处理视图解析和渲染的逻辑。例如,ViewResolver
接口用于解析视图名到视图实例,View
接口负责使用模型渲染输出。
当请求到达 Spring 的 DispatcherServlet
时,它会通过配置的视图解析器解析出相应的视图,然后使用视图实例来渲染输出。在这个过程中,FreeMarker 模板引擎会被用于从模板中生成 HTML 内容,然后这些内容会被写入响应。
这样的设计允许开发者轻松切换不同的视图技术,因为视图的解析和渲染逻辑是由 Spring 的抽象定义的,而与具体的模板引擎实现(如 FreeMarker、Thymeleaf、JSP 等)解耦。