模板引擎详解

news2024/11/17 17:25:13

                                                                                             

                                   📑打牌 : da pai ge的个人主页
                                   🌤️个人专栏 : da pai ge的博客专栏
                                  ☁️宝剑锋从磨砺出,梅花香自苦寒来

🌤️动态页面的渲染方式

动态页面需要通过服务器根据客户端传来的参数 , 动态计算得到一些结果 , 并且把这些结果显示到页面上 .
所谓的 " 渲染 " (render) 就是把数据和页面结合起来 .

🌤️服务器渲染

数据和页面结合的工作 , 通过服务器完成 .

🌤️客户端渲染

服务器把数据返回给浏览器 , 由浏览器把数据和页面结合起来 .
浏览器和服务器之间的数据往往交互通过 ajax 进行 , 数据的格式往往使用 JSON.
之前咱们写的 带服务器的表白墙 , 就是通过客户端渲染实现的 .

🌤️字符串拼接 HTML

之前我们的代码中直接通过 resp.getWritter().write() 的方式 , 直接在参数中拼接一个 HTML 格式
的字符串 .
如果是返回一个简单的页面 , 可以按照上述方式拼接字符串完成 .
但是如果是一个复杂的页面呢 ? 我们通过一个简单的程序先初步感受一下 .

🌤️代码示例: 服务器版猜数字

之前我们实现的猜数字游戏 , 是一个纯粹的网页版本的程序 . 现在我们实现一个服务器版本的程序 .
创建 GuessNumServlet
其中的成员 toGuess 表示要猜的数字 , count 表示已经猜了的次数 .
doGet 方法用于处理游戏的初始化 . doPost 用于实现每一次 " " 的过程 .
服务器直接通过字符串拼接的方式构造 HTML, 返回给浏览器 .
@WebServlet("/html")
public class HtmlServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
       String name = (String) req.getParameter("name");
       resp.setContentType("text/html; charset=utf-8");
       resp.getWriter().write(String.format("<h3>name: %s</h3>", name));
  }
}
@WebServlet("/guessNum")
public class GuessNumServlet extends HttpServlet {
   // 要猜的数字
   private int toGuess = 0;
   // 已经猜了几次
    private int count = 0;
   private Random random = new Random();
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
       resp.setContentType("text/html; charset=utf-8");
       // get 方法返回一个初始页面, 并且在服务器中存一个随机数
       // 1. 构造随机数, 并清空 count
       toGuess = random.nextInt(100) + 1;
       System.out.println("toGuess = " + toGuess);
       count = 0;
       // 2. 返回页面内容
       String html = "<form action=\"guessNum\" method=\"GET\">\n" +
               "   <input type=\"submit\" value=\"重新开始游戏\">\n" +
               "</form>\n" +
               "\n" +
               "<form action=\"guessNum\" method=\"POST\">\n" +
               "   <input type=\"text\" name=\"num\">\n" +
               "   <input type=\"submit\" value=\"猜\">\n" +
               "</form>";
       resp.getWriter().write(html);
  }
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
       // post 方法处理猜数字的动作.
       resp.setContentType("text/html; charset=utf-8");
       // 1. 读取请求中用户猜的数字
       int num = Integer.parseInt(req.getParameter("num"));
       // 2. 比较大小
       String result = "";
       if (num < toGuess) {
           result = "猜低了";
      } else if (num > toGuess) {
           result = "猜高了";
      } else {
           result = "猜对了";
      }
       count++;
       // 3. 构造返回的页面内容
       String html = String.format("<form action=\"guessNum\"
method=\"GET\">\n" +
               "   <input type=\"submit\" value=\"重新开始游戏\">\n" +
               "</form>\n" +
               "\n" +
               "<form action=\"guessNum\" method=\"POST\">\n" +
               "   <input type=\"text\" name=\"num\">\n" +
               "   <input type=\"submit\" value=\"猜\">\n" +
               "</form>\n" +
               "\n" +
               "<div>已经猜了: %d 次</div>\n" +
               "<div>结果: %s </div>", count, result);
       resp.getWriter().write(html);
  }
}

在 字符串 中直接编写 HTML , 这个是非常麻烦的 ( 尤其是有很多转义字符 ). 可以在其他编辑器直接把
HTML 写好 , 然后复制粘贴进去 .
IDEA 会自动加入转义字符 .
部署程序 , 通过浏览器访问 http://127.0.0.1:8080/ServletHelloWorld/guessNum

