当前位置: 首页 > news >正文

基于原生Servlet使用模板引擎Thymeleaf访问界面

我们常在Spring Boot项目中使用Thymeleaf模板引擎,今天突发奇想,尝试原生Servlet访问!

说做就做

搭建完整的WEB项目

其中的大部分依赖都是后续报错 追加进来的

在这里插入图片描述

导入依赖 thymeleaf-3.0.11.RELEASE.jar
在这里插入图片描述

第一次访问

访问地址: http://localhost:8080/ThymeleafTest/test

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

classNotFoundException异常通常是由于虚拟机(例如Java虚拟机)无法找到所需的类而引起的。这种情况可能发生在以下几种情况下:

  1. 缺少类文件:如果要加载的类文件不存在或不可访问,就会抛出ClassNotFoundException异常。请确保类文件存在于正确的位置,并且具有正确的权限。

  2. 类路径问题:虚拟机通过类路径来查找类文件。如果类路径配置不正确,虚拟机就无法找到所需的类。请检查类路径设置,并确保包含所需类的路径。

  3. 类名错误:还可能是由于类名错误导致的。请确保使用完整的类名(包括包名)来引用类,并且拼写没有错误。

  4. 类加载器问题:在某些情况下,自定义的类加载器可能无法找到所需的类。请确保使用正确的类加载器加载所需的类。

总结起来,ClassNotFoundException异常主要是由于缺少类文件、类路径配置问题、类名错误或类加载器问题引起的。


解决方案

目前预计缺少了相关依赖 ,总之少了谁就去maven中下载谁

第二次访问

加入slf4j-api-2.0.7.jar slf4j-log4j12-1.7.25

java.lang.NoClassDefFoundError: 
Could not initialize class org.thymeleaf.templateresolver.ServletContextTemplateResolver

第三次访问

java.lang.ClassNotFoundException: ognl.PropertyAccessor

此时可以访问指定Servlet

在这里插入图片描述

ognl.PropertyAccessor 异常是由于 OGNL(Object-Graph Navigation Language)表达式无法访问或操作指定对象的属性而引发的。OGNL 是一种用于在 Java 中访问对象属性的表达式语言。

通常,这种异常的原因可能是以下几种情况之一:

  1. 属性不存在:如果尝试访问的属性在对象中不存在,那么 OGNL 将引发此异常。请确保属性名称正确且存在于对象中。

  2. 访问权限限制:如果属性具有私有或受保护的访问修饰符,并且没有提供相应的访问方法(getter/setter),那么 OGNL 将无法访问该属性。在这种情况下,您可以尝试添加 getter 和 setter 方法,或者使用其他方法来访问该属性。

  3. 对象为空:如果尝试操作的对象为 null,那么 OGNL 将引发此异常。在使用 OGNL 之前,请确保对象不为空。

  4. OGNL 表达式错误:如果提供的 OGNL 表达式存在语法错误或不正确的格式,那么 OGNL 将无法解析它并引发异常。请仔细检查您的 OGNL 表达式是否正确。

第四次访问

加入ognl-3.1.12.jar

java.lang.NoClassDefFoundError: Could not initialize class ognl.OgnlRuntime

Could not initialize class ognl.OgnlRuntime 异常通常发生在使用 OGNL(Object-Graph Navigation Language)表达式语言时。它表示无法初始化 OGNL 运行时类。

Could not initialize class ognl.OgnlRuntime 异常的产生原因可能有以下几种:

  1. 缺少 OGNL 库:确保项目中包含了正确的 OGNL 库。如果使用 Maven 等构建工具,可以检查项目的依赖配置。
  2. 版本不匹配:如果项目依赖的 OGNL 版本与其他依赖项冲突,可能会导致初始化异常。需要确保版本兼容性,并解决依赖冲突。
  3. 类路径问题:如果运行时无法找到 OGNL 的类或配置文件,可能会导致初始化异常。检查类路径配置,并确认相关文件是否存在于正确的位置。
  4. 其他原因:除了上述原因外,还可能是由于环境配置、类加载顺序等因素导致的初始化异常。可以尝试重启应用程序或重新部署相关组件,以解决潜在的配置问题。

第五次访问

切换OGNL 版本 ognl-3.0.6.jar

