Spring Freemarker

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

FreeMarkerConfigurer

FreeMarkerConfigurer 是用于设置 FreeMarker 相关配置的类,如模板位置、编码方式等。它实现了 InitializingBeanApplicationContextAware 接口,使其能在初始化时获得 ApplicationContext 并进行配置。

public class FreeMarkerConfigurer extends FreeMarkerConfigurationFactoryimplements InitializingBean, ApplicationContextAware {private Configuration configuration;public void setApplicationContext(ApplicationContext applicationContext) {// 设置 ApplicationContext}public void afterPropertiesSet() throws IOException, TemplateException {// 初始化 FreeMarker configurationthis.configuration = createConfiguration();}public Configuration getConfiguration() {// 返回初始化后的 Configurationreturn 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 {@Overrideprotected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {// 获取 FreeMarker configurationConfiguration 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 等)解耦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天10个前端小知识 <Day 12>

前端面试基础知识题 1. Promise中&#xff0c;resolve后面的语句是否还会执行&#xff1f; 会被执行。如果不需要执行&#xff0c;需要在 resolve 语句前加上 return。 2. 什么是内存泄漏&#xff1f;什么原因会导致呢&#xff1f; 内存泄露的解释&#xff1a;程序中己动态…

酒店网络SIP融合对讲系统联动110方案

酒店网络SIP融合对讲系统联动110方案 酒店对讲系统设计采用了基于网络传输的对讲系统&#xff0c;利用网络平台&#xff0c;把管理中心和前端各个求助点连接起来&#xff0c;所有的通讯信号和控制协议通过网络进行传输&#xff0c;采用基于网络数字SIP网络对讲系统&#xff0c…

【数据结构】 双链表的基本操作 (C语言版)

目录 一、双链表 1、双链表的定义&#xff1a; 2、双链表表的优缺点&#xff1a; 二、双链表的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、双链表的初始化 4、双链表表插入 5、双链表的查找 6、双链表的取值 7、求双链表长度 8、双链表…

EtherCAT主站SOEM -- 17 --Qt-Soem通过界面按键控制电机转圈圈PP模式

EtherCAT主站SOEM -- 17 --Qt-Soem通过界面按键控制电机转圈圈PP模式 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载1 程序文件修改替换1.1 allvalue.h1.2 motrorcontrol.h1.3 mainwindow.cpp1.4 motrorcontrol.cpp2 ui界面显示该文档修改记录:总…

Linux shell编程学习笔记41:lsblk命令

边缘计算的挑战和机遇 边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机遇&#xff0c;需要我…

阿里云国外服务器价格购买与使用策略

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

学习笔记-李沐动手学深度学习(二)(08-09、线性回归、优化算法、Softmax回归、损失函数、图片分类)

总结 以_结尾的方法&#xff0c;好像是原位替换&#xff08;即 原地修改&#xff0c;就地修改变量&#xff09;如 fill_() 感恩的心&#xff1a;&#xff08;沐神的直播环境&#xff09; 08-线性回归基础优化算法 引言&#xff08;如何在美国买房&#xff09; 根据现在行…

用ChatGPT教学、科研!亚利桑那州立大学与OpenAI合作

亚利桑那州立大学&#xff08;简称“ASU”&#xff09;在官网宣布与OpenAI达成技术合作。从2024年2月份开始&#xff0c;为所有学生提供ChatGPT企业版访问权限&#xff0c;主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品&#xff0c;AS…

unicloud 云对象 schema

目录 云对象 创建云对象 客户端调用 二、Schema&#xff08;表结构&#xff09; 什么是Schema&#xff1f; 如何编写DB Schema Schema的一级节点 客户端直连数据库 字段属性 字段类型bsonType 默认值defaultValue/forceDefaultValue 云对象 创建云对象 云对象&#…

HarmonyOS鸿蒙应用开发 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

PyTorch中定义可学习参数时的坑

当需要在模型运行时定义可学习参数时&#xff08;常见场景&#xff1a;参数的维度由每一层的维度定&#xff09;&#xff0c;我们就需要用这样的写法来实现&#xff1a; class model(torch.nn.Module):def __init__(self):super().__init__()self.alpha Nonedef forward(self…

JavaEE中什么是Web容器?

Web容器&#xff08;也称为Servlet引擎&#xff09;是一个用于执行Java Servlet和JSP的服务器端环境。它负责管理和执行在其上运行的Web应用程序。 Tomcat是Web容器 Apache Tomcat 是一个流行的开源的Web容器&#xff0c;它实现了Java Servlet和JavaServer Pages&#xff08;…

pinctrl子系统简介

一. 简介 上一章我们编写了基于设备树的 LED 驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置 LED 灯所使用的 GPIO 寄存器&#xff0c;驱动开发方式和裸机基本没啥区别。 Linux 是一个庞大而完善的系统&#xff0c; 尤其是驱动框架&#xff0c;像 GPIO …

【深度学习目标检测】十七、基于深度学习的洋葱检测系统-含GUI和源码(python,yolov8)

使用AI实现洋葱检测对农业具有以下意义&#xff1a; 提高效率&#xff1a;AI技术可以快速、准确地检测出洋葱中的缺陷和问题&#xff0c;从而提高了检测效率&#xff0c;减少了人工检测的时间和人力成本。提高准确性&#xff1a;AI技术通过大量的数据学习和分析&#xff0c;能够…

第五课:MindSpore自动并行

文章目录 第五课&#xff1a;MindSpore自动并行1、学习总结&#xff1a;数据并行模型并行MindSpore算子级并行算子级并行示例 流水线并行GPipe和Micro batch1F1B流水线并行示例 内存优化重计算优化器并行 MindSpore分布式并行模式课程ppt及代码地址 2、学习心得&#xff1a;3、…

如何使用pytorch的Dataset, 来定义自己的Dataset

Dataset与DataLoader的关系 Dataset: 构建一个数据集&#xff0c;其中含有所有的数据样本DataLoader&#xff1a;将构建好的Dataset&#xff0c;通过shuffle、划分batch、多线程num_workers运行的方式&#xff0c;加载到可训练的迭代容器。 import torch from torch.utils.dat…

Qt6入门教程 9:QWidget、QMainWindow和QDialog

目录 一.QWidget 1.窗口和控件 2.事件 二.QMainWindow 三.QDialog 1.模态对话框 1.1模态对话框 1.2.半模态对话框 2.非模态对话框 在用Qt Creator创建Qt Widgets项目时&#xff0c;会默认提供三种基类以供选择&#xff0c;它们分别是QWidget、QMainWIndow和QDialog&am…

SQL 注入总结(详细)

一、前言 这篇文章是最近学习 SQL 注入后的笔记&#xff0c;里面整理了 SQL 常见的注入方式&#xff0c;供大家学习了解 SQL 注入的原理及方法&#xff0c;也方便后续自己回顾&#xff0c;如有什么错误的地方欢迎指出&#xff01; 二、判断注入类型 按照注入点类型分类 数字型…

外贸自建站如何建立?海洋建站的操作指南?

外贸自建站的建站流程什么&#xff1f;做跨境怎么搭建外贸网站&#xff1f; 外贸自建站成为企业开拓国际市场、提升品牌形象的重要途径。然而&#xff0c;对于许多企业而言&#xff0c;如何高效地进行外贸自建站仍然是一个挑战。海洋建站将带您一步步探讨外贸自建站的关键步骤…