JSTL(JSP 标准标签库)
在本 JSTL 教程中,我们将了解如何使用不同的 JSTL 标签使 JSP 编码更容易。
JSTL 是什么 Java?
日本科技大学 代表 Java 服务器页面标准标记库,它是自定义 JSP 标记库的集合,提供常见的 Web 开发功能。JSTL 是 JSP 的标准标记库。
JSTL 的优势
以下是 JSTL 的优点:
- 标准标签:它提供了丰富的 JSP 页面可移植功能层。开发人员可以轻松理解代码。
- 代码整洁:由于 scriplet 会让开发人员感到困惑,因此使用 JSTL 可以使代码变得整洁干净。
- 自动表 JavabeansInterospection 支持:它比 JSP scriptlet 具有 JSTL 的优势。JSTL 表达式语言处理 JavaBean 代码非常容易。我们不需要向下转换已检索为作用域属性的对象。使用 JSP scriptlet 代码会很复杂,而 JSTL 简化了这一目的。
- 更易于人类阅读:JSTL 基于 XML,与 HTML 非常相似。因此,开发人员很容易理解。
- 更容易让计算机理解:工具如 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 将打印表达式标签中的值。因此,输出将是名称
执行上述代码时,您将获得以下输出:
输出:
- 我们从核心标签“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”。
执行代码时,您将得到以下输出:
输出:
- 我们得到了算术异常 /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。
执行上述代码时,您将得到以下输出。
输出:
- 由于该文件是在 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。
执行代码时,你会得到以下输出
输出:
- 我们得到的输出是从 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”。
执行上述代码时,将获得以下输出
输出:
- 由于“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 名称,当我们点击该页面时,它会重定向到指定重定向的站点。
当您执行上述代码时,您将得到以下输出;
输出:
- 我们得到了由 coretag_jsp99.jsp 重定向的输出 guru6.com url
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()}
此外,我们还必须在 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() 方法并执行其中的代码。
执行上述代码时,将获得以下输出
输出:
- 我们从 guruTag.java 即 TagHandler 中获得输出“GuruTag”,它覆盖 doTag() 方法并将“Guru Tag”打印为输出。
总结
- 在本节中,我们了解了 JSP 标准标签库,其中有核心标签和自定义标签。
- 核心标签包括for、if、redirect、import、catch标签,这些都是JSP中用于基本用途的标签。
- 此外,我们还制作了自定义标签,可以在其中定义标签并在 JSP 中使用它