java.lang.ClassNotFoundException: javassist.ClassPool

ClassNotFoundException: javassist.ClassPool 的原因是在运行时找不到 javassist.ClassPool 类。

这可能是由以下几种情况引起的:

  1. 缺少相关的依赖库:javassist 是一个字节码操作库,如果你的项目中没有正确引入 javassist 的相关依赖库,就会导致找不到该类。你可以通过在项目中添加正确的依赖来解决这个问题,比如使用 Maven 或 Gradle 来管理依赖。

  2. 依赖版本不兼容:如果你的项目中使用的 javassist 版本与其他依赖库存在冲突,也可能导致找不到该类。你可以尝试升级或降级 javassist 的版本,或者解决其他依赖库的版本冲突。

  3. 类路径配置错误:如果你的项目中没有正确配置类路径,虽然你已经添加了正确的依赖,但 JVM 仍然无法找到该类。你可以检查你的类路径配置是否正确,并确保 javassist 类所在的 JAR 文件或目录已经包含在类路径中。

  4. 编译错误:如果你是在运行程序时出现该异常,而不是在编译时,那么有可能是因为你的代码在编译时找不到 javassist 类。这可能是因为你在编译时没有包含 javassist 的相关依赖或者编译选项配置错误。你可以检查你的编译配置,并确保 javassist 的依赖被正确引入。

第六次访问

加入javassist-3.29.2-GA.jar

java.lang.ClassNotFoundException: org.attoparser.IMarkupParser
  • org.attoparser.IMarkupParser是一个解析器接口,它定义了在解析HTML、XML或其他标记语言时所需的方法。具体来说,它提供了解析标记文本的能力,并将其转换为相应的数据结构或事件。
  • IMarkupParser的主要作用是将标记文本转换为可供程序处理的结构化数据,以便进一步的处理或展示。

通过实现IMarkupParser接口,开发人员可以自定义标记解析器以满足特定的需求。这个接口定义了一系列方法,如startElement、endElement、characters等,用于处理标记的开始、结束以及标记中的字符内容。

第七次访问

加入attoparser-2.0.7.RELEASE.jar

java.lang.ClassNotFoundException: org.unbescape.html.HtmlEscape

在这里插入图片描述
终于看到一丝希望

