Servlet与FreeMarker整合
http://oma1989.iteye.com/blog/1421804
SpringTemplateLoader
public class SpringTemplateLoader implements TemplateLoader { protected final Log logger = LogFactory.getLog(getClass()); private final ResourceLoader resourceLoader; private final String templateLoaderPath; /** * Create a new SpringTemplateLoader. * @param resourceLoader the Spring ResourceLoader to use * @param templateLoaderPath the template loader path to use */ public SpringTemplateLoader(ResourceLoader resourceLoader, String templateLoaderPath) { this.resourceLoader = resourceLoader; if (!templateLoaderPath.endsWith("/")) { templateLoaderPath += "/"; } this.templateLoaderPath = templateLoaderPath; if (logger.isInfoEnabled()) { logger.info("SpringTemplateLoader for FreeMarker: using resource loader [" + this.resourceLoader + "] and template loader path [" + this.templateLoaderPath + "]"); } } public Object findTemplateSource(String name) throws IOException { if (logger.isDebugEnabled()) { logger.debug("Looking for FreeMarker template with name [" + name + "]"); } Resource resource = this.resourceLoader.getResource(this.templateLoaderPath + name); return (resource.exists() ? resource : null); } public Reader getReader(Object templateSource, String encoding) throws IOException { Resource resource = (Resource) templateSource; try { return new InputStreamReader(resource.getInputStream(), encoding); } catch (IOException ex) { if (logger.isDebugEnabled()) { logger.debug("Could not find FreeMarker template: " + resource); } throw ex; } } public long getLastModified(Object templateSource) { Resource resource = (Resource) templateSource; try { return resource.lastModified(); } catch (IOException ex) { if (logger.isDebugEnabled()) { logger.debug("Could not obtain last-modified timestamp for FreeMarker template in " + resource + ": " + ex); } return -1; } } public void closeTemplateSource(Object templateSource) throws IOException { }
FreeMarkerConfigurationFactory:
protected TemplateLoader getTemplateLoaderForPath(String templateLoaderPath) { if (isPreferFileSystemAccess()) { // Try to load via the file system, fall back to SpringTemplateLoader // (for hot detection of template changes, if possible). try { Resource path = getResourceLoader().getResource(templateLoaderPath); File file = path.getFile(); // will fail if not resolvable in the file system if (logger.isDebugEnabled()) { logger.debug( "Template loader path [" + path + "] resolved to file path [" + file.getAbsolutePath() + "]"); } return new FileTemplateLoader(file); } catch (IOException ex) { if (logger.isDebugEnabled()) { logger.debug("Cannot resolve template loader path [" + templateLoaderPath + "] to [java.io.File]: using SpringTemplateLoader as fallback", ex); } return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath); } } else { // Always load via SpringTemplateLoader (without hot detection of template changes). logger.debug("File system access not preferred: using SpringTemplateLoader"); return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath); } }
FreeMarkerConfigurationFactory:
public Configuration createConfiguration() throws IOException, TemplateException { Configuration config = newConfiguration(); Properties props = new Properties(); // Load config file if specified. if (this.configLocation != null) { if (logger.isInfoEnabled()) { logger.info("Loading FreeMarker configuration from " + this.configLocation); } PropertiesLoaderUtils.fillProperties(props, this.configLocation); } // Merge local properties if specified. if (this.freemarkerSettings != null) { props.putAll(this.freemarkerSettings); } // FreeMarker will only accept known keys in its setSettings and // setAllSharedVariables methods. if (!props.isEmpty()) { config.setSettings(props); } if (!CollectionUtils.isEmpty(this.freemarkerVariables)) { config.setAllSharedVariables(new SimpleHash(this.freemarkerVariables, config.getObjectWrapper())); } if (this.defaultEncoding != null) { config.setDefaultEncoding(this.defaultEncoding); } // Register template loaders that are supposed to kick in early. if (this.preTemplateLoaders != null) { this.templateLoaders.addAll(this.preTemplateLoaders); } // Register default template loaders. if (this.templateLoaderPaths != null) { for (String path : this.templateLoaderPaths) { this.templateLoaders.add(getTemplateLoaderForPath(path)); } } postProcessTemplateLoaders(this.templateLoaders); // Register template loaders that are supposed to kick in late. if (this.postTemplateLoaders != null) { this.templateLoaders.addAll(this.postTemplateLoaders); } TemplateLoader loader = getAggregateTemplateLoader(this.templateLoaders); if (loader != null) { config.setTemplateLoader(loader); } postProcessConfiguration(config); return config; }