jsp标准标签库(版本1.2)

jsp标准标签库

一、简介

  1. JSTL是一个开源代码的标签组件,由Apache的Jakarta小组开发,本次主要说明JSTL1.2版本中主要的标签库,如下:
NO JSTL 标记名称 标签配置文件 描述
1 核心标签库 c c.tld 定义了属性管理、迭代、判断、输出
2 SQL标签库 sql sql.tld 定义了查询数据库操作
3 XML标签库 xm x.tld 用于操作xml数据
4 函数标签库 fn fn.tld 提供可一些常用的操作函数
5 I18N格式标签库 fmt fmt.tld 格式化数据
  1. 在下面的使用jstl标签库时出现了bug,因为发现添加groupId为javax.servlet.jsp.jstl的依耐时运行标签会报错,修改为 <groupId>javax.servlet</groupId>时就能正常使用。
     <!-- 添加对 JSTL 的支持 ( 对标准标签库的支持 ) -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <jstl.version>1.2</jstl.version>
        </dependency>

二、核心标签库C

  1. 核心标签库主要完成的是流程控制、迭代输出等操作。
  2. 核心标签库中的主要标签及引用语法(JSTL 1.1 core library)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
NO 功能分类 标签名称 描述
1 基本标签 <c:out> 属性输出内容
2 基本标签 <c:set> 用于保存数据
3 基本标签 <c:remove> 用于删除数据
4 基本标签 <c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来
5 流程控制标签 <c:if> 与我们在一般程序中用的if一样
6 流程控制标签 <c:choose> 本身只当做<c:when>和<c:otherwise>的父标签
7 流程控制标签 <c:when> <c:choose>的子标签,用来判断条件是否成立
8 流程控制标签 <c:otherwise> <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为fa
9 包含标签 <c:import> 检索一个绝对或相对 URL,然后将其内容暴露给页面
10 迭代标签 <c:forEach> 基础迭代标签,接受多种集合类型
11 迭代标签 <c:forTokens> 根据指定的分隔符来分隔内容并迭代输出
12 参数传递标签 <c:param> 用来给包含或重定向的页面传递参数
13 客户端跳转标签 <c:redirect> 重定向至一个新的URL.
14 生成url标签 <c:url> 使用可选的查询参数来创造一个URL
1. <c:out>标签
  • <c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。
  • <c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。
  • 语法格式,一下标签属性中加了[]包括起来的属性为非必输属性<required>false</required>
<c:out value="<string>" [default="<string>"] [escapeXml="<true|false>"]/>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 value 要输出的内容
2 default 输出的默认值 主体中的内容
3 escapeXml 是否忽略XML特殊字符 true
  • 实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>核心标签库的使用</title>
</head>
<body>
<%
session.setAttribute("name","<c:out>");
%>
<h3>属性存在:<c:out value="${name}"/></h3>
<h3>属性不存在无标签体:<c:out value="${ref}" default="无"/></h3>
<h3>属性不存在:<c:out value="${ref}" >无</c:out></h3>
</body>
</html>
属性存在:<c:out>
属性不存在无标签体:无
属性不存在:无

在存在标签体的情况下不要书写属性default,不然会报错500,jstl会默认为标签体为默认值的。当不存在标签体可以书写default,默认输出给属性的值

2. <c:set>
  • <c:set>标签用于设置变量值和对象属性。
  • <c:set>标签就是jsp:setProperty行为标签的孪生兄弟。
  • 这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
  • 语法格式:
  • 没有标签体
<c:set var="<string>" value="<string>" [target="<string>"] [property="<string>"] scope="<string>"/>
  • 有标签体,默认属性内容为标签体内容
<c:set var="<string>"  [scope="<string>"]>
属性内容
</c:set>
  • 设置内容到对象----没有标签体
<c:set value="<string>" target="<string>" property="<string>"/>
  • 设置内容到对象----有标签体,默认属性内容为标签体内容
