JSTL (JSP 标准标签库)

在本JSTL教程中,我们将了解如何使用不同的JSTL标签可以使JSP编码更轻松。

Java中的JSTL是什么?

JSTL代表Java服务器页面标准标签库,它是一系列自定义JSP标签库,提供了常见的Web开发功能。JSTL是JSP的标准标签库。

JSTL的优点

以下是JSTL的优点

  1. 标准标签:它提供了JSP页面的丰富便携功能。开发人员很容易理解代码。
  2. 代码整洁:由于脚本会使开发人员感到困惑,因此使用JSTL可以使代码整洁。
  3. 自动JavaBeans内省支持:JSTL相对于JSP脚本具有优势。JSTL表达式语言可以轻松处理JavaBean代码。我们不需要对作为作用域属性检索的对象进行向下转换。使用JSP脚本代码会很复杂,而JSTL简化了此过程。
  4. 易于人类阅读:JSTL基于XML,与HTML非常相似。因此,开发人员很容易理解。
  5. 易于计算机理解Dreamweaver和FrontPage等工具正在生成越来越多的HTML代码。HTML工具在格式化HTML代码方面做得很好。HTML代码与脚本代码混合在一起。由于JSTL被表达为XML兼容标签,因此HTML生成器很容易解析文档中的JSTL代码。

JSTL标签

核心标签是JSP中最常用的标签。它们提供对以下内容的支持

  • 迭代
  • 条件逻辑
  • 捕获异常
  • url转发
  • 重定向等。

要使用核心标签,我们需要先定义标签库,以下是包含标签库的语法。

语法

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

此处,

  • 前缀可用于定义所有核心标签,并且
  • URI是导入它的taglib库

让我们详细看看一些核心标签,

1. Out

  • 表达式的结果显示在out标签中
  • 它可以直接转义XML标签。因此,它们不会被评估为实际标签

语法

<c:out value="" default="" escapeXML="">
  • 其中value表示输出信息,是必需的
  • default是输出信息失败,不是必需的
  • escapeXML – 如果它转义XML字符,则为true。

示例

Coretag_jsp1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP1</title>
</head>
<body>

</body>
</html>

代码解释

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”。因此,它可以作为所有核心标签的前缀。

代码第12行:这里我们使用前缀为“c”的核心标签out,这个out将打印表达式标签中的值。因此,输出将是name

当您执行上述代码时,您会得到以下输出

JSTL Core Tags - Out

输出

  • 我们从核心标签“out”中获取name值,它将打印在输出流中。

2. Catch

  • 它会捕获主体中发生的任何可抛出异常并显示为输出。
  • 它用于处理错误并捕获它们。

语法

<c:catchvar="">

其中var代表变量名,它将持有可抛出异常。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP2</title>
</head>
<body>
<c:catch var="guruException">
   <% int num = 10/0; %>
</c:catch>
The Exception is : ${guruException} 
</body>
</html>

代码解释

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。

代码第11-13行:核心标签catch用于捕获异常并打印异常。这里抛出的异常是10/0,该异常的名称是“guruException”。

代码第14行:我们打印“guruException”。

当您执行代码时,您将获得以下输出

JSTL Core Tags - Catch

输出

  • 我们获得了算术异常“/ by zero”,并通过变量“guruException”打印在输出中。

3. Import

  • 我们可以像在JSP include action中所做的那样,将另一个文件内容导入到JSP页面中。
  • 在这里,我们也可以包含URL,内容将显示在该页面上。

语法

<c:importvar="" uri="">

这里var是一个标识符变量名,它将持有文件名/URI。uri是相对文件名或URI名称。

coretag_jsp31.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP 31</title>
</head>
<body>
<c:import var="displayfile" url="coretag_jsp32.jsp">
</c:import>
<c:out value="${displayfile}"/>
</body>
</html>

Coretag_jsp32.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a>The file is diplayed after importing</a>
</body>
</html>

代码解释

Coretag_jsp31.jsp

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。

代码第11-12行:这里我们使用import标签将coretag_jsp32.jsp文件导入到此文件中。

代码第13行:这里我们使用out标签打印coretag_jsp32.jsp文件。

当您执行上述代码时,您将获得以下输出。

JSTL Core Tags - Import

输出

  • coretag_jsp32已打印在输出中,因为该文件已导入到coretag_jsp31.jsp中。

4. forEach

  • 它用于迭代一系列语句中的元素数量。
  • 它与Java的for循环相同。

语法

<c:forEach var="" begin=""  end="">
  • 这里var代表变量名,它将持有计数器名称。
  • begin代表计数器起始值。
  • end将代表其结束值。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP4</title>
</head>
<body>
<c:forEach var="gurucount" begin="5" end="10">
 <c:out value="${gurucount}"/>
</c:forEach>
</body>
</html>

代码解释

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。

代码第11-13行:这里我们使用“forEach”循环,变量名为“gurucount”,计数从5开始到10结束。我们打印变量gurucount,它包含从5到10的数字。

当您执行代码时,您将获得以下输出。

JSTL Core Tags - forEach

输出

  • 我们得到的输出是从5到10。

5. If

  • 它用于测试条件。
  • 如果标签用于测试条件是否为真,则基于此将执行代码块。

语法

<c:if test="${condition}></c:if>

