訪問 Thymeleaf 中的會話屬性
1. 概述
在這篇短文中,我們將學習如何使用 Thymeleaf 庫訪問服務器端的 HTTP 會話。考慮到這一目的,我們將構建一個網頁,其中包含一個用於發送名稱分析請求的表單和一個用於顯示結果的部分,最後是一個包含會話期間啟動的所有請求的面板。
為了簡化起見,該示例將使用 Spring + Thymeleaf ,
因此我們將使用Thymeleaf Spring Standard
dialect 。
2. Thymeleaf 中的 Web 會話屬性
會話信息位於 servlet 上下文內部,我們可以在模板級別或 Spring Boot 控制器內部訪問該信息。現在,我們將檢查兩種訪問會話信息的方法。
2.1.訪問 Thymeleaf 模板中的會話屬性
在 Thymeleaf 中,
我們有兩個始終可用的基礎對象: ctx
和locale
,它們以“#”為前綴。 #ctx
基礎對象提供對包含 HTTP 會話信息的 servlet 上下文的訪問。因此,在模板中,我們可以使用以下表達式訪問會話:
#ctx.session
如果我們想以更短的方式訪問會話,我們可以使用變量session
,因此前面的命令相當於:
session
現在,讓我們檢查一下我們可以對模板中的會話實例做什麼和不能做什麼。首先,我們可以獲取會話中存在多少個屬性:
${#ctx.session.size()}
另外,我們可以檢查會話是否為空:
${#ctx.session.isEmpty()}
我們無法使用模板中的containsKey
方法檢查屬性是否在會話中註冊:
${#ctx.session.containsKey('lastAnalysis')}
此方法將始終返回true
,因此我們應該檢查 session 屬性是否為 null :
${#ctx.session.lastAnalysis}==null
最後,我們可以訪問會話屬性:
${#ctx.session.foo}
2.2.訪問 Spring Boot 控制器中的會話屬性
在控制器內部,Thymeleaf 的IWebSession
接口定義了我們訪問會話信息的方法:
public interface IWebSession {
public boolean exists();
public boolean containsAttribute(String name);
public int getAttributeCount();
public Set<String> getAllAttributeNames();
public Map<String,Object> getAttributeMap();
public Object getAttributeValue(String name);
public void setAttributeValue(String name,Object value);
public void removeAttribute(String name);
}
在我們的示例中,我們將了解如何獲取IWebSession
接口的實例,並且我們將使用它來刪除、獲取和設置它的屬性,因此我們不會使用該接口中的整個方法,但它應該足以展示如何使用它。
從最後開始, IServletWebExchange
將提供IWebSession
實例。我們使用HttpServletRequest
和使用webApp
屬性在NameAnalysisController
控制器請求中接收到的HttpServletResponse
構建IServletWebExchange
的實例。
讓我們看一下getIWebSession
方法:
private IWebSession getIWebSession(HttpServletRequest request, HttpServletResponse response) {
IServletWebExchange exchange = webApp.buildExchange(request, response);
return exchange == null ? null : exchange.getSession();
}
現在,讓我們看看webApp
屬性的類型以及它是如何實例化的:
private JakartaServletWebApplication webApp;
@Autowired
public NameAnalysisController(NameAnalysisService nameAnalysisService, SessionNameRequestFactory sessionNameRequestFactory, ServletContext servletContext) {
super();
...
this.webApp = JakartaServletWebApplication.buildApplication(servletContext);
}
在這裡,我們可以看到webApp
屬性是使用注入的ServletContext
實例構建的JakartaServletWebApplication
實例。至此,我們已準備好訪問會話信息的一切。
3. 項目設置
讓我們回顧一下我們的項目設置。這是一個具有兩個依賴項的 Maven 項目。第一個spring-boot-starter-web
將使用 Spring Boot 導入 Web 項目所需的所有內容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二個spring-boot-starter-thymeleaf
將導入所有內容以支持將 Thymeleaf 與 Spring Boot 一起使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring.boot.starter.thymeleaf}</version>
</dependency>
3.1. Thymeleaf 引擎配置
spring-boot-starter-thymeleaf
依賴項將為我們配置所有內容,但在我們的示例中,讓我們對SpringResourceTemplateResolver進行一些調整以設置模板模式、模板前綴和模板後綴:
@Autowired
public SpringWebConfig(SpringResourceTemplateResolver templateResolver) {
super();
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
}
通過這些更改,解析器將通過添加前綴/WEB-INF/templates/
和後綴.html.
因此,對URL
的以下請求:
http://localhost:8080/name-analysis.html
轉化為如下模板路徑:
WEB-INF/templates/name-analysis.html
4. 運行示例
要檢查一切是否正在運行並正在進行,讓我們從項目根目錄的命令行執行以下 Maven 命令:
mvn spring-boot:run
該命令將啟動 Tomcat 服務器並嵌入該應用程序。服務器偵聽端口 8080 並在根上下文中發布示例的應用程序。因此,訪問基頁的 URL 為:
http://localhost:8080
該請求將顯示:
在這裡,我們可以看到示例的三個不同部分。我們將從Analyze name
面板開始。它無權訪問任何會話信息。它使用公開的nameRequest
模型屬性。
我們繼續使用Name analyzed
面板,該面板顯示使用會話中的lastRequest
屬性進行名稱分析請求的結果。最後,最後一個面板Requests History
面板還將訪問存儲在會話的requests
屬性中的信息。
5. 結論
在本文中,我們了解瞭如何配置 Maven 項目以使用 Spring + Thymeleaf 。最重要的是,我們重點關注如何從 Thymeleaf 模板和 Spring Boot 服務器端訪問 HTTP 會話信息。要深入挖掘並了解 Thymeleaf 如何從頭開始工作,請閱讀 Spring 中使用 Thymeleaf 簡介。
與往常一樣,此示例的完整代碼可在 GitHub 上獲取。