🌤️小结:

在这个代码中我们可以看到 , 当前页面其实并不复杂 , 但是直接拼装字符串的方式却让代码非常臃肿 .
尤其是 HTML Java 代码混在一起 , 非常不利于开发维护 .

🌤️使用模板引擎

🌤️什么是模板引擎

<form action="guessNum" method="GET">
   <input type="submit" value="重新开始游戏">
</form>
<form action="guessNum" method="POST">
   <input type="text" name="num">
   <input type="submit" value="猜">
</form>
<div>已经猜了: 次</div>
<div>结果: </div>

模板引擎就是为了解决上面遇到的 , HTML Java 混在一起的问题 .
我们可以把 HTML 的内容提取出来 , 放到单独的文件中 , 称为 模板 .
对于一些 " 动态 " 的部分 , 比如猜数字的结果 , 猜数字的次数 , 这些可以内容在 模板 中使用 占位符 ( 一些特
殊的符号 ) 占位 , 当服务器把这些 " 动态 " 的部分计算好了之后 , 就可以把 模板 中的 占位符 替换成动态计
算的结果 , 然后把这个组装好的 HTML 格式的字符串再返回给浏览器 .
模板就类似于考试中的 " 填空题 " 一样 . 试卷上把一句话的一些核心信息挖掉 . 然后由考生填写其中
缺少的部分 . 不同的考生 , 就可能填出完全不同的内容 .
这些表情包其实都是通过 " 一个模板 " 来生成出来的 .
Java 中的模板引擎有很多 . JSP, FreeMarker, Velocity, XMLTemplate . 使用风格大同小异 .
荐的模板引擎 .
官网 : https://www.thymeleaf.org/
官方文档 : https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
快速入门 : https://www.thymeleaf.org/doc/articles/thymeleaf3migration.html

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

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

相关文章

2023-简单点-树莓派-camera module 3介绍

Raspberry Pi Camera Module 3 介绍开头先说&#xff0c;注意事项libcamera感光芯片和驱动的兼容图额外&#xff1a;不同module的对应的参数图用bullseye系统测试摄像头预览窗口拍摄静态图片bayer raw图像获取超长曝光视频流raw视频流 ref 介绍 树莓派镜像在Bullseye版本之后&…

【每日一题】1657. 确定两个字符串是否接近-2023.11.30

题目&#xff1a; 1657. 确定两个字符串是否接近 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的…

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃&#xff0c;语雀崩完淘宝崩&#xff0c;淘宝崩完滴滴崩&#xff0c;随着业务的发展和技术的进步&#xff0c;对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求&#xff0c;提高系统的稳定性和扩展性至关重要。…

华为云cce容器管理中的调度策略作用

研究不深&#xff0c;但是这个还是挺重要的&#xff0c;在这里记录一下。 在cce节点集群中&#xff0c;有时候会发现有的节点实例过于饱满&#xff0c;有的又有些空&#xff0c;导致部分节点由于压力过大&#xff0c;存在崩溃的危险&#xff0c;这时候调度策略就有用了。 我这…

new Date()国际化时间参数处理的存在偏差问题

[TOC](new Date()国际化时间参数处理的存在偏差问题) 实际存在场景&#xff1a;各国使用new Date进行处理时间到各国时区时处理后的日期与实际当地日期不符合&#xff0c;会存在以下场景如图&#xff1a; 统计日期和表头计算的日期不符合 点击某一天跳转到详情时间参数不正确 …

基于谷歌Flutter的媒体资讯APP的设计与实现

基于谷歌Flutter框架媒体资讯App的设计与实现 摘要&#xff1a; 当今社会&#xff0c;随着经济和科技的发展&#xff0c;人们的生活节奏也愈来愈快&#xff0c;人们生活的阅读时间也越来越少&#xff0c;越发的流行碎片化阅读&#xff0c;而同样的对于互联网的客户端开发者&am…

2.Ansible的copy模块,我最常用的模块

1. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…

数据结构树与二叉树(5)Huffman树

#include <iostream> #include <stack> #include <queue>using namespace std;struct Node {char name ;int code[200];int num 0;//code的下标int weight 0;//权重&#xff08;次数&#xff09;Node* lchild;//左孩子Node* rchild;//右孩子Node* parent;N…