如果条件为真,则执行一系列语句。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP5</title>
</head>
<body>
<c:set var="count" value="100"/>
<c:if test="${count == 100}">
   <c:out value="The count is 100"/>
</c:if>
</body>
</html>

代码解释

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。

代码第11行:这里我们将变量设置为名为count,值为100。

代码第12-14行:这里我们使用“if条件”,检查count是否等于100。如果等于100,则输出为“The count is 100。”

当您执行上述代码时,您会得到以下输出

JSTL Core Tags - If

输出

  • 由于“if”条件为真,我们得到的输出是“The count is 100”。

6. redirect

  • 它用于通过提供此标签的相对URL来将当前页面重定向到另一个URL。
  • 它支持上下文相对URL。

语法

<c:redirect url="" context=""/>

这里url是需要重定向到的相对URL,以及本地Web应用程序的上下文名称。

示例

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Core Tag JSP6</title>
</head>
<body>
<c:redirect url="/"/>
</body>
</html>

代码解释

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。

代码第11行:这里我们使用“redirect标签”,指定了urlname,当我们点击该页面时,它会重定向到为redirect指定的站点。

当您执行上述代码时,您将获得以下输出;

JSTL Core Tags - Redirect

输出

  • 我们得到的输出是guru99.com URL,它由coretag_jsp6.jsp重定向。

JSTL自定义标签

  • 它是一个用户定义的JSP语言元素。
  • 当JSP被翻译成servlet时,自定义标签被转换成一个操作对象的类,称为标签处理器。
  • 当servlet执行时,这些操作会被Web容器调用。
  • 要创建用户定义的自定义标签,我们需要创建一个继承SimpleTagSupport的标签处理器,并必须重写doTag()方法。
  • 我们需要创建TLD,其中需要将类文件映射到TLD。

JSP中自定义标签的优点

以下是JSP中自定义标签的优点。

  • 可移植性:标签库中描述的操作必须可以在任何JSP容器中使用。
  • 简单:不精通的用户必须能够理解和使用此机制。JSP功能供应商必须能够轻松地将其作为操作提供给用户。
  • 表达性:该机制必须支持广泛的操作,包括嵌套操作、操作体内的脚本元素、脚本变量的创建、使用和更新。
  • 可从不同的脚本语言使用:尽管JSP规范目前仅定义了Java编程语言脚本的语义,但我们希望为其他脚本语言留下可能性。
  • 基于现有的概念和机制:我们不希望重新发明已有的东西。此外,只要我们能够预测,就希望避免未来的冲突。

语法

假设我们正在创建testGuru标签,并且可以使用taghandlertestTag类,它将重写doTag()方法。

<ex:testGuru/>
Class testTag extends SimpleTagSupport{ public void doTag()}

此外,我们还需要将testTag类映射到TLD(标签库描述符),因为JSP容器会自动创建类文件与TLD中提到的URI之间的映射。

JSP标签接口

  • 此类必须继承SimpleTagSupport类。
  • 此类必须重写doTag()方法,该方法是SimpleTagSupport类的一部分(重写是从父类继承的方法)。
  • 该接口是JSPTag接口的子接口。
  • 它提供了在标签开始和结束时执行的方法。
  • 此外,我们还需要将此类映射到TLD,即标签库描述符。

我们在下面的示例中考虑

标签接口的方法

  • doTag()是我们必须重写的方法,其中包含标签的内容。
  • 它使用getJSPContext()获取当前的JSP上下文。

示例

Customtag_jsp1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Custom Tag</title>
</head>
<body>
<ex:guruTag/>
</body>
</html>

Custom.tld

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Test TLD</short-name>
  <tag>
    <name>guruTag</name>
    <tag-class>demotest.guruTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

guruTag.java(TagHandler)

package demotest;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class guruTag extends SimpleTagSupport{
	public void doTag() throws JspException,IOException
	{
		JspWriter out = getJspContext().getOut();
		out.println("Guru Tag");
	}

}

代码解释

guruTag.java(TagHandler)

代码第6行:guruTag类继承了javax.servlet.JSP jar中的SimpleTagSupport类。

代码第7行:这里我们重写了doTag()方法,它抛出JspException和IOException。

代码第9-10行:在此方法中,将嵌入将要调用的自定义标签的代码。我们获取JspWriter对象,它将打印“Guru Tag”。

Custom.tld

代码第6行:这里自定义标签的名称是“guruTag”。

代码第7行:Tag类是taghandlerclass,即guruTag.java。它需要处理文件的完整路径,包括文件的位置目录路径。

Customtag_jsp1.jsp

代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“ex”,因此它可以作为所有核心标签的前缀,URI是custom.tld,它映射了标签处理器。

代码第11行:这里我们定义了自定义标签“guruTag”,它将调用处理器的doTag()方法,并且其中的代码将被执行。

当您执行上述代码时,您会得到以下输出

JSP Tag Interface

输出

  • 我们从guruTag.java(即TagHandler)获得了“GuruTag”的输出,它重写了doTag()方法,并以“Guru Tag”作为输出。

摘要

  • 在本节中,我们学习了JSP标准标签库,其中包含了核心标签和自定义标签。
  • 核心标签包括for、if、redirect、import、catch标签,这些标签在JSP中用于基本目的。
  • 此外,我们还学习了自定义标签,您可以在其中定义标签并在JSP中使用它们。