Thymeleaf笔记
从三层架构到MVC
- MVC理念和三层架构并不矛盾,反而是三层架构的延伸
- MVC专指表述层的设计理念
- MVC理念的核心思想:解耦
从业务功能和三层架构角度看项目网格
Thymeleaf搭建环境
导入jar包
attoparser-2.0.5.RELEASE.jar
javassist-3.20.0-GA.jar
log4j-1.2.15.jar
ognl-3.1.26.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar
thymeleaf-3.0.12.RELEASE.jar
unbescape-1.1.6.RELEASE.jar
配置web.xml
1 | <!-- 在上下文参数中配置视图前缀和视图后缀 --> |
创建ViewBaseServlet
1 | import org.thymeleaf.TemplateEngine; |
ViewBaseServlet用法
- 具体模块下的Servlet继承ViewBaseServlet
- 想要转发到某个视图时,调用父类的processTemplate()即可
- 按照习惯,我们通常会将模板视图文件放在WEB-INF目录下,这样就不能直接重定向到模板视图文件。此时我们需要重定向到一个Servlet,然后再通过这个Servlet转发到这个模板视图并渲染。
- 访问项目的首页时,也必须经过Servlet,执行processTemplate()方法,才能够正确解析首页页面上的Thymeleaf元素。
1 | <servlet> |
创建ModelBaseServlet
这个类和Thymeleaf没有直接关系,我们使用这个基类,是为了避免每处理一个请求就创建一个Servlet。继承了ModelBaseServlet之后,就可以把同一个模块内处理各个请求的方法集中到同一个Servlet中。
1 | public class ModelBaseServlet extends ViewBaseServlet { |
各个Servlet之间的继承关系
Thymeleaf页面th名称空间
Thymeleaf语法
th:xxx
属性名 | 作用 |
---|---|
th:text | 使用表达式设置文本标签体的数据 |
th:属性名 | 使用表达式运算得到的值设置HTML属性 |
th:if/th:unless | 分支判断 |
th:each | 迭代 |
直接写表达式
- 有转义效果:[[${表达式}]]
- 无转义效果:[(${表达式})]
表达式的类型
- @{}:给传入的字符串前面附加『上下文路径』
- ${}:解析OGNL表达式
OGNL表达式
OGNL:Objects-Graph Navigation Language对象图导航语言
起点
表达式起点描述 | 作用 | 参考 |
---|---|---|
请求域属性名 | 根据属性名从请求域取出数据 | |
session | 访问session域 | |
application | 访问application域 | |
param | 读取请求参数 | |
#strings | 执行字符串的相关处理 | org.thymeleaf.expression.Strings |
#lists | 执行集合相关的处理 | org.thymeleaf.expression.Lists |
#request | 原生的request对象 | |
#response | 原生的response对象 | |
#session | 原生的session对象 | |
#servletContext | 原生的ServletContext对象 |
访问具体属性语法
对象类型 | 访问方式 |
---|---|
普通对象包含使用getXxx()、setXxx()定义的属性 | 对象.属性名 |
List集合 | [index] |
数组 | [下标] |
Map集合 | map.key |
有方法的对象 | 对象.方法() 对象.方法(参数列表) |
包含代码片段页面
声明代码片段
1 |
|
引入代码片段
引入方式 | 作用 |
---|---|
th:insert=”segment/admin-navigator :: navigator” | 把目标代码片段整体包含到当前标签内部 |
th:include=”segment/admin-navigator :: navigator” | 把目标代码片段内部的内容包含到当前标签内 |
th:replace=”segment/admin-navigator :: navigator” | 使用目标代码片段替换当前标签 |
segment/admin-navigator代表目标代码片段的逻辑视图。
navigator代表目标代码片段中使用th:fragment指定的名称。
视图名称
物理视图
能够将请求转发到目标页面时使用的完整路径。
/WEB-INF/view/hello.html
逻辑视图
物理视图=前缀+逻辑视图+后缀