Spring Freemarker

Spring Framework 提供了对多种视图技术的支持,包括 FreeMarker。在 Spring 中集成 FreeMarker 主要是通过 FreeMarkerConfigurerFreeMarkerView 这两个类实现的。这两个类分别用于配置 FreeMarker 配置和处理视图渲染。

FreeMarkerConfigurer

FreeMarkerConfigurer 是用于设置 FreeMarker 相关配置的类,如模板位置、编码方式等。它实现了 InitializingBeanApplicationContextAware 接口,使其能在初始化时获得 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

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>

FreeMarkerTemplateUtils

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 等)解耦。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Web 和 Freemarker 都是非常流行的 Java 技术,可以用来开发 Web 应用程序。下面是一个简单的入门示例,让你了解如何在 Spring Web 应用程序中使用 Freemarker 模板引擎。 1. 创建一个 Spring Web 项目 首先,你需要创建一个 Spring Web 项目。你可以使用任何 IDE,例如 Eclipse 或 IntelliJ IDEA。在创建项目时,请确保选择了 Spring Web 依赖项。 2. 添加 Freemarker 依赖项 在项目的 pom.xml 文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> ``` 3. 创建一个 Freemarker 模板 在 src/main/resources/templates 目录下创建一个名为 index.ftl 的文件。在该文件中添加以下内容: ``` <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1>${message}</h1> </body> </html> ``` 这是一个非常简单的 HTML 文件,其中包含一个 h1 标签和一个变量 ${message},该变量将在后面的步骤中由 Spring Web 应用程序提供。 4. 创建一个控制器 在 src/main/java 目录下创建一个名为 HomeController 的类,该类包含以下内容: ``` @Controller public class HomeController { @GetMapping("/") public String home(Model model) { model.addAttribute("message", "Hello, World!"); return "index"; } } ``` 这是一个简单的控制器,它使用 @Controller 注解标记,并且包含一个名为 home 的方法,该方法使用 @GetMapping 注解标记。当用户访问根路径时,该方法将返回 index 模板,并将一个名为 message 的变量添加到模型中。 5. 运行应用程序 现在,你已经准备好运行应用程序了。在 IDE 中运行应用程序或使用以下命令在命令行中运行: ``` mvn spring-boot:run ``` 6. 查看输出 现在,你可以在浏览器中访问 http://localhost:8080/,你将看到一个包含“Hello, World!”消息的页面。这是由 Freemarker 模板引擎生成的,该模板引擎使用 Spring Web 应用程序提供的数据填充模板。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值