Thymeleaf
thymeleaf的使用
逻辑视图
物理视图=视图前缀+逻辑视图+视图后缀
例子:
| 视图前缀 | 逻辑视图 | 视图后缀 | 物理视图 |
|---|---|---|---|
| /pages/user/ | login | .html | /pages/user/login.html |
| /pages/user/ | login_success | .html | /pages/user/login_success.html |
使用步骤
- 加入jar包
所需jar的连接 https://files.cnblogs.com/files/blogs/715820/libs.rar
-
配置上下文参数
<!-- 在上下文参数中配置视图前缀和视图后缀 --> <context-param> <param-name>view-prefix</param-name> <param-value>/WEB-INF/view/</param-value> </context-param> <context-param> <param-name>view-suffix</param-name> <param-value>.html</param-value> </context-param> -
创建Servlet基类
直接复制,以后框架后,这些代码会被取代
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.WebContext; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ViewBaseServlet extends HttpServlet { private TemplateEngine templateEngine; @Override public void init() throws ServletException { // 1.获取ServletContext对象 ServletContext servletContext = this.getServletContext(); // 2.创建Thymeleaf解析器对象 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); // 3.给解析器对象设置参数 // ①HTML是默认模式,明确设置是为了代码更容易理解 templateResolver.setTemplateMode(TemplateMode.HTML); // ②设置前缀 String viewPrefix = servletContext.getInitParameter("view-prefix"); templateResolver.setPrefix(viewPrefix); // ③设置后缀 String viewSuffix = servletContext.getInitParameter("view-suffix"); templateResolver.setSuffix(viewSuffix); // ④设置缓存过期时间(毫秒) templateResolver.setCacheTTLMs(60000L); // ⑤设置是否缓存 templateResolver.setCacheable(true); // ⑥设置服务器端编码方式 templateResolver.setCharacterEncoding("utf-8"); // 4.创建模板引擎对象 templateEngine = new TemplateEngine(); // 5.给模板引擎对象设置模板解析器 templateEngine.setTemplateResolver(templateResolver); } protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException { // 1.设置响应体内容类型和字符集 resp.setContentType("text/html;charset=UTF-8"); // 2.创建WebContext对象 WebContext webContext = new WebContext(req, resp, getServletContext()); // 3.处理模板数据 templateEngine.process(templateName, webContext, resp.getWriter()); } }在html标签中添加命名空间 xmlns:th="http://www.thymeleaf.org"
注意将网页模版放在WEB-INF目录下
为什么要放在WEB-INF目录下?原因:WEB-INF目录不允许浏览器直接访问,所以我们的视图模板文件放在这个目录下,是一种保护。以免外界可以随意访问视图模板文件。
访问WEB-INF目录下的页面,都必须通过Servlet转发过来,简单说就是:不经过Servlet访问不了。
这样就方便我们在Servlet中检查当前用户是否有权限访问。
那放在WEB-INF目录下之后,重定向进不去怎么办?
重定向到Servlet,再通过Servlet转发到WEB-INF下。
第二章 Thymeleaf的基本语法
-
th:text="标签体新值"
- 不经过服务器解析,直接用浏览器打开HTML文件,看到的是『标签体原始值』
- 经过服务器解析,Thymeleaf引擎根据th:text属性指定的『标签体新值』去替换『标签体原始值』
-
修改指定属性值
-
例子
<input type="text" name="username" th:value="文本框新值" value="文本框旧值" /> -
语法:任何HTML标签原有的属性,前面加上『th:』就都可以通过Thymeleaf来设定新值。
-
-
解析url地址
-
所以@{}的作用是为字符串附加『上下文路径』
- 作用很大
-
-
获取请求参数
-
$
-
<p th:text="${param.username}">这里替换为请求参数的值</p>
-
-
内置对象
-
内置对象在Thymeleaf中可以直接使用
-
![]()
-
使用方法:在表达式中 #内置对象.方法
-
如果不清楚这个对象有哪些方法可以使用,那么就通过getClass().getName()获取全类名,再回到Java环境查看这个对象有哪些方法
-
内置对象的方法可以直接调用
-
调用方法时需要传参的也可以直接传入参数
-
-
Object-Graph Navigation Language
-
概念:从根对象触发,通过特定的语法,逐层访问对象的各种属性。
-
在Thymeleaf环境下,${}中的表达式可以从下列元素开始:
- 访问属性域的起点
- 请求域的属性名
- session
- application
- param
- 内置对象
- request
- session
- lists
- strings
- 访问属性域的起点
-
属性访问语法
- 访问对象属性 对象.属性名
- 访问list集合或者数组 集合或数组[下标]
- 访问Map集合
- Map集合['key']
- Map集合.key
-
分支与迭代
- if和unless 根据条件决定对象是否显示
- 例子:th:if="${book.isUsed}"
- 例子:th:unless="${book.isUsed}"
- if和unless 根据条件决定对象是否显示
-
switch
<h3>测试switch</h3> <div th:switch="${user.memberLevel}"> <p th:case="level-1">银牌会员</p> <p th:case="level-2">金牌会员</p> <p th:case="level-3">白金会员</p> <p th:case="level-4">钻石会员</p> </div> -
迭代
-
用法:使用th:each遍历
用法:- th:each写在什么标签上? 每次遍历出来一条数据就要添加一个什么标签,那么th:each就写在这个标签上
- th:each的语法 th:each="遍历出来的数据,数据的状态 : 要遍历的数据"
- status表示遍历的状态,它包含如下属性:
index 遍历出来的每一个元素的下标
count 遍历出来的每一个元素的计数
-
例子 :
<table> <tbody <tr th:each="teacher,status : ${teacherList}"> <td th:text="${status.count}">这里显示编号</td> <td th:text="${teacher.teacherName}">这里显示老师的名字</td> </tr> </tbody> </table> -
!注意:这里只有each所在标签的子标签才能使用each中获取的对象的属性和状态·(status.count/status.index)
-
-

浙公网安备 33010602011771号