JSTL(JSP 标准标签库)

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

JSTL 是什么 Java?

日本科技大学 代表 Java 服务器页面标准标记库,它是自定义 JSP 标记库的集合,提供常见的 Web 开发功能。JSTL 是 JSP 的标准标记库。

JSTL 的优势

以下是 JSTL 的优点:

  1. 标准标签:它提供了丰富的 JSP 页面可移植功能层。开发人员可以轻松理解代码。
  2. 代码整洁:由于 scriplet 会让开发人员感到困惑,因此使用 JSTL 可以使代码变得整洁干净。
  3. 自动表 JavabeansInterospection 支持:它比 JSP scriptlet 具有 JSTL 的优势。JSTL 表达式语言处理 JavaBean 代码非常容易。我们不需要向下转换已检索为作用域属性的对象。使用 JSP scriptlet 代码会很复杂,而 JSTL 简化了这一目的。
  4. 更易于人类阅读:JSTL 基于 XML,与 HTML 非常相似。因此,开发人员很容易理解。
  5. 更容易让计算机理解:工具如 Dreamweaver 和首页正在生成越来越多的 HTML 代码。HTML 工具在格式化 HTML 代码方面做得非常出色。HTML 代码与 scriplet 代码混合在一起。由于 JSTL 以符合 XML 规范的标签形式表达,因此 HTML 生成很容易解析文档中的 JSTL 代码。

JSTL 标签

核心标签是 JSP 中最常用的标签。它们支持

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

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

句法 :

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

在这里,

  • 前缀可用于定义所有核心标签和
  • uri 是从中导入的 taglib 库

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

1.出

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

语法:

<c:out value="" default="" escapeXML="">
  • 这里的值代表输出的信息,是强制性的
  • 默认为不输出信息,不强制
  • escapeXML – 如果转义 XML 字符,则为真。

示例:

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: 所有标签都需要此标签库前缀,添加的前缀为“c”。因此,它可以用作所有核心标签的前缀。

代码行12: 这里我们使用带有前缀“c”的 coretag out,此 out 将打印表达式标签中的值。因此,输出将是名称

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

JSTL 核心标签 - 输出

输出:

  • 我们从核心标签“out”中获取值作为名称,并将其打印在输出流中。

2. 抓住

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

语法:

<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: 所有标签都需要此标签库前缀,添加的前缀为“c”,因此它可以用作所有核心标签的前缀

代码行11-13: Coretag catch 用于捕获异常并打印异常。此处在 10/0 时引发异常,该异常名为“guruException”。

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

执行代码时,您将得到以下输出:

JSTL 核心标签 - Catch

输出:

  • 我们得到了算术异常 /by zero,并使用变量“guruException”将其打印在输出中

3.进口

  • 我们可以将另一个文件的内容导入到 JSP 页面中,就像我们在 JSP 包含操作.
  • 这里我们还可以包含 URL,内容将显示在该页面上。

语法:

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

这里 var 是一个变量名,它是一个标识符,它将保存文件名/uri。uri 是相对文件名或 uriname。

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: 所有标签都需要此标签库前缀,添加的前缀为“c”,因此它可以用作所有核心标签的前缀

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

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

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

JSTL 核心标签 - 导入

输出:

  • 由于该文件是在 coretag_jsp32.jsp 中导入的,因此输出中打印了 Coretag_jsp31。

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: 所有标签都需要此标签库前缀,添加的前缀为“c”,因此它可以用作所有核心标签的前缀

代码行11-13: 这里我们使用“forEach”循环,其中变量名称是“gurucount”,其开始计数为 5,结束计数为 10。我们正在打印变量 gurucount,其数字从 5 到 10。

执行代码时,你会得到以下输出

JSTL 核心标签 - forEach

输出:

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

5。 如果

  • 它用于 测试 条件。
  • 如果使用标签来测试某个条件是否为真,那么就会执行代码块。

语法:

<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: 所有标签都需要此标签库前缀,添加的前缀为“c”,因此它可以用作所有核心标签的前缀

代码行11: 这里我们将名为 count 的变量设置为 100

代码行12-14: 这里我们使用“if 条件”,检查计数是否等于 100。如果等于 100,那么我们得到的输出为“计数为 100”。

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

JSTL 核心标签 - If

输出:

  • 由于“if”条件为真,我们得到的输出为“计数为 100”。

6. 重定向

  • 它用于通过提供此标签的相对 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: 所有标签都需要此标签库前缀,添加的前缀为“c”,因此它可以用作所有核心标签的前缀

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

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

JSTL 核心标签 - 重定向

输出:

  • 我们得到了由 coretag_jsp99.jsp 重定向的输出 guru6.com url

JSTL 自定义标签

  • 它是用户定义的 JSP 语言元素。
  • 当 JSP 被转换成 servlet 时,自定义标签被转换成对对象采取行动的类,并被称为标签处理程序。
  • 执行 servlet 时的操作由 Web 容器调用。
  • 要创建用户定义的自定义标签,我们需要创建扩展 SimpleTagSupport 的标签处理程序并必须重写 doTag() 方法。
  • 我们需要创建TLD,我们需要在T​​LD中映射类文件。

JSP 中自定义标签的优点

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

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

语法:

考虑我们正在创建 testGuru 标签,我们可以使用taghandlertestTag 类,它将覆盖 doTag() 方法。

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

此外,我们还必须在 TLD(标签库 Descript或者)因为 JSP 容器会自动创建类文件和 TLD 文件中提到的 uri 之间的映射。

JSP 标记接口

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

我们正在考虑下面的例子

标签接口方法

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

示例:

自定义标签_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>

自定义.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(标签处理程序)

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(标签处理程序)

代码行6:guruTag 类扩展了 javax.servlet.JSP jar 中的 SimpleTagSupport 类

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

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

自定义.tld

代码行6: 此处自定义标签的名称是“guruTag”。

代码行7:标签类是 taghandlerclass,即 guruTag.java。它采用处理程序文件的完整路径,其中包括文件位置的目录路径。

自定义标签_jsp1.jsp

代码行 3:所有标签都需要此 taglib 前缀,添加的前缀为“ex”,因此它可以用作所有核心标签的前缀,而 uri 是映射标签处理程序的 custom.tld。

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

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

JSP 标记接口

输出:

  • 我们从 guruTag.java 即 TagHandler 中获得输出“GuruTag”,它覆盖 doTag() 方法并将“Guru Tag”打印为输出。

总结

  • 在本节中,我们了解了 JSP 标准标签库,其中有核心标签和自定义标签。
  • 核心标签包括for、if、redirect、import、catch标签,这些都是JSP中用于基本用途的标签。
  • 此外,我们还制作了自定义标签,可以在其中定义标签并在 JSP 中使用它