網(wǎng)站開發(fā)公司的選擇百色seo外包
我們常在Spring Boot
項目中使用Thymeleaf
模板引擎,今天突發(fā)奇想,嘗試原生Servlet
訪問!
說做就做
搭建完整的WEB項目
其中的大部分依賴都是后續(xù)報錯 追加進來的
導(dǎo)入依賴 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虛擬機)無法找到所需的類而引起的。這種情況可能發(fā)生在以下幾種情況下:
-
缺少類文件:如果要加載的類文件不存在或不可訪問,就會拋出
ClassNotFoundException
異常。請確保類文件存在于正確的位置,并且具有正確的權(quán)限。 -
類路徑問題:虛擬機通過類路徑來查找類文件。如果類路徑配置不正確,虛擬機就無法找到所需的類。請檢查類路徑設(shè)置,并確保包含所需類的路徑。
-
類名錯誤:還可能是由于類名錯誤導(dǎo)致的。請確保使用完整的類名(包括包名)來引用類,并且拼寫沒有錯誤。
-
類加載器問題:在某些情況下,自定義的類加載器可能無法找到所需的類。請確保使用正確的類加載器加載所需的類。
總結(jié)起來,ClassNotFoundException
異常主要是由于缺少類文件、類路徑配置問題、類名錯誤或類加載器問題引起的。
解決方案
目前預(yù)計缺少了相關(guān)依賴 ,總之少了誰就去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)
表達式無法訪問或操作指定對象的屬性而引發(fā)的。OGNL 是一種用于在 Java 中訪問對象屬性的表達式語言。
通常,這種異常的原因可能是以下幾種情況之一:
-
屬性不存在:如果嘗試訪問的屬性在對象中不存在,那么 OGNL 將引發(fā)此異常。請確保屬性名稱正確且存在于對象中。
-
訪問權(quán)限限制:如果屬性具有私有或受保護的訪問修飾符,并且沒有提供相應(yīng)的訪問方法(getter/setter),那么 OGNL 將無法訪問該屬性。在這種情況下,您可以嘗試添加 getter 和 setter 方法,或者使用其他方法來訪問該屬性。
-
對象為空:如果嘗試操作的對象為 null,那么 OGNL 將引發(fā)此異常。在使用 OGNL 之前,請確保對象不為空。
-
OGNL 表達式錯誤:如果提供的 OGNL 表達式存在語法錯誤或不正確的格式,那么 OGNL 將無法解析它并引發(fā)異常。請仔細檢查您的 OGNL 表達式是否正確。
第四次訪問
加入ognl-3.1.12.jar
java.lang.NoClassDefFoundError: Could not initialize class ognl.OgnlRuntime
Could not initialize class ognl.OgnlRuntime
異常通常發(fā)生在使用 OGNL(Object-Graph Navigation Language)表達式語言時。它表示無法初始化 OGNL 運行時類。
Could not initialize class ognl.OgnlRuntime 異常的產(chǎn)生原因可能有以下幾種:
- 缺少 OGNL 庫:確保項目中包含了正確的 OGNL 庫。如果使用 Maven 等構(gòu)建工具,可以檢查項目的依賴配置。
- 版本不匹配:如果項目依賴的 OGNL 版本與其他依賴項沖突,可能會導(dǎo)致初始化異常。需要確保版本兼容性,并解決依賴沖突。
- 類路徑問題:如果運行時無法找到 OGNL 的類或配置文件,可能會導(dǎo)致初始化異常。檢查類路徑配置,并確認相關(guān)文件是否存在于正確的位置。
- 其他原因:除了上述原因外,還可能是由于環(huán)境配置、類加載順序等因素導(dǎo)致的初始化異常??梢試L試重啟應(yīng)用程序或重新部署相關(guān)組件,以解決潛在的配置問題。
第五次訪問
切換OGNL 版本 ognl-3.0.6.jar
java.lang.ClassNotFoundException: javassist.ClassPool
ClassNotFoundException: javassist.ClassPool
的原因是在運行時找不到 javassist.ClassPool
類。
這可能是由以下幾種情況引起的:
-
缺少相關(guān)的依賴庫:javassist 是一個字節(jié)碼操作庫,如果你的項目中沒有正確引入 javassist 的相關(guān)依賴庫,就會導(dǎo)致找不到該類。你可以通過在項目中添加正確的依賴來解決這個問題,比如使用 Maven 或 Gradle 來管理依賴。
-
依賴版本不兼容:如果你的項目中使用的 javassist 版本與其他依賴庫存在沖突,也可能導(dǎo)致找不到該類。你可以嘗試升級或降級 javassist 的版本,或者解決其他依賴庫的版本沖突。
-
類路徑配置錯誤:如果你的項目中沒有正確配置類路徑,雖然你已經(jīng)添加了正確的依賴,但 JVM 仍然無法找到該類。你可以檢查你的類路徑配置是否正確,并確保 javassist 類所在的 JAR 文件或目錄已經(jīng)包含在類路徑中。
-
編譯錯誤:如果你是在運行程序時出現(xiàn)該異常,而不是在編譯時,那么有可能是因為你的代碼在編譯時找不到 javassist 類。這可能是因為你在編譯時沒有包含 javassist 的相關(guān)依賴或者編譯選項配置錯誤。你可以檢查你的編譯配置,并確保 javassist 的依賴被正確引入。
第六次訪問
加入javassist-3.29.2-GA.jar
java.lang.ClassNotFoundException: org.attoparser.IMarkupParser
org.attoparser.IMarkupParser
是一個解析器接口,它定義了在解析HTML、XML或其他標記語言時所需的方法。具體來說,它提供了解析標記文本的能力,并將其轉(zhuǎn)換為相應(yīng)的數(shù)據(jù)結(jié)構(gòu)或事件。- IMarkupParser的主要作用是將標記文本轉(zhuǎn)換為可供程序處理的結(jié)構(gòu)化數(shù)據(jù),以便進一步的處理或展示。
通過實現(xiàn)IMarkupParser接口,開發(fā)人員可以自定義標記解析器以滿足特定的需求。這個接口定義了一系列方法,如startElement、endElement、characters
等,用于處理標記的開始、結(jié)束以及標記中的字符內(nèi)容。
第七次訪問
加入attoparser-2.0.7.RELEASE.jar
java.lang.ClassNotFoundException: org.unbescape.html.HtmlEscape
終于看到一絲希望
org.unbescape.html.HtmlEscape
是一個 Java 庫,它提供了用于轉(zhuǎn)義 HTML 字符實體的方法。在編寫 Web 應(yīng)用程序時,我們經(jīng)常需要將特殊字符(如<, >, &, ", ’
等)轉(zhuǎn)義為對應(yīng)的 HTML 實體,以確保這些字符在網(wǎng)頁上正確顯示,而不會被解釋為 HTML 代碼。HtmlEscape 類提供了一組靜態(tài)方法,用于將文本中的特殊字符轉(zhuǎn)義為對應(yīng)的 HTML 實體,以便在 HTML 頁面中正確顯示。這個庫是為了方便開發(fā)人員處理 HTML 相關(guān)操作而設(shè)計的。
第八次訪問
加入attoparser-2.0.7.RELEASE.jar
撥開云霧見天日,守得云開見月明
項目源碼請參考下方
web.xml
配置
<!-- 在上下文參數(shù)中配置視圖前綴和視圖后綴 --><!-- ①添加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文件中導(dǎo)入我們的命名空間約束,方便提示。 官方文檔的#3中看一下把命名空間拿過來 -->
<html xmlns:th="http://www.thymeleaf.org"><head><title>目標界面</title></head><body><!-- 在界面展示數(shù)據(jù) --><h1 th:text="${festival}">這里要顯示一個動態(tài)的festival</h1><!--th:text 表示轉(zhuǎn)義 --><div th:text="${msg}"> hello thymeleaf</div><!--th:utext 表示不轉(zhuǎn)義 --><div th:utext="${msg}"> hello thymeleaf</div><hr><!--遍歷集--><!--th:each每次遍歷都會生成當(dāng)前這個標簽:官網(wǎng)--><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內(nèi)存中的數(shù)據(jù)的過程我們稱為渲染(render);thymeleaf是用來幫助視圖渲染的技術(shù)。* 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.創(chuàng)建Thymeleaf解析器對象ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);// 3.給解析器對象設(shè)置參數(shù)// ①HTML是默認模式,明確設(shè)置是為了代碼更容易理解templateResolver.setTemplateMode(TemplateMode.HTML);// ②設(shè)置前綴String viewPrefix = servletContext.getInitParameter("view-prefix");templateResolver.setPrefix(viewPrefix);// ③設(shè)置后綴String viewSuffix = servletContext.getInitParameter("view-suffix");templateResolver.setSuffix(viewSuffix);// ④設(shè)置緩存過期時間(毫秒)templateResolver.setCacheTTLMs(60000L);// ⑤設(shè)置是否緩存templateResolver.setCacheable(true);// ⑥設(shè)置服務(wù)器端編碼方式templateResolver.setCharacterEncoding("utf-8");// 4.創(chuàng)建模板引擎對象templateEngine = new TemplateEngine();// 5.給模板引擎對象設(shè)置模板解析器templateEngine.setTemplateResolver(templateResolver);}protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.設(shè)置響應(yīng)體內(nèi)容類型和字符集resp.setContentType("text/html;charset=UTF-8");resp.setCharacterEncoding("utf-8");// 2.創(chuàng)建WebContext對象 創(chuàng)建Thymeleaf的上下文對象,此對象用來存儲數(shù)據(jù)WebContext webContext = new WebContext(req, resp, getServletContext());// 3.處理模板數(shù)據(jù)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);// 請求中設(shè)計相關(guān)參數(shù)request.setAttribute("festival","七夕快樂");request.setAttribute("msg", "<h1>first thymeleaf page!!</h1>");request.setAttribute("users", List.of("張三", "李四", "王五", "趙六"));// 請求轉(zhuǎn)發(fā)跳轉(zhuǎn)到/WEB-INF/view/target.htmlprocessTemplate("hello", request, response);}
}
- 最終效果