获取Spring容器Bean工具类

获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式&#xff0c;可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…

基于卷积神经网络的人体行为识别系统开发与设计

摘 要 基于卷积神经网络的人体行为识别的开发与设计 摘要&#xff1a;随着计算机领域不断的创新、其它行业对计算机的应用需求的提高以及社会对解放劳动力的迫切&#xff0c;人机交互成为人们关注的问题。深度学习的出现帮助了人们实现人机交互&#xff0c;而卷积神经网络是其…

Codeforces Round 907 (Div. 2) (C 贪心 D套路? F dfs序+差分树状数组)

A&#xff1a; 这种操作题&#xff0c;每次先想这个操作有什么性质 对于2^0来说可以操作 第1位 对于2^1来说可以操作 第1-2位 对于2^2来说可以操作 第1-4位 &#xff08;第3位无法单独修改&#xff09; 对于2^3来说可以操作 第1-8位&#xff08;第5 6 7位无法单独修改&…

SAP ABAP ALV Tree 的使用

在 SAP 业务系统中&#xff0c;大量地使用到了ALV Tree 对象&#xff0c;该对象在表格基础上对同类数据 进行归类&#xff0c;并对各分类能进行数据汇总&#xff0c;如图8-10 所示。 以航班表&#xff08;SPFLI&#xff09;为例&#xff1a; &#xff08;1&#xff09;按国家…

面试题:Docker 有几种网络模式?很多5 年工作经验都答不上来。。

文章目录 docker容器网络docker的4种网络模式bridge模式container模式host模式none模式 docker容器网络配置Linux内核实现名称空间的创建ip netns命令 创建Network Namespace操作Network Namespace转移设备veth pair创建veth pair实现Network Namespace间通信 四种网络模式配置…

springboot启动开启热部署

springboot启动开启热部署 手动方式 或者点idea上面的build->build project 自动方式 勾上Build project automatically 然后ctrl alt shift / 选择Registr 勾上就好了 新版idea可以在这里选 热部署范围设置 这是spring-boot-devtools起的作用&#xff0c;所以还…

Rest模式和参数

展开运算符和Rest参数都是JavaScript中的语法特性&#xff0c;用于处理函数的参数。它们在使用方式和功能上有一些区别。 展开运算符用于将可迭代对象展开为独立的值&#xff0c;而Rest参数用于将多个参数收集到一个数组中。展开运算符可以用于多种上下文&#xff0c;而Rest参数…

代码浅析DLIO(三)---子图构建

0. 简介 我们刚刚了解过DLIO的整个流程&#xff0c;我们发现相比于Point-LIO而言&#xff0c;这个方法更适合我们去学习理解&#xff0c;同时官方给出的结果来看DLIO的结果明显好于现在的主流方法&#xff0c;当然指的一提的是&#xff0c;这个DLIO是必须需要六轴IMU的&#x…

three.js球体实现

作者&#xff1a;baekpcyyy&#x1f41f; 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…

C#文件流二进制文件的读写

目录 一、BinaryWriter类 二、BinaryReader类 三、示例 1.源码 2.生成效果 二进制文件的写入与读取主要是通过BinaryWriter类和BinaryReader类来实现的。 一、BinaryWriter类 BinaryWriter类以二进制形式将基元类型写入流&#xff0c;并支持用特定的编码写入字符串&#…

Linux环境搭建(Ubuntu22.04)+ 配置共享文件夹(Samba)

Linux开发环境准备 搭建Linux开发环境所需要的软件如下&#xff1a; VMware虚拟机&#xff1a;用于运行Linux操作系统的虚拟机软件之一&#xff0c;VMware下载安装在文章中不做说明&#xff0c;可自行百度谢谢Ubuntu光盘镜像&#xff1a;用于源代码编译&#xff0c;有闲置计算…

C#开发的OpenRA游戏之属性SelectionDecorations(14)

C#开发的OpenRA游戏之属性SelectionDecorations(14) 前面分析选择类时,还有一个功能,就是把选中物品的状态和生命值显示出来。 它是通过下面的函数来实现: protected override IEnumerable<IRenderable> RenderSelectionBars(Actor self, WorldRenderer wr, bool …