JSTL 教程,JSTL 標籤範例

JSTL 代表 JSP 標準標籤庫。JSTL 是提供標籤以控制 JSP 頁面行為的標準標籤庫。JSTL 標籤可用於迭代和控制語句、國際化、SQL 等。在這個 JSTL 教程中,我們將詳細介紹 JSTL 標籤。之前我們看到如何使用 JSP ELJSP 動作標籤 來編寫類似 HTML 的 JSP 代碼,但它們的功能非常有限。例如,我們無法使用 EL 或動作元素遍歷集合,也無法逃避 HTML 標籤以在客戶端像文本一樣顯示它們。這就是 JSTL 標籤派上用場的地方,因為我們可以從 JSTL 標籤中做更多事情。

JSTL

JSTL 是 Java EE API 的一部分,並且包含在大多數 servlet 容器中。但是要在我們的 JSP 頁面中使用 JSTL,我們需要下載適用於您的 servlet 容器的 JSTL jars。大多數情況下,您可以在服務器下載的示例項目中找到它們,並且您可以使用它們。您需要將這些庫包含在您的 Web 應用程序項目WEB-INF/lib 目錄中。

JSTL jars

JSTL jars 是特定於容器的,例如在 Tomcat 中,我們需要在項目構建路徑中包含jstl.jarstandard.jar jar 檔案。如果它們不在容器 lib 目錄中,您應該將它們包含到您的應用程序中。如果您有 Maven 項目,則應在pom.xml 文件中添加以下依賴項,否則您將在 JSP 頁面中收到以下錯誤 – eclipse 找不到 "https://java.sun.com/jsp/jstl/ core" 的標籤庫描述符

<dependency>
	<groupId>jstl</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>taglibs</groupId>
	<artifactId>standard</artifactId>
	<version>1.1.2</version>
</dependency>

JSTL Tags

根據 JSTL 函數,它們分為五類。

  1. JSTL Core Tags: JSTL Core 標籤提供迴圈、條件邏輯、捕捉例外、URL、轉發或重定向響應等支援。要使用 JSTL Core 標籤,我們應在 JSP 頁面中包含它,如下所示。

    <%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
    

    在本文中,我們將深入研究重要的 JSTL Core 標籤。

  2. JSTL Formatting 和 Localisation 標籤: JSTL Formatting 標籤用於格式化數字、日期和通過語言區域和資源包提供的 i18n 支援。我們可以使用以下語法在 JSP 中包含這些 jstl 標籤:

    <%@ taglib uri="https://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    
  3. JSTL SQL 標籤: JSTL SQL 標籤提供與關聯式數據庫的交互支援,如 Oracle、MySql 等。使用 JSTL SQL 標籤,我們可以運行數據庫查詢,將這些 JSTL 標籤包含在 JSP 中的語法如下:

    <%@ taglib uri="https://java.sun.com/jsp/jstl/sql" prefix="sql" %>
    
  4. JSTL XML 標籤: JSTL XML 標籤用於處理 XML 文件,如解析 XML、轉換 XML 資料和評估 XPath 表達式。在 JSP 頁面中包含 JSTL XML 標籤的語法如下:

    <%@ taglib uri="https://java.sun.com/jsp/jstl/xml" prefix="x" %>
  5. JSTL Functions 標籤: JSTL 標籤提供一些可用於執行常見操作的函數,其中大多數是用於字串操作,如字串串聯、分割字串等。在 JSP 頁面中包含 JSTL 函數的語法如下:

    <%@ taglib uri="https://java.sun.com/jsp/jstl/functions" prefix="fn" %>

請注意,所有 JSTL 標準標籤的 URI 都以 https://java.sun.com/jsp/jstl/ 開頭,我們可以使用任何前綴,但最好使用上述定義的前綴,因為大家都使用它們,這樣就不會造成混淆。

JSTL核心標籤

JSTL核心標籤列於下表中。

