模板引擎

  • 1 关于动态页面的渲染
  • 2 非模板引擎的弊端
  • 3 模板引擎
    • 3.1 什么是模板引擎?
    • 3.2 Thymeleaf 语法
    • 3.3 模板引擎的使用
  • 4 总结

1 关于动态页面的渲染

渲染就是把数据和页面进行结合起来, 主要分为服务器渲染和客户端渲染两种方式. 如下图所示:

服务器渲染指的是数据和页面的结合工作由服务器来完成;
客户端渲染指的是服务器将数据返回给浏览器,由浏览器将数据和页面进行结合, 通常是用 ajax 进行交互.

2 非模板引擎的弊端

  简单说一下其弊端,例如用字符串来拼接一个 html 页面,如下所示:

@WebServlet("/html")
public class HtmlServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");String sex = req.getParameter("sex");String nickname = req.getParameter("nickname");resp.setContentType("text/html; charset=utf-8");resp.getWriter().write("<h3> name: " + name + "<h3>");resp.getWriter().write("<h3> sex: " + sex + "<h3>");resp.getWriter().write("<h3> nickname: " + nickname + "<h3>");}
}


通过 query string 来写入参数传过来后, 返回的页面中就包含了 query string 中的值.但是我们再看这段代码,非常简单地界面还可以,稍微复杂点的界面想要通过这种方式来实现就会特别麻烦,例如像 CSDN 我们点开的任何一个页面,于是就有了模板引擎的出现.

3 模板引擎

3.1 什么是模板引擎?

模板引擎指的是我们单独写一个固定的 html 页面, 这里写好之后就固定不动了, 然后不固定的,动态变化的字段使用特殊符号进行占位, 当程序跑起来后, 不固定的地方得以替换. 例如 印象笔记这个软件就有模板这个功能, 我们在使用这个模板的时候, 只需要往里面套文字即可, 大大减少了使用者的工作量, 非常便捷, 那么模板引擎就有这样的功能.

Java 模板引擎非常之多, 但大都大同小异, 这里我们以 Thymeleaf 为例进行简单演示使用流程.

3.2 Thymeleaf 语法

  • th:text : 在标签体中展示表达式求值结果的文本内容, 下面的代码中有示例;
  • th:each : 循环访问元素, 下面的代码中有示例;
  • th:[HTML 标签属] : 设置任意的 HTML 标签属性的值, 属性有很多,例如 href, src 等等;
  • th:if : 当表达式的结果为真时则显示内容, 否则不显示.

3.3 模板引擎的使用

  • 步骤一: 在 pom.xml 中引入依赖, 我们还是从中央仓库中查找;
  • 步骤二: 编写一个 html 模板文件,简单示例如下;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=\, initial-scale=1.0"><title>电话本</title>
</head>
<body><ul><li th:each="person : ${persons}"><span th:text="${person.name}"></span><span th:text="${person.phone}"></span></li></ul>
</body>
</html>

代码解读:
th: 就是 thymeleaf 的缩写, 指的是这个属性由 thymeleaf 来提供;
${person.name}: 这就是一个具体的变量, 也就是上文中所说的不固定的部分, 就可以实现动态的变换.

  • 步骤三: 初始化模板引擎
@WebListener
public class ThymeleafConfig implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {// 初始化 TemplateEngineServletContext context = servletContextEvent.getServletContext();// 1. 创建 engine 实例TemplateEngine engine = new TemplateEngine();// 2. 创建 resolver 实例ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(context);resolver.setPrefix("/WEB-INF/template/");resolver.setSuffix(".html");resolver.setCharacterEncoding("utf-8");// 将 engine 和 resolver 关联起来engine.setTemplateResolver(resolver);// 3. 把创建好的 engine 实例给放到 ServletContext 中context.setAttribute("engine",engine);System.out.println("TemplateEngine 初始化完毕!");}
}

代码解读:
@WebListener: 加这个目的是为了让 Tomcat 能够识别到这个类;
TemplateEngine: Template 模板的意思, Engine 引擎的意思; 这个类是 Thymeleaf 的核心类, 用于完成最终页面的渲染工作;
ServletContextTemplateResolver: 创建一个模板解析器对象, 搭配 ServletContext 来使用, 也就是将之前写好的 HTML 模板加载过来, 并告知 engine;



总之, ServletContext 创建的对象存在的意义就是多个 Servlet 之间能够共享数据; 关于 ServletContext 的使用如下:

  • void setAttribute(String name, Object obj): 设置属性(键值对);
  • Object getAttribute(String name): 根据属性名获取属性值, 如果那么不存在就返回 null;
  • void removeAttribute(String name): 删除对应的属性.
  • 步骤四: 编写 Servlet 代码;
