• 【JavaWeb】-- thymeleaf视图模板技术


    什么是thymeleaf

    在html页面上加载java内存数据,这个过程称为渲染,thymeleaf是用来帮助我们做视图渲染的一个技术,当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示。

    thymeleaf特点

    • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。
    • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
    • 多方言支持:它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式;必要时,开发人员也可以扩展和创建自定义的方言。
    • 与 SpringBoot 完美整合:SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合。

    th属性

    Thymeleaf 还提供了大量的 th 属性,这些属性可以直接在 HTML 标签中使用,其中常用 th 属性及其示例如下表。

    属性描述示例
    th:id替换 HTML 的 id 属性
     
        
    th:text文本替换,转义特殊字符
     
        
    • hello

    th:utext文本替换,不转义特殊字符
     
        
    • 欢迎你
    th:object在父标签选择对象,子标签使用 *{…} 选择表达式选取值。
    没有选择对象,那子标签使用选择表达式和 ${…} 变量表达式是一样的效果。
    同时即使选择了对象,子标签仍然可以使用变量表达式。
     
        
    • firstname

    th:value替换 value 属性
     
        
    th:with局部变量赋值运算
     
        
    th:style设置样式
     
        
    • 编程帮 www.biancheng.net
    th:onclick点击事件
     
        
    th:each遍历,支持 Iterable、Map、数组等。
     
     
        
    th:if根据条件判断是否需要展示此标签
     
        
    th:unless和 th:if 判断相反,满足条件时不显示
     
        
    th:switch与 Java 的 switch case语句类似
    通常与 th:case 配合使用,根据不同的条件展示不同的内容
     
        
    • 编程帮
    • www.biancheng.net
    th:fragment模板布局,类似 JSP 的 tag,用来定义一段被引用或包含的模板片段
     
        
    • 插入的内容
    th:insert布局标签;
    将使用 th:fragment 属性指定的模板片段(包含标签)插入到当前标签中。
     
        
    th:replace布局标签;
    使用 th:fragment 属性指定的模板片段(包含标签)替换当前整个标签。
     
        
    th:selectedselect 选择框选中
     
        
    th:src替换 HTML 中的 src 属性 
     
        
    th:inline内联属性;
    该属性有 text、none、javascript 三种取值,
    th:action替换表单提交地址
     
        

    使用步骤

    1、添加thymeleaf的jar包

     2、新建Servlet类ViewBaseServlet

    1. package com.myssm.myspringmvc;
    2. import org.thymeleaf.TemplateEngine;
    3. import org.thymeleaf.context.WebContext;
    4. import org.thymeleaf.templatemode.TemplateMode;
    5. import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
    6. import javax.servlet.ServletContext;
    7. import javax.servlet.ServletException;
    8. import javax.servlet.http.HttpServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. import java.io.IOException;
    12. public class ViewBaseServlet extends HttpServlet {
    13. private TemplateEngine templateEngine;
    14. @Override
    15. public void init() throws ServletException {
    16. // 1.获取ServletContext对象
    17. ServletContext servletContext = this.getServletContext();
    18. // 2.创建Thymeleaf解析器对象
    19. ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
    20. // 3.给解析器对象设置参数
    21. // ①HTML是默认模式,明确设置是为了代码更容易理解
    22. templateResolver.setTemplateMode(TemplateMode.HTML);
    23. // ②设置前缀
    24. String viewPrefix = servletContext.getInitParameter("view-prefix");
    25. templateResolver.setPrefix(viewPrefix);
    26. // ③设置后缀
    27. String viewSuffix = servletContext.getInitParameter("view-suffix");
    28. templateResolver.setSuffix(viewSuffix);
    29. // ④设置缓存过期时间(毫秒)
    30. templateResolver.setCacheTTLMs(60000L);
    31. // ⑤设置是否缓存
    32. templateResolver.setCacheable(true);
    33. // ⑥设置服务器端编码方式
    34. templateResolver.setCharacterEncoding("utf-8");
    35. // 4.创建模板引擎对象
    36. templateEngine = new TemplateEngine();
    37. // 5.给模板引擎对象设置模板解析器
    38. templateEngine.setTemplateResolver(templateResolver);
    39. }
    40. protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
    41. // 1.设置响应体内容类型和字符集
    42. resp.setContentType("text/html;charset=UTF-8");
    43. // 2.创建WebContext对象
    44. WebContext webContext = new WebContext(req, resp, getServletContext());
    45. // 3.处理模板数据
    46. templateEngine.process(templateName, webContext, resp.getWriter());
    47. }
    48. }

    3、在web.xml文件中添加配置

    配置前缀 view-prefix

    配置后缀 view-suffix

    1. <context-param>
    2. <param-name>view-prefixparam-name>
    3. <param-value>/param-value>
    4. context-param>
    5. <context-param>
    6. <param-name>view-suffixparam-name>
    7. <param-value>.htmlparam-value>
    8. context-param>

    4、使Serlvet继承ViewBaseServlet

    public class IndexServlet extends ViewBaseServlet{.....}

    5、根据逻辑视图名称得到物理视图名称

    处理模板:processTemplate("xxx",request,response);

    此处视图名称是index;

    thymeleaf会将逻辑视图名称对应到物理视图名称上;

    逻辑视图名称:index;

    物理视图名称:view-prefix + 逻辑视图名称 + view-suffix(前面的xml配置文件中定义前后缀为/和.html)

    所以真实视图名称:/index.html

    例:

    1. package com.fruit.servlets;
    2. import com.fruit.dao.FruitDAO;
    3. import com.fruit.dao.impl.FruitDAOImpl;
    4. import com.fruit.pojo.Fruit;
    5. import com.myssm.myspringmvc.ViewBaseServlet;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.annotation.WebServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import javax.servlet.http.HttpSession;
    11. import java.io.IOException;
    12. import java.util.List;
    13. @WebServlet("/index")
    14. public class IndexServlet extends ViewBaseServlet {
    15. @Override
    16. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    17. FruitDAO fruitDAO = new FruitDAOImpl();
    18. List<Fruit> fruitList = fruitDAO.getFruitList();
    19. //保存到session作用域
    20. HttpSession session = request.getSession();
    21. session.setAttribute("fruitList",fruitList);
    22. //处理模板,第一个参数为视图名称,会对应物理视图名称
    23. super.processTemplate("index",request,response);
    24. }
    25. }

    6、编辑html文件

    示例:

    1. <html xmlns:th="http://www.thymeleaf.org">
    2. <head>
    3. <meta charset="utf-8">
    4. <link rel="stylesheet" href="css/index.css">
    5. <script language="JavaScript" src="js/index.js">script>
    6. head>
    7. <body>
    8. <div id="div_container">
    9. <div id="div_fruit_list">
    10. <p class="center f30">欢迎使用水果库存后台管理系统p>
    11. <div style="border:0px solid red;width:60%;margin-left:20%;text-align:right;">
    12. <a th:href="@{/add.html}" style="border:0px solid blue;margin-bottom:4px;">添加新库存记录a>
    13. div>
    14. <table id="tbl_fruit">
    15. <tr>
    16. <th class="w20">名称1th>
    17. <th class="w20">单价th>
    18. <th class="w20">库存th>
    19. <th>操作th>
    20. tr>
    21. <tr th:if="${#lists.isEmpty(session.fruitList)}">
    22. <td colspan="4">对不起,库存为空!td>
    23. tr>
    24. <tr th:unless="${#lists.isEmpty(session.fruitList)}" th:each="fruit : ${session.fruitList}">
    25. <td><a th:text="${fruit.fname}" th:href="@{/edit.do(fid=${fruit.fid})}">苹果a>td>
    26. <td th:text="${fruit.price}">5td>
    27. <td th:text="${fruit.fcount}">20td>
    28. <td><img src="imgs/del.jpg" class="delImg" th:onclick="|delFruit(${fruit.fid})|"/>td>
    29. tr>
    30. table>
    31. div>
    32. div>
    33. body>
    34. html>

  • 相关阅读:
    Spring bean的生命周期
    cubeIDE开发, stm32的WIFI通信设计(基于AT指令)
    物联网数据采集网关连接设备与云平台的关键桥梁
    Ubuntu20.04+RTX3090ti+cuda11.6+cudnn8.4.1+pytorch安装过程记录
    程序员如何优雅地解决线上问题?
    关于天地图新手使用
    前端基础建设与架构15 从编译到运行,跨端解析小程序多端方案
    统计耗时 System.currentTimeMillis()
    建造者模式 rust和java的实现
    基于SpringBoot的在线点餐系统【附源码】
  • 原文地址:https://blog.csdn.net/Tir_zhang/article/details/126167662