在 JSP 中循環遍歷地圖
1.概述
當我們在 Java Web 應用程式中建立 JSP 頁面時,我們經常會遇到需要遍歷Map
並在 UI 中顯示其內容的情況。
在本教程中,讓我們介紹實現此目的的兩種常用方法:使用 JSP 腳本和使用 JSP 標準標記庫 (JSTL)。
2.準備範例
在本教程中,我們將使用 Spring Boot 導航我們的 JSP 頁面。我們將使用一個簡單的電影清單作為範例,我們將了解如何在控制器中準備它,然後在 JSP 中渲染它:
@Controller
@RequestMapping("/map-demo")
public class MapDemoController {
private final static Map<String, String> movies = Map.of(
"M-01", "No Country for Old Men",
"M-02", "The Silence of the Lambs",
"M-03", "Back to the Future",
"M-04", "Gone with the Wind",
"M-05", "The Girl with the Dragon Tattoo"
);
@GetMapping("/using-scriptlets")
public String usingScriplets(Model model) {
model.addAttribute("movieMap", movies);
return "map-demo/using-scriptlets";
}
@GetMapping("/using-jstl")
public String usingJstl(Model model) {
model.addAttribute("movieMap", movies);
return "map-demo/using-jstl";
}
}
在MapDemoController
類別中,我們使用預先定義的Map
( movies
)作為資料來源並將其傳遞給 JSP。
為了簡單起見,我們將跳過 Spring MVC 的配置。接下來,讓我們看看如何在 JSP scriptlet 和 JSTL 中遍歷movies Map
。
3. 使用 JSP Scriptlet
使用 JSP scriptlets 是傳統方法,即將 Java 程式碼直接嵌入 JSP 頁面。我們先來看看using-scritlets.jsp
中的程式碼:
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Demo - Using Map in JSP (Scriptlets)</title>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
padding: 3px;
}
</style>
</head>
<body>
<div>Movies in the Map Object (Using JSP Scriptlets)</div>
<br/>
<% Map<String, String> movieMap = (Map<String, String>) request.getAttribute("movieMap");%>
<table>
<tr>
<th>Code</th>
<th>Movie Title</th>
</tr>
<%
if (movieMap != null) {
for (Map.Entry<String, String> entry : movieMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
%>
<tr>
<td>
<%= key %>
</td>
<td>
<%= value %>
</td>
</tr>
<% }
}%>
</table>
</body>
</html>
如我們所見,首先,我們從請求範圍中取得movieMap Map
。我們將此Map
儲存在movieMap
變數中,以便在 JSP 的其餘部分使用它。然後,我們利用增強的for
循環遍歷每個Map.Entry
,並提取鍵(電影代碼)和值(電影標題)。
此外,我們以 HTML 表格格式輸出資料以便於閱讀。
當我們在瀏覽器中導航到 JSP 時,電影數據將如預期顯示:
雖然這種方法有效,但我們應該注意,由於可維護性和關注點分離問題,現代 JSP 開發中通常不鼓勵使用腳本。
接下來,讓我們看看如何在 JSTL 中迭代Map
。
4.使用JSTL
JSTL 提供了一種更簡潔、基於標籤的方法來迭代集合(包括 Map)。我們先來看看using-jslt.jsp
的源碼:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Demo - Using Map in JSP (JSTL)</title>
<style> ... </style>
</head>
<body>
<div>Movies in the Map Object (Using JSTL)</div>
<br/>
<table>
<tr>
<th>Code</th>
<th>Movie Title</th>
</tr>
<c:forEach items="${movieMap}" var="entry">
<tr>
<td>
${entry.key}
</td>
<td>
${entry.value}
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
為了簡單起見,我們省略了上述程式碼中的樣式。接下來,我們來了解 JSTL 的實作方式。
首先,我們必須在 JSP 頂部匯入 JSTL 核心標籤庫:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
然後,我們用<c:forEach items=”${movieMap}” var=”entry”>
循環遍歷Map
:
-
items= “${movieMap}”
– 從請求範圍存取movieMap
對象 -
var= “entry”
– 每次迭代,JSTL 都會將目前的鍵值對儲存在變數entry
中。該entry
的行為類似 Java 中的Map.Entry
:它具有.key
和.value
屬性
現在,如果我們在瀏覽器中指向對應的URL,將會呈現以下頁面:
我們可以看到,JSTL 方法更加簡潔,並且將 Java 程式碼置於 JSP 之外,使我們的頁面更易於閱讀和維護。
5. 結論
在本文中,我們學習了在 JSP 中遍歷Map
的兩種方法:
- JSP Scriptlets – 賦予我們頁面中完整的 Java 控制權,但讓視圖層更難維護
- JSTL – 提供一種乾淨、宣告式的方式來迭代地圖,而無需將 Java 邏輯混合到 HTML 中。
在現代專案中,我們更喜歡使用 JSTL 來實現更好的關注點分離和更簡潔的模板。然而,了解這兩種方法可以確保我們在建置可維護的新程式碼庫的同時,也能使用舊的程式碼庫。
與往常一樣,範例的完整原始程式碼可在 GitHub 上找到。