org.unbescape.html.HtmlEscape 是一个 Java 库,它提供了用于转义 HTML 字符实体的方法。在编写 Web 应用程序时,我们经常需要将特殊字符(如<, >, &, ", ’等)转义为对应的 HTML 实体,以确保这些字符在网页上正确显示,而不会被解释为 HTML 代码。HtmlEscape 类提供了一组静态方法,用于将文本中的特殊字符转义为对应的 HTML 实体,以便在 HTML 页面中正确显示。这个库是为了方便开发人员处理 HTML 相关操作而设计的。

第八次访问

加入attoparser-2.0.7.RELEASE.jar

在这里插入图片描述

拨开云雾见天日,守得云开见月明


项目源码请参考下方

  • web.xml配置
	<!-- 在上下文参数中配置视图前缀和视图后缀 --><!-- ①添加thymeleaf的jar包  ②在web.xml文件中添加配置 --><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>
  • index.html界面放在webapp目录下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><a href="test">初步测试Thymeleaf</a>
</body>
</html>
  • hello.html 界面放在/WEB-INF/view/目录下
<!-- 我们需要使用thymeleaf,需要在html文件中导入我们的命名空间约束,方便提示。 官方文档的#3中看一下把命名空间拿过来 -->
<html xmlns:th="http://www.thymeleaf.org"><head><title>目标界面</title></head><body><!-- 在界面展示数据 --><h1 th:text="${festival}">这里要显示一个动态的festival</h1><!--th:text 表示转义 --><div th:text="${msg}"> hello thymeleaf</div><!--th:utext 表示不转义 --><div th:utext="${msg}"> hello thymeleaf</div><hr><!--遍历集--><!--th:each每次遍历都会生成当前这个标签:官网--><h2 th:each="users:${user}" th:text="${users}"></h2><!--行列写法 不建议--><!--<h2 th:each="users:${user}">[[ ${users} ]] </h2>--></body>
</html>
  • ViewBaseServlet.java 视图解析器
package com.yc.thymeleaf.controller;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;/*** 在HTML页面上,加载Java内存中的数据的过程我们称为渲染(render);thymeleaf是用来帮助视图渲染的技术。* company 源辰信息* @author 梦凝哲雪* @date 2023年8月21日* @version 1.0* Email 1198865589@qq.com*/
public class ViewBaseServlet extends HttpServlet {private static final long serialVersionUID = 1L;private TemplateEngine templateEngine;@Overridepublic 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");resp.setCharacterEncoding("utf-8");// 2.创建WebContext对象 创建Thymeleaf的上下文对象,此对象用来存储数据WebContext webContext = new WebContext(req, resp, getServletContext());// 3.处理模板数据templateEngine.process(templateName, webContext, resp.getWriter());}
}
  • HelloWorldController.java 请求交互的控制层
package com.yc.thymeleaf.controller;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.thymeleaf.context.WebContext;@WebServlet("/test")
public class HelloWorldController extends ViewBaseServlet{private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(666);// 请求中设计相关参数request.setAttribute("festival","七夕快乐");request.setAttribute("msg", "<h1>first  thymeleaf page!!</h1>");request.setAttribute("users",  List.of("张三", "李四", "王五", "赵六"));// 请求转发跳转到/WEB-INF/view/target.htmlprocessTemplate("hello", request, response);}
}
  • 最终效果

在这里插入图片描述

相关文章:

基于原生Servlet使用模板引擎Thymeleaf访问界面

我们常在Spring Boot项目中使用Thymeleaf模板引擎,今天突发奇想&#xff0c;尝试原生Servlet访问&#xff01; 说做就做 搭建完整的WEB项目 其中的大部分依赖都是后续报错 追加进来的 导入依赖 thymeleaf-3.0.11.RELEASE.jar 第一次访问 访问地址: http://localhost:8080…...

【C语言】15-函数-1

1. 初步认识函数 通过前几章的学习,已经可以编写一些简单的 C 语言程序了,但是如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数(main函数)中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。此外,有时程序中要多次实现某一功能就需要…...

08-信息收集-架构、搭建、WAF等

信息收集-架构、搭建、WAF等 信息收集-架构、搭建、WAF等一、前言说明二、CMS识别技术三、源码获取技术四、架构信息获取技术五、站点搭建分析1、搭建习惯-目录型站点2、搭建习惯-端口类站点3、搭建习惯-子域名站点4、搭建习惯-类似域名站点5、搭建习惯-旁注&#xff0c;c段站点…...

Qt --- 显示相关设置 窗口属性等

主界面&#xff0c;窗口 最小化 最大化 关闭按钮、显示状态自定义&#xff1a; setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::WindowCloseButtonHint); //只要关闭按钮 setWindowFlags(Qt::WindowFlags type) Qt::FrameWindowHint:没有边框的窗口 Qt::Window…...

使用小程序实现左侧菜单,右侧列表双向联动效果

目录 引言理解双向联动效果的重要性scrollview属性介绍实现左侧菜单数据准备渲染菜单列表监听菜单点击事件实现右侧列表数据结构设计初始数据渲染监听列表滚动事件左侧菜单与右侧列表联动获取当前滚动位置计算对应菜单项联动效果优化用户体验考虑平滑滚动效果菜单高亮状态...

selenium中处理验证码问题

验证码 基本作用&#xff1a;可以实现当前访问页面的数据安全性、还可以减少用户的并发数&#xff1b; 类型&#xff1a;1、纯数字、纯字母&#xff1b;2、汉字组合&#xff1b;3、数学运算题&#xff1b;4、滑动&#xff1b;5、图片&#xff08;选不同的、选相同、成语顺序&…...

EMR电子病历系统 SaaS电子病历编辑器源码 电子病历模板编辑器

EMR&#xff08;Electronic Medical Record&#xff09;指的是电子病历。它是一种基于电子文档的个人医疗记录&#xff0c;可以包括病人的病史、诊断、治疗方案、药物处方、检查报告和护理计划等信息。EMR采用计算机化的方式来存储、管理和共享这些信息&#xff0c;以便医生和医…...

一些自定义hooks

文章目录 1、点击框外隐藏弹窗hook 1、点击框外隐藏弹窗hook **描述&#xff1a;**有一个需要自己封装弹窗的组件&#xff0c;实现点击弹窗框外时隐藏弹窗 代码&#xff1a; import { useEffect } from “react”; // 点击框外hooks import { useEffect } from "react&q…...

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…...

lEC 61068-2-14_2023环境试验.第2-14部分:试验.试验N:温度变化, 最新版发布

https://download.csdn.net/download/m0_67373485/88251313 lEC 61068-2-14_2023环境试验.第2-14部分:试验.试验N:温度变化 A change of temperature test is intended to determine the effect on the specimen of a changeof temperature or a succession of changes of tem…...

CFDEM学习笔记

本文用来记录自己学习CFDEM的笔记。 资料总结 虚拟机&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1MPMTJQfl76mW0H5bbT_rAg 提取码&#xff1a;rqli 开机密码&#xff1a;530944988 知乎博客&#xff1a;作者说明了如何关闭颗粒碰撞计算来达到提升计算速度。 Githu…...

SpringBoot入门篇1 - 简介和工程创建

目录 SpringBoot是由Pivotal团队提供的全新框架&#xff0c; 其设计目的是用来简化Spring应用的初始搭建以及开发过程。 1.创建入门工程案例 ①创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②开发控制器类 controller/BookController.jav…...

MyBatis-Plus updateById不更新null值

文章目录 前言方式一 调整全局的验证策略方式二 调整字段验证注解方式三 使用 UpdateWrapper 前言 在 MyBatis-Plus 中&#xff0c;使用updateById&#xff0c;null字段并不会更新&#xff0c;其实是和更新的策略有关&#xff0c;当然&#xff0c;也有插入策略&#xff0c;本文…...

用pytorch实现AlexNet

AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出&#xff0c;发表在NIPS&#xff0c;论文名为《ImageNet Classification with Deep Convolutional Neural Networks》&#xff0c;论文见&#xff1a;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…...

LeetCode560.和为k的子数组

这道题我用的是暴力法&#xff0c;当然也是不断的提交不断发现问题改出来的&#xff0c;比如我之前是算到和大于目标值就break&#xff0c;其实不行因为后面还可以有负数&#xff0c;我把break删了。后面和为目标之后就答案1然后break然后下一次遍历&#xff0c;测试用例中就出…...

echarts 的dataZoom滑块两端文字被遮挡

问题&#xff1a; 期望&#xff1a; 解决方案&#xff1a; 1&#xff1a;调整宽度&#xff08;4版本的没有width属性&#xff09; 2. 参考&#xff1a;echarts图标设置dataZoom拖拽时间轴时自动调整两侧文字的位置_datazoom 位置_乌栖曲的博客-CSDN博客 设置文字的定位 cons…...

MongoDB基本使用

在 MongoDB 中我们可以使用use命令来创建数据库&#xff0c;如果该数据库不存在&#xff0c;则会创建一个新的数据库&#xff0c;如果该数据库已经存在&#xff0c;则将切换到该数据库。使用use命令创建数据库的语法格式如下&#xff1a; --use database_name use my_db1;数据…...

C++ 中的左值(Lvalues)和右值(Rvalues)

C 中有两种类型的表达式&#xff1a; 左值&#xff08;lvalue&#xff09;&#xff1a;左值参数是可被引用的数据对象&#xff0c;例如&#xff0c;变量、数组元素、结构成员、引用和解除引用的指针都是左值。非左值包括字面常量&#xff08;用引号起的字符串除外&#xff0c;…...

html流光按钮

出处bilibili猫咪爱狗 <!DOCTYPE html> <html><head><style>body {/*内容居中&#xff0c;背景色*/height: 100vh;display: flex;justify-content: center; align-items: center;background-color: #000;}a { /*水平垂直居中*/position: re…...

HAProxy+nginx搭建负载均衡群集

目录 一、常见的Web集群调度器 二、HAProxy群集介绍 1、Haproxy的特性 : 2、Haproxy常用的调度算法 ① 轮询调度&#xff08;Round Robin&#xff09; ② 最小连接数&#xff08;Least Connections&#xff09; ③ 基于来源访问调度算法&#xff08;Source Hashing&am…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...