模板引擎详解

                                                                                             

                                   📑打牌 : 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 {@Overrideprotected 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();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");// get 方法返回一个初始页面, 并且在服务器中存一个随机数// 1. 构造随机数, 并清空 counttoGuess = 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);}@Overrideprotected 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.mzph.cn/news/184262.shtml

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

相关文章

盘点68个Android系统源码安卓爱好者不容错过

盘点68个Android系统源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 源码下载链接&#xff1a;https://pan.baidu.com/s/1FcBxCe7KpJsh0zFxNZ_7wg?pwd8888 提取码&#xff1a;8888 项目名称 Android …

外贸B2B自建站怎么建?做海洋建站的方法?

如何搭建外贸B2B自建站&#xff1f;外贸独立站建站方法有哪些&#xff1f; 对于许多初次涉足者来说&#xff0c;搭建一个成功的外贸B2B自建站并不是一件轻松的任务。海洋建站将为您详细介绍如何有效地建设外贸B2B自建站&#xff0c;让您的国际贸易之路更加畅通无阻。 外贸B2B…

Android中使用Google Map

在app的使用过程中&#xff0c;我们经常会跟地图进行交互&#xff0c;如果是海外的应用&#xff0c;那选择使用Google Map 是最合适的选择。 在Android中如何使用Google Map&#xff0c;这里做一个简要的说明。 Google API_KEY的申请 Google Map 的使用并不是免费的&#xf…

主播岗位面试

一、自我介绍 在面试的开始阶段&#xff0c;你需要准备一个简洁而有力的自我介绍。这个自我介绍应该包括你的姓名、教育背景、工作经验以及你为何对这个主播职位感兴趣。这个自我介绍应该控制在1-2分钟之内&#xff0c;避免冗长的表述。 二、主播经历和特点 在这个环节&…

javaagent字节码增强浅尝

概述 javaagent 技术广泛应用于对代码的增强&#xff0c;比如统计方法执行时间、GC 信息打印、分布式链路跟踪等&#xff1b;实现方式包括 javassist 和 bytebuddy&#xff0c;bytebuddy 是对 javassist 的改进&#xff1b;类似于 spring 中的 AOP&#xff1b; Instrumentati…

京东数据运营-京东数据平台-京东店铺数据分析-2023年10月京东烘干机品牌销售榜

鲸参谋监测的京东平台10月份烘干机市场销售数据已出炉&#xff01; 10月份&#xff0c;烘干机市场整体销售上涨。鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台上烘干机的销量将近5万件&#xff0c;环比增长约77%&#xff0c;同比增长约22%&#xff1b;销售额将近…

XUbuntu22.04之OBS强大录屏工具(一百九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

NX/UG二次开发—踩坑(边上点与面上点)

获取视图内遮挡面时&#xff0c;特别是与视图平行的面认为是可视面&#xff0c;但NX选择认为是非可视面&#xff0c;设计方案时只检查边上的点&#xff0c;发现一些面显示干涉遮挡&#xff0c;通过打印数据发现&#xff0c;以边上点为参考&#xff0c;获取面上点&#xff0c;会…

kubernetes(K8s)(Namespace、Pod、Deployment、Service资源的基本操作)-04

Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相的…

leetcode 18. 四数之和(优质解法)

代码&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;Arrays.sort(nums);for(int i0;i<length-4;){for(int ji1;j<lengt…

第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)

目录 1.相不相等 1.1 题目要求 1.2 题目分析 1.3 源代码 2.三行情书 2.1 题目要求 2.2 题目分析 2.3 源代码 3.电影院在线订票 3.1 题目要求 3.2 题目分析 3.3 源代码 4.老虎坤&#xff08;不然违规发不出来&#xff09; 4.1 题目要求 4.2 题目分析 4.3 源代码 …

宝塔环境备份到西部数码FSS

1、登陆宝塔面板-软件商店-第三方应用&#xff0c; 搜索ftp&#xff1a;找到FTP存储空间&#xff0c;点击安装 2、在软件商城-已安装&#xff0c;找到ftp存储空间&#xff0c;点击进入选项设置. 3、按照下图填写fss相关参数.这些信息可以在fss详情中查看.目录路径如果没有请先在…

CSS伪类伪元素?:hover,::before,::after使用(举例)

文章目录 什么是CSS伪类&#xff1f;什么是伪元素&#xff1f;怎么用伪元素&#xff1f;可以做些什么&#xff1f;::before&#xff0c;在标签选择器之前添加内容&#xff0c;::after正好与之相反::before&#xff0c;在类选择器之前添加内容&#xff08;:制作一个悬浮提示窗 参…

ROM和RAM概念

一、存储器特性 1&#xff09;易失性&#xff1a;掉电数据会丢失&#xff0c;通常指RAM&#xff1b; RAM分为SRAM、DRAM SRAM&#xff1a;静态RAM&#xff0c;只要上电数据就不会丢失&#xff1b; DRAM&#xff1a;动态RAM&#xff0c;需要每隔一段事件刷新数据&#xff0c;否…

宽量程双计数器测量方法

如要测量计数器信号的数字频率或周期&#xff0c;可使用双计数器方法测量宽量程信号。该方法适于待测量信号的范围较广且整个范围都需要较高测量精度的情况。关于使用宽量程测量方法提高测量精度的详细信息&#xff0c;见量化误差章节。也可使用该方法测量比计数器时基频率更高…

linux磁盘已满,查看哪个文件占用多

使用df -h查看磁盘空间占用情况 使用sudo du -s -h /* | sort -nr命令查看那个目录占用空间大 然后那个目录占用多 再通过sudo du -s -h /var/* | sort -nr 一层层排查&#xff0c;找到占用文件多的地方 如果通过以上方法没有找到问题所在&#xff0c;那么可以使用 lsof |…

UI自动化测试工具工作原理是怎样的?

随着软件开发的不断演进&#xff0c;保障软件质量成为了至关重要的一环。在这个过程中&#xff0c;UI自动化测试工具崭露头角&#xff0c;为开发团队提供了一种强有力的方式来确保应用程序的稳定性、功能性和兼容性。本文将深入探讨UI自动化测试工具的定义、工作原理以及其在提…

mybatis数据输入-零散的简单类型数据

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

拼图游戏制作

2.创建用户界面 package domain; /** * ClassName: User * Author: Kox * Data: 2023/2/2 * Sketch: */ public class User { private String username; private String password; public User() { } public User(String username, String p…