Web基础知识(15)- JSP (七)
作者:互联网
JSP 标准标签库(JSTL)、JSP 自定义标签
1. JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL)是一个 JSP 标签集合,它封装了 JSP 应用的通用核心功能。
JSTL 支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL 标签。 除了这些,它还提供了一个框架来使用集成 JSTL 的自定义标签。
根据 JSTL 标签所提供的功能,可以将其分为 5 个类别。
(1) 核心标签
(2) 格式化标签
(3) SQL 标签
(4) XML 标签
(5) JSTL 函数
JSTL 官网: https://tomcat.apache.org/taglibs/
1) Maven 项目使用 JSTL
需要导入 JSTL 依赖包,访问 http://www.mvnrepository.com/,查询 JSTL
修改 pom.xml:
1 <project ... > 2 3 <dependencies> 4 ... 5 6 <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> 7 <dependency> 8 <groupId>javax.servlet</groupId> 9 <artifactId>jstl</artifactId> 10 <version>1.2</version> 11 </dependency> 12 13 ... 14 </dependencies> 15 16 </project>
2) 核心标签
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL |
<c:url> | 使用可选的查询参数来创造一个URL |
3) 格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签 | 描述 |
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 获取时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
4) SQL 标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
标签 | 描述 |
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
5) XML 标签
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
标签 | 描述 |
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
6) JSTL函数
JSTL 包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函数 | 描述 |
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首尾的空白符 |
2. JSP 自定义标签
自定义标签是用户定义的 JSP 语言元素。当 JSP 页面包含一个自定义标签时将被转化为 servlet,标签转化为对被 称为 tag handler 的对象的操作,即当 servlet 执行时 Web container 调用那些操作。
JSP 标签扩展可以让你创建新的标签并且可以直接插入到一个 JSP 页面。 JSP 2.0 规范中引入 Simple Tag Handlers 来编写这些自定义标记。
可以继承 SimpleTagSupport 类并重写的 doTag() 方法来开发一个最简单的自定义标签。
1) Maven 项目下自定义标签
需要导入 jsp-api 依赖包,访问 http://www.mvnrepository.com/,查询 jsp-api
修改 pom.xml:
1 <project ... > 2 3 <dependencies> 4 ... 5 6 <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> 7 <dependency> 8 <groupId>javax.servlet.jsp</groupId> 9 <artifactId>javax.servlet.jsp-api</artifactId> 10 <version>2.3.1</version> 11 <scope>provided</scope> 12 </dependency> 13 14 ... 15 </dependencies> 16 17 </project>
2) 创建自定义标签
这里创建一个自定义标签叫作 <ex:Custom>,标签格式为:
<ex:Custom />
(1) 创建一个 CustomTag 类,代码如下:
1 package com.example.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.JspWriter; 8 9 public class CustomTag extends SimpleTagSupport { 10 11 public void doTag() throws JspException, IOException { 12 JspWriter out = getJspContext().getOut(); 13 out.println("Hello Custom Tag!"); 14 } 15 }
以上代码重写了 doTag() 方法,方法中使用了 getJspContext() 方法来获取当前的 JspContext 对象,并将 "Hello Custom Tag!" 传递给 JspWriter 对象。
注:CustomTag 类在 Maven 项目的路径是 src/main/java/com/example/tag/CustomTag.java
(2) 创建 custom.tld
1 <taglib> 2 <tlib-version>1.0</tlib-version> 3 <jsp-version>2.0</jsp-version> 4 <short-name>Custom TLD</short-name> 5 <tag> 6 <name>Custom</name> 7 <tag-class>com.example.tag.CustomTag</tag-class> 8 <body-content>empty</body-content> 9 </tag> 10 </taglib>
注:custom.tld 在 Maven 项目的路径是 src/main/webapp/WEB-INF/custom.tld
(3) 在 JSP 文件中使用 Custom 标签
1 <%@ taglib uri="WEB-INF/custom.tld" prefix="ex" %> 2 <html> 3 <head> 4 <title>A sample custom tag</title> 5 </head> 6 <body> 7 <ex:Custom/> 8 </body> 9 </html>
JSP 页面输出:
Hello Custom Tag!
3) 访问标签体
可以在标签中包含消息内容,在自定义的 Custom 中包含内容,格式如下:
<ex:Custom>
This is a custom message body
</ex:Custom>
(1) 修改 CustomTag 类,代码如下:
1 package com.example.tag; 2 3 import java.io.StringWriter; 4 import java.io.IOException; 5 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 import javax.servlet.jsp.JspException; 8 9 public class CustomTag extends SimpleTagSupport { 10 11 private StringWriter stringWriter = new StringWriter(); 12 13 public void doTag() throws JspException, IOException { 14 getJspBody().invoke(stringWriter); 15 getJspContext().getOut().println(stringWriter.toString()); 16 } 17 18 }
(2) 修改 custom.tld
1 <taglib> 2 <tlib-version>1.0</tlib-version> 3 <jsp-version>2.0</jsp-version> 4 <short-name>Custom TLD</short-name> 5 <tag> 6 <name>Custom</name> 7 <tag-class>com.example.tag.CustomTag</tag-class> 8 <body-content>scriptless</body-content> 9 </tag> 10 </taglib>
注:custom.tld 在 Maven 项目的路径是 src/main/webapp/WEB-INF/custom.tld
(3) 在 JSP 文件中使用 Custom 标签
1 <%@ taglib uri="WEB-INF/custom.tld" prefix="ex" %> 2 <html> 3 <head> 4 <title>A sample custom tag</title> 5 </head> 6 <body> 7 <ex:Custom> 8 This is a custom message body 9 </ex:Custom> 10 </body> 11 </html>
JSP 页面输出:
This is a custom message body
4) 自定义标签属性
可以在自定义标准中设置各种属性,要接收属性,自定义标签类需要实现 setter 方法。
(1) 修改 CustomTag 类,代码如下:
1 package com.example.tag; 2 3 import java.io.StringWriter; 4 import java.io.IOException; 5 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 import javax.servlet.jsp.JspException; 8 9 public class CustomTag extends SimpleTagSupport { 10 11 private String title; 12 private StringWriter stringWriter = new StringWriter(); 13 14 public void setTitle(String title) { 15 this.title = title; 16 } 17 18 public void doTag() throws JspException, IOException { 19 getJspBody().invoke(stringWriter); 20 getJspContext().getOut().println("title: " + title + "<br>"); 21 getJspContext().getOut().println("message: " + stringWriter.toString() + "<br>"); 22 } 23 24 }
(2) 修改 custom.tld
在 TLD 文件中使用 <attribute> 元素添加属性。
1 <taglib> 2 <tlib-version>1.0</tlib-version> 3 <jsp-version>2.0</jsp-version> 4 <short-name>Custom TLD</short-name> 5 <tag> 6 <name>Custom</name> 7 <tag-class>com.example.tag.CustomTag</tag-class> 8 <body-content>scriptless</body-content> 9 <attribute> 10 <name>title</name> 11 </attribute> 12 </tag> 13 </taglib>
注:custom.tld 在 Maven 项目的路径是 src/main/webapp/WEB-INF/custom.tld
(3) 在 JSP 文件中使用 Custom 标签
1 <%@ taglib uri="WEB-INF/custom.tld" prefix="ex" %> 2 <html> 3 <head> 4 <title>A sample custom tag</title> 5 </head> 6 <body> 7 <ex:Custom title="CustomTag"> 8 This is a custom message body 9 </ex:Custom> 10 </body> 11 </html>
JSP 页面输出:
title: CustomTag
message: This is a custom message body
(4) <attribute> 元素的属性
属性 | 描述 |
name | 定义属性的名称。每个标签的是属性名称必须是唯一的。 |
required | 指定属性是否是必须的或者可选的,如果设置为false为可选。 |
rtexprvalue | 声明在运行表达式时,标签属性是否有效。 |
type | 定义该属性的Java类类型。默认指定为 String |
description | 描述信息 |
fragment | 如果声明了该属性,属性值将被视为一个 JspFragment。 |
代码格式:
1 <taglib> 2 3 ... 4 5 <tag> 6 7 ... 8 9 <attribute> 10 <name>attribute_name</name> 11 <required>false</required> 12 <type>java.util.Date</type> 13 <fragment>false</fragment> 14 </attribute> 15 </tag> 16 </taglib>
标签:Web,15,自定义,标签,custom,JSTL,JSP,fn 来源: https://www.cnblogs.com/tkuang/p/16035424.html