JSTL Core Tag Description
<c:out> To write something in JSP page, we can use EL also with this tag
<c:import> Same as jsp:include or include directive
<c:redirect> redirect request to another resource
<c:set> To set the variable value in given scope.
<c:remove> To remove the variable from given scope
<c:catch> To catch the exception and wrap it into an object.
<c:if> Simple conditional logic, used with EL and we can use it to process the exception from <c:catch>
<c:choose> Simple conditional tag that establishes a context for mutually exclusive conditional operations, marked by <c:when> and <c:otherwise>
<c:when> Subtag of <c:choose> that includes its body if its condition evalutes to ‘true’.
<c:otherwise> Subtag of <c:choose> that includes its body if its condition evalutes to ‘false’.
<c:forEach> for iteration over a collection
<c:forTokens> for iteration over tokens separated by a delimiter.
<c:param> used with <c:import> to pass parameters
<c:url> to create a URL with optional query string parameters

JSTL教程

讓我們在一個簡單的Web應用程序中查看一些JSTL核心標籤的用法。我們的項目將包括一個Java Bean,我們將創建一個對象列表並設置一些屬性,這些屬性將用於JSP中。JSP頁面將展示如何遍歷集合,使用EL進行條件邏輯,以及一些其他常見的用法。

JSTL教程 – Java Bean類

package com.journaldev.model;

public class Employee {

	private int id;
	private String name;
	private String role;
	public Employee() {
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}

}

JSTL教程 – Servlet類

package com.journaldev.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.journaldev.model.Employee;

@WebServlet("/HomeServlet")
public class HomeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<Employee> empList = new ArrayList<Employee>();
		Employee emp1 = new Employee();
		emp1.setId(1); emp1.setName("Pankaj");emp1.setRole("Developer");
		Employee emp2 = new Employee();
		emp2.setId(2); emp2.setName("Meghna");emp2.setRole("Manager");
		empList.add(emp1);empList.add(emp2);
		request.setAttribute("empList", empList);
		
		request.setAttribute("htmlTagData", "<br/> creates a new line.");
		request.setAttribute("url", "https://www.journaldev.com");
		RequestDispatcher rd = getServletContext().getRequestDispatcher("/home.jsp");
		rd.forward(request, response);
	}

}

JSTL 教程 – JSP 頁面

home.jsp 代碼:

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Home Page</title>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<style>
table,th,td
{
border:1px solid black;
}
</style>
</head>
<body>
<%-- Using JSTL forEach and out to loop a list and display items in table --%>
<table>
<tbody>
<tr><th>ID</th><th>Name</th><th>Role</th></tr>
<c:forEach items="${requestScope.empList}" var="emp">
<tr><td><c:out value="${emp.id}"></c:out></td>
<td><c:out value="${emp.name}"></c:out></td>
<td><c:out value="${emp.role}"></c:out></td></tr>
</c:forEach>
</tbody>
</table>
<br><br>
<%-- simple c:if and c:out example with HTML escaping --%>
<c:if test="${requestScope.htmlTagData ne null }">
<c:out value="${requestScope.htmlTagData}" escapeXml="true"></c:out>
</c:if>
<br><br>
<%-- c:set example to set variable value --%>
<c:set var="id" value="5" scope="request"></c:set>
<c:out value="${requestScope.id }" ></c:out>
<br><br>
<%-- c:catch example --%>
<c:catch var ="exception">
   <% int x = 5/0;%>
</c:catch>

<c:if test = "${exception ne null}">
   <p>Exception is : ${exception} <br>
   Exception Message: ${exception.message}</p>
</c:if>
<br><br>
<%-- c:url example --%>
<a href="<c:url value="${requestScope.url }"></c:url>">JournalDev</a>
</body>
</html>

現在當我們使用 URL https://localhost:8080/JSTLExample/HomeServlet 執行應用程序時,我們會得到如下圖像所示的響應。 在上述 JSTL 示例中,我們使用 c:catch 來捕獲 JSP 服務方法內的異常,這與配置錯誤頁面的 JSP 異常處理 不同。 這就是 JSTL 標籤的快速總結和 JSTL 核心標籤用法示例。 參考資料:JSTL 維基百科頁面

Source:
https://www.digitalocean.com/community/tutorials/jstl-tutorial-jstl-tags-example