class Person {public String name;public String phone;public Person(String name, String phone) {this.name = name;this.phone = phone;}
}@WebServlet("/each")
public class EachServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");List<Person> persons = new ArrayList<>();persons.add(new Person("Lee", "110"));persons.add(new Person("Mee", "111"));persons.add(new Person("Nee", "112"));WebContext webContext = new WebContext(req,resp,getServletContext());webContext.setVariable("persons", persons);// 初始化模板引擎TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");String html = engine.process("thymeleafEach", webContext);resp.getWriter().write(html);}
}

代码解读:
WebContext: WebContext 对象里面主要包含要渲染的变量有哪些, 以及变量的值是什么; 就是一个键值对结构, 目的是将 ${persons} 与 java 中的 persons 关联起来, 将模板中的 persons 变量渲染成 persons 的值; 也就是将 HTML 模板中的变量和 java 代码中的变量给关联起来;
engine.process(“thymeleafEach”, webContext):

  • 步骤五: 运行结果:

4 总结

总结 模板引擎 的使用流程:

  • 1 先编写 HTML 模板并放到指定目录中;
  • 2 初始化模板引擎
    2.1: 创建 Context 对象;
    2.2: 创建 TemplateEngine 实例;
    2.3:创建 ServletContextTemplateResolver 实例;
    2.4: 关联 engine 和 resolver;
    2.5: 将创建好的 engine 实例放到 Context 对象中;
  • 3 创建 Servlet 类并编写相关代码
    3.1: WebContext 使得 HTML 模板中的变量与 Servlet 中的变量进行关联;
    3.2: 初始化操作;
    3.3: TemplateEngine 中的 process 方法来进行渲染.

Java 基础系列(十六) --- Java中模板引擎的使用相关推荐

  1. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  2. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  3. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  4. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. employee.java,Java基础系列(六):对象与类(上)

    概述 类(class)是构造对象的模板.由类构造对象的过程称为创建类的实例. 封装从形式上看,封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.对象中的数据称为实例域,而操纵数据 ...

  6. Marco's Java【SpringBoot入门(六) 之 Thymeleaf模板引擎的使用】

    前言 本节呢给大家介绍一个新鲜 "玩意儿" 叫做Thymeleaf,Thymeleaf翻译过来就是 "百里香叶" 的意思 我发现这些大佬儿特别喜欢用叶子作为标识 ...

  7. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

  8. Java学习系列(十九)Java面向对象之数据库编程

    JDBC(Java Data Base Connectivity:java数据库连接):它定义了一组标准的操作数据库的接口,既然是接口,那它就是一种规范,是Java操作数据库的技术规范. Java数据 ...

  9. Java 基础系列(十) --- 什么是向上转型和向下转型

    1 向上转型 1.1 为何叫向上转型  在面向对象程序设计中,针对一些复杂的场景,我们通常画一个UML图来表示各个类之间的关系,通常父类画在子类的上方,因此我们就称之为"向上转型" ...

最新文章

  1. java 深拷贝 流_(转)Java技巧:深拷贝的两种方式
  2. “中文版GPT-3”来了:会算术、可续写红楼梦,用64张V100训练了3周
  3. 全职宝妈跨专业备考信息系统项目管理师【52,52,51】
  4. java插件技术_idea 好用的java插件
  5. Kubernetes要成为一个企业友好平台,到底还缺啥?
  6. 自己制作精美的App Store 软件截屏
  7. Leetcode每日一题:44.wildcard-matching(通配符匹配)
  8. 【深度学习】什么是深度学习-1
  9. (六)6.6 Neurons Networks PCA
  10. git拉取github上的分支和本地分支提交到github
  11. 虚拟服务器建网站苹果cms,零基础搭建苹果cmsv10影视站教程
  12. 王者荣耀ai视频战报ai剪辑生成方法
  13. win7计算机怎么录屏,win7电脑怎么录屏,什么电脑录屏软件好用?
  14. 印象笔记如何与微信连接到服务器,如何保存微信和微博到印象笔记?
  15. 7-4 统计素数并求和
  16. Java中动态代理使用与原理详解
  17. 广数工业机器人五点法_盘点:国产工业机器人“四小龙”新业绩经营情况
  18. 【计算机组成与结构】中央处理器
  19. 服务器中java项目调用Kettle转换脚本ktr
  20. Android 反编译利器,jadx 的高级技巧

热门文章

  1. Git、GitHub搭建及使用
  2. GBase 8c 产品运行环境
  3. 万象2004日期补丁
  4. 智能优化算法:正余弦优化算法-附代码
  5. 数据库JDBC包装实现
  6. 最近看到BillBord排行第一的歌曲Viva La Vida,很喜欢,推荐一下。^_^
  7. Moto Razr3什么时候发布 Moto Razr3配置如何
  8. 推荐优美的Pyqt/Pyside界面模板
  9. 全国计算机二级vb 文库,全国计算机等级考试二级VB基础教程电子教案.ppt
  10. springboot 多数据源配置,postgresql+mysql为例