<c:set target="<string>" property="<string>">
属性内容
</c:set>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 value 要存储的值 主体的内容
2 target 要修改的属性所属的对象
3 property 要修改的属性
4 var × 存储信息的变量
5 scope × var属性的作用域 Page
如果指定了target属性,那么property属性也需要被指定。
  • 实例:
<%--<c:set>标签--%>
<%!
    public class SetJstl {
        private String sex;

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }
    }
%>
<%
    SetJstl sj=new SetJstl();
    pageContext.setAttribute("sex1",sj);
%>
<c:set var="age" value="20" scope="page"/>
<h2>设置jsp页面的属性:<c:out value="${age}"/></h2>
<c:set var="age1" scope="page">有标签体</c:set>
<h2>设置jsp页面的属性:<c:out value="${age1}"/></h2>
<c:set value="女" target="${sex1}" property="sex"/>
<h2> 设置javaBean的属性: <c:out value="${sex1.sex}"/></h2>
<c:set target="${sex1}" property="sex">有标签体</c:set>
<h2> 设置javaBean的属性: <c:out value="${sex1.sex}"/></h2>

设置jsp页面的属性:20
设置jsp页面的属性:有标签体
设置javaBean的属性: 女
设置javaBean的属性: 有标签体
3. <c:remove>
  • <c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
  • 这个标签不是特别有用,不过可以用来确保JSP完成清理工作。
  • 语法格式
<c:remove var="<string>" [scope="<string>"]/>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 var × 要移除的变量名称
2 scope × 变量所属的作用域 所有作用域
  • 实例:
<%--<c:remove>标签--%>
<c:set var="tel" value="10010" scope="page"/>
<h2>删除属性之前:<c:out value="${tel}"/></h2>
<c:remove var="tel"/>
<h2>删除属性之后:<c:out value="${tel}"/></h2>
删除属性之前:10010
删除属性之后:
4. <c:catch>
  • <c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。
  • 语法格式
<c:catch [var="<string>"]>
...
</c:catch>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 var × 用来储存错误信息的变量 None
  • 实例
<%--<c:catch>标签--%>
<c:catch var="msg">
    <%
        int i=10/0;
    %>
</c:catch>
<h3>异常信息:<c:out value="${msg}" /></h3>
异常信息:java.lang.ArithmeticException: / by zero
5. <c:if>
  • <c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
  • 语法格式
  • 没有标签体
<c:if test="<boolean>" var="<string>" [scope="<string>"]/>
  • 有标签体
<c:if test="<boolean>" var="<string>" [scope="<string>"]>
满足条件时执行的语句
</c:if>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 test 条件
2 var × 用于存储条件结果的变量
3 scope × var属性的作用域 page
  • 实例
<%--<c:if>标签--%>
<c:if test="${10>0}" var="res" scope="page">
    <h3>10>0为${res}</h3>
</c:if>
<h3>${res}</h3>
10>0为true
true
6. <c:choose>, <c:when>, <c:otherwise>
  • <c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
  • switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
  • 语法格式
<c:choose>
    <c:when test="<boolean>">
        ...
    </c:when>
    <c:when test="<boolean>">
        ...
    </c:when>
    ...
    ...
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>
  • 属性
    • <c:choose>标签没有属性。
    • <c:when>标签只有一个属性,在下表中有给出。
    • <c:otherwise>标签没有属性。
NO 属性 EL支持 描述 是否必要 默认值
1 test 用于条件,如果为true则执行标签体内容
  • 实例
<%--<c:choose>, <c:when>, <c:otherwise>--%>
<%
pageContext.setAttribute("num",20);
%>
<c:choose>
    <c:when test="${num==10}">
        <h3>属性内容为${num}</h3>
    </c:when>
    <c:when test="${num==20}">
        <h3>属性内容为${num}</h3>
    </c:when>
    <c:when test="${num==30}">
        <h3>属性内容为${num}</h3>
    </c:when>
    <c:otherwise>
        <h3>没有满足条件的</h3>
    </c:otherwise>
</c:choose>
属性内容为20
7. <c:import>
  • <c:import>标签提供了所有jsp:include行为标签所具有的功能,同时也允许包含绝对URL。

  • 举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容。

  • 语法:

<c:import
   url="<string>"
   [var="<string>"]
   [scope="<string>"]
   [varReader="<string>"]
   [context="<string>"]
   [charEncoding="<string>"]/>
  • 属性
NO 属性 EL支持 描述 是否必要 默认值
1 url 待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源
2 context 当使用相对路径访问外部context资源时,context指定了这个资源的名字。 当前应用程序
3 charEncoding 所引入的数据的字符编码集 ISO-8859-1
4 var × 用于存储所引入的文本的变量
5 scope × var属性的作用域 page
6 varReader × 可选的用于提供java.io.Reader对象的变量
  • 实例
<%--<c:import>--%>
<c:import url="datetag.jsp" charEncoding="utf-8"/>
2019-12-04 16:15:59

不能存在标签体

8. <c:forEach>, <c:forTokens>
  • 这些标签封装了Java中的for,while,do-while循环。

  • 相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合或数组中的对象。

  • <c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们,相当于java中的Spring类的split()方法来循环输出一种集合。

  • forEach 语法格式

<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>"/>
    ...
    
  • forTokens 语法格式
<c:forTokens
    items="<string>"
    delims="<string>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>"/>
  • 属性
  • <c:forEach>标签有如下属性:
NO 属性 EL支持 描述 是否必要 默认值
1 items 要被循环的信息
2 begin 开始的元素(0=第一个元素,1=第二个元素) 0
3 end 最后一个元素(0=第一个元素,1=第二个元素) Last element
4 step 每一次迭代的步长 1
5 var × 代表当前条目的变量名称
6 varStatus × 代表循环状态的变量名称
  • <c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:
NO 属性 EL支持 描述 是否必要 默认值
1 delims × 分隔符
  • 实例
<%--<c:forEach>,<c:forTokens >--%>
<%
String[] str={"yoona","20","女"};
pageContext.setAttribute("str",str);
String str1 = "123,459,123,678";
pageContext.setAttribute("str1", str1);
%>
<c:forEach var="i" items="${str}">
    <h2>输出全部:${i}</h2>
</c:forEach>
<c:forEach var="i" items="${str}" step="2">
    <h2>间隔为2:${i}</h2>
</c:forEach>
<h2>以,为分隔符输出遍历:</h2>
<c:forTokens items="${str1}" delims="," var="i" >
    <h2>${i}</h2>
</c:forTokens>
输出全部:yoona
输出全部:20
输出全部:女
间隔为2:yoona
间隔为2:女
以,为分隔符输出遍历:
123  
459  
123  
9. <c:url>,<c:param>
  • <c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。

  • 这个标签在需要的时候会自动重写URL。

  • var属性用于存储格式化后的URL。

  • <c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

  • 语法格式

<c:url
  var="<string>"
  scope="<string>"
  value="<string>"
  context="<string>"/>
  • 属性
    • <c:url>标签有如下属性:
NO 属性 EL支持 描述 是否必要 默认值
1 value 基础URL
2 context 本地网络应用程序的名,如果要访问同一web的资源则要“/”开头 当前应用程序
3 var × 代表URL的变量名 Print to page
4 scope × var属性的作用域 Page
  • 实例
<%--<c:url>,<c:param>--%>
<c:url var="urlinfo" value="https://www.baidu.com/?tn=99104831_hao_pg">
    <c:param name="name" value="taeyeon"/>
</c:url>
<a href="${urlinfo}">新的地址${urlinfo}</a>
新的地址https://www.baidu.com/?name=taeyeon&tn=99104831_hao_pg
10. <c:redirect>
  • <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。
  • <c:redirect>标签进行客户端跳转。
  • 语法格式
<c:redirect url="<string>" context="<string>"/>
  • 属性
    • c:redirect标签有如下属性:
NO 属性 EL支持 描述 是否必要 默认值
1 url 目标URL
2 context 紧接着一个本地网络应用程序的名称 当前应用
  • 实例,datetag.jsp是我的一个日期格式化jsp测试页面
<%--<c:redirect>--%>
<c:redirect url="datetag.jsp" >
    <c:param name="name" value="yoona"/>
</c:redirect>
2019-12-04 17:04:20

设置的参数param会出现在地址栏:http://localhost:8080/jsp/tld/datetag.jsp?name=yoona

三、格式化标签库

  1. JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
  2. 格式化标签库主要包含的标签如下:
NO 标签 描述
1 fmt:formatNumber 使用指定的格式或精度格式化数字
2 fmt:parseNumber 解析一个代表着数字,货币或百分比的字符串
3 fmt:formatDate 使用指定的风格或模式格式化日期和时间
4 fmt:parseDate 解析一个代表着日期或时间的字符串
5 fmt:bundle 绑定资源
6 fmt:setLocale 指定地区
7 fmt:setBundle 绑定资源
8 fmt:timeZone 指定时区
9 fmt:setTimeZone 指定时区
10 fmt:message 显示资源配置文件信息
11 fmt:requestEncoding 设置request的字符编码
因为标签很多而且也比较简单,主要在于常用,熟练掌握。所以就不再像核心标签那样一一讲解了。
详细链接地址可参考菜鸟教程:https://www.runoob.com/jsp/jsp-jstl.html

四、sql标签库

  1. 在JSTL中也提供了与数据库操作相关的标签,可以使用这些标签轻松的进行数据库的更新与操作,sql标签库主要包含了如下标签:
NO 标签 描述
1 sql:setDataSource 指定数据源
2 sql:query 运行SQL查询语句
3 sql:update 运行SQL更新语句
4 sql:param 将SQL语句中的参数设为指定值
5 sql:dateParam 将SQL语句中的日期参数设为指定的java.util.Date 对象值
6 sql:transaction 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

五、xml文件标签库

  1. XML标签
NO 标签 描述
1 <x:out> 与<%= ... >,类似,不过只用于XPath表达式
2 <x:parse> 解析 XML 数据
3 <x:set> 设置XPath表达式
4 <x:if> 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
5 <x:forEach> 迭代XML文档中的节点
6 <x:choose> <x:when>和<x:otherwise>的父标签
7 <x:when> <x:choose>的子标签,用来进行条件判断
8 <x:otherwise> <x:choose>的子标签,当<x:when>判断为false时被执行
9 <x:transform> 将XSL转换应用在XML文档中
10 <x:param> 与<x:transform>共同使用,用于设置XSL样式表
XPath简介
  1. XPath的主要功能是在XML文档中能够准确的找到某一个节点的元素,可以通过XPath找到一个XML文档中定义的节点内容或属性等。
  2. XPath路径标记
NO 路径标记 描述
1 根元素 /
2 父节点 ../
3 任何路径下的节点 //
4 属性 @属性名称
5 通配符 *

六、函数标签库

  1. 函数标签库大部分的操作都是用来处理字符串的,这一点类似于String类的各个方法,下表列出了一些常用标签函数
NO 函数 描述
1 fn:contains() 测试输入的字符串是否包含指定的子串
2 fn:containsIgnoreCase() 测试输入的字符串是否包含指定的子串,大小写不敏感
3 fn:endsWith() 测试输入的字符串是否以指定的后缀结尾
4 fn:escapeXml() 跳过可以作为XML标记的字符
5 fn:indexOf() 返回指定字符串在输入字符串中出现的位置
6 fn:join() 将数组中的元素合成一个字符串然后输出
7 fn:length() 返回字符串长度
8 fn:replace() 将输入字符串中指定的位置替换为指定的字符串然后返回
9 fn:split() 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
10 fn:startsWith() 测试输入字符串是否以指定的前缀开始
11 fn:substring() 返回字符串的子集
12 fn:substringAfter() 返回字符串在指定子串之后的子集
13 fn:substringBefore() 返回字符串在指定子串之前的子集
14 fn:toLowerCase() 将字符串中的字符转为小写
15 fn:toUpperCase() 将字符串中的字符转为大写
16 fn:trim() 移除首尾的空白符
scope的范围时jsp的四种域,page,request,session,application