JSP(第七章:JSTL核心标签库)

1 JSTL标签库分类

2 表达式控制标签

3 流程控制标签

4 循环标签

5 URL操作标签

1 JSTL标签库分类

JSTL标签库的使用是为了弥补html表示的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在JSP页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。

JSTL标签库可分为5类:

  • 核心标签库
  • I18N格式化标签库
  • SQL标签库
  • XML标签库
  • 函数标签库

1.1 核心标签库

JSTL的核心标签库标签共13个,从功能上可以分为4类:

  • 表达式控制标签:out标签、set标签、remove标签、catch标签
  • 流程控制标签:if标签、choose标签、when标签、otherwise标签
  • 循环标签:forEach标签、forTokens标签
  • URL操作标签:import标签、url标签、redirect标签

使用这些标签能够完成JSP页面的基本功能,减少编码工作。

在JSP页面引入核心标签库的代码为:

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

需要将两个文件拷贝到lib目录下面:

文件下载地址 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

2 表达式控制标签

表达式控制分类中包括<c:out>、<c:set>、<c:remove>、<c:catch>4个标签。

2.1 <c:out>

<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过”.”操作符来访问属性。

举例来说,如果想要访问customer.address.street,只需要这样写:<c:out value=”customer.address.street”>。

<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。

【语法格式】:

<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>

【参数说明】:

属性 描述 是否必要 默认值
value 要输出的内容
default 输出的默认值 主体中的内容
escapeXml 是否忽略XML特殊字符 true

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out 标签实例</title>
</head>
<body>
    <h1>&lt;c:out&gt; 实例</h1>
        <c:out value="&lt要显示的数据对象(未使用转义字符)&gt" escapeXml="true" default="默认值"></c:out><br/>
          <c:out value="&lt要显示的数据对象(使用转义字符)&gt" escapeXml="false" default="默认值"></c:out><br/>
    <c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
</body>
</html>

【运行结果】:

2.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>"/>

【参数说明】:

属性 描述 是否必要 默认值
value 要存储的值 主体的内容
target 要修改的属性所属的对象
property 要修改的属性
var 存储信息的变量
scope var属性的作用域 Page

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:set 标签实例</title>
</head>
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:out value="${salary}"/>
</body>
</html>

【运行结果】:

4000

2.3 <c:remove>

<c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

这个标签不是特别有用,不过可以用来确保JSP完成清理工作。

【语法格式】:

<c:remove var="<string>" scope="<string>"/>

【参数说明】:

属性 描述 是否必要 默认值
var 要移除的变量名称
scope 变量所属的作用域 所有作用域

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:remove 标签实例</title>
</head>
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>salary 变量值: <c:out value="${salary}"/></p>
<c:remove var="salary"/>
<p>删除 salary 变量后的值: <c:out value="${salary}"/></p>
</body>
</html>

【运行结果】:

salary 变量值: 4000
删除 salary 变量后的值:

2.3 <c:catch>

<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。

【语法格式】:

<c:catch var="<string>">
...
</c:catch>

【参数说明】:

属性 描述 是否必要 默认值
var 用来储存错误信息的变量 None

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:catch 标签实例</title>
</head>
<body>

<c:catch var ="catchException">
   <% int x = 5/0;%>
</c:catch>

<c:if test = "${catchException != null}">
   <p>异常为 : ${catchException} <br />
   发生了异常: ${catchException.message}</p>
</c:if>

</body>
</html>

【运行结果】:

异常为 : java.lang.ArithmeticException: / by zero 
发生了异常: / by zero

3 流程控制标签

流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签。

3.1 <c:if>标签

<c:if>同程序中的if作用相同,用来实现条件控制。

【语法格式】:

<c:if test="条件1" var="name" [scope="page|request|session|application"]></c:if>

【参数说明】:
(1)test属性用于存放判断的条件,一般使用EL表达式来编写。
(2)var指定名称用来存放判断的结果类型为true或false。
(3)scope用来存放var属性存放的范围。

【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。

<%@ page language="java" pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL: -- if标签示例</title>
</head>
<body>
<h4>if标签示例</h4>
<hr>
<form action="" method="post">
<input type="text" name="uname" value="${param.uname}">
<input type="submit" value="登录">
</form>

<c:if test="${param.uname=='admin' }" var="adminchock">
<c:out value="管理员欢迎您!">
</c:out>
</c:if>
${adminchock}
</body>
</html>

提示:可以把adminchock的属性范围设置为session,可以在其他的页面中得到adminchock的值,使用<c:if text=”${adminchock}”> </c:if>判断,实现不同的权限。

【运行结果】:

3.2 <c:choose><c:when><c:otherwise>标签

这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。

<c:choose>
    <c:when test="<boolean>">
        ...//业务逻辑1
    </c:when>
    <c:when test="<boolean>">
        ...//业务逻辑2
    </c:when>
    ...
    ...
    <c:otherwise>
        ...//业务逻辑N
    </c:otherwise>
</c:choose>

【参数说明】:
(1)语法1为3个标签的嵌套使用方式,<c:choose>标签只能和<c:when>标签共同使用。
(2)语法2为<c:when>标签的使用方式,该标签都条件进行判断,一般情况下和<c:choose>共同使用。
(3)<c:otherwise>不含有参数,只能跟<c:when>共同使用,并且在嵌套中只允许出现一次

【示例代码】:代码9设定一个score变量的值为85,使用嵌套标签进行判断,根据判断返回结果。

<%@ page language="java" pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL: -- choose及其嵌套标签标签示例</title>
</head>
<body>
<h4>choose及其嵌套标签示例</h4>
<hr>
<c:set var="score">85</c:set>

<c:choose>
    <c:when test="${score>=90}">
    你的成绩为优秀!
    </c:when>
    <c:when test="${score>=70&&score<90}">
    您的成绩为良好!
    </c:when>
    <c:when test="${score>60&&score<70}">
    您的成绩为及格
    </c:when>
    <c:otherwise>
    对不起,您没有通过考试!
    </c:otherwise>
</c:choose>
</body>
</html>

【运行结果】:

4 循环标签

循环标签主要实现迭代操作。主要包含两个标签:<c:forEach>和<c:forTokens>标签,接下来将详细介绍这两个标签的用法。

4.1<c:forEach>标签

该标签根据循环条件遍历集合(Collection)中的元素。

【语法格式】:

<c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>本体内容</c:forEach>

【参数解析】:
(1)var设定变量名用于存储从集合中取出元素。
(2)items指定要遍历的集合。
(3)varStatus设定变量名,该变量用于存放集合中元素的信息。
(4)begin、end用于指定遍历的起始位置和终止位置(可选)。
(5)step指定循环的步长。

参数类型和相关说明见表:

名称 EL 类型 是否必须 默认值
var N String
items Y Arrays Collection Iterator Enumeration Map String []args
begin Y int 0
end Y int 集合中最后一个元素
step y int 1
varStatus N String

varStatus的4个状态:

属性名 类型 说明
index int 当前循环的索引值
count int 循环的次数
frist boolean 是否为第一个位置
last boolean 是否为第二个位置

【示例代码】:实现了遍历的两种方式:设定起始位置、不设定起始位置。同时实现了获得原属的状态信息。

<%@ page contentType="text/html;charset=GBK" %>
<[email protected] import="java.util.List"%>
<[email protected] import="java.util.ArrayList"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL: -- forEach标签实例</title>
</head>
<body>
    <h4><c:out value="forEach实例"/></h4>
    <hr>
    <%
        List a=new ArrayList();
        a.add("贝贝");
        a.add("晶晶");
        a.add("欢欢");
        a.add("莹莹");
        a.add("妮妮");
        request.setAttribute("a",a);
    %>
    <B><c:out value="不指定begin和end的迭代:" /></B><br>
    <c:forEach var="fuwa" items="${a}">
        &nbsp;<c:out value="${fuwa}"/><br>
    </c:forEach>

    <B><c:out value="指定begin和end的迭代:" /></B><br>
    <c:forEach var="fuwa" items="${a}" begin="1" end="3" step="2">
        &nbsp;<c:out value="${fuwa}" /><br>
    </c:forEach>

    <B><c:out value="输出整个迭代的信息:" /></B><br>
    <c:forEach var="fuwa" items="${a}" begin="3" end="4" step="1" varStatus="s">
        &nbsp;<c:out value="${fuwa}" />的四种属性:<br>
        &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index}" /><br>
        &nbsp;&nbsp;总共已迭代的次数:<c:out value="${s.count}" /><br>
        &nbsp;&nbsp;是否为第一个位置:<c:out value="${s.first}" /><br>
        &nbsp;&nbsp;是否为最后一个位置:<c:out value="${s.last}" /><br>
    </c:forEach>
</body>
</html>

提示:本例使用的list是在JSP页面中使用Java脚本创建的,是因为JSTL缺少创建集合的功能,在开发中一般不会如此,可通过访问数据库得到数据集合,和通过设定JavaBean的值得到数据集合

【运行结果】:

4.2 <c:forTokens>

该标签用于浏览字符串,并根据指定的字符将字符串截取。

【语法格式】:

<c:forTokens items=”strigOfTokens” delims=””delimiters [var=”name” begin=”begin” end=”end” step=”len” varStatus=”statusName”] >

【参数说明】
(1)items指定被迭代的字符串。
(2)delims指定使用的分隔符。
(3)var指定用来存放遍历到的成员。
(4)begin指定遍历的开始位置(int型从取值0开始)。
(5)end指定遍历结束的位置(int型,默认集合中最后一个元素)。
(6)step遍历的步长(大于0的整型)。
(7)varStatus存放遍历到的成员的状态信息。

【示例代码】:代码11实现了遍历一个有符号的字符串,把指定的符号移除。指定begin和end值,并获得遍历到的元素的状态信息。

<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
         <title>JSTL: -- forTokens标签实例</title>
</head>
<body>
<h4><c:out value="forToken实例"/></h4>
<hr>
    <c:forTokens items="北、京、欢、迎、您" delims="" var="c1">
        <c:out value="${c1}"></c:out>
    </c:forTokens><br>

    <c:forTokens items="123-4567-8854" delims="-" var="t">
        <c:out value="${t}"></c:out>
    </c:forTokens><br>

    <c:forTokens items="1*2*3*4*5*6*7" delims="*" begin="1" end="3" var="n" varStatus="s">
        &nbsp;<c:out value="${n}" />的四种属性:<br>
        &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index}" /><br>
        &nbsp;&nbsp;总共已迭代的次数:<c:out value="${s.count}" /><br>
        &nbsp;&nbsp;是否为第一个位置:<c:out value="${s.first}" /><br>
        &nbsp;&nbsp;是否为最后一个位置:<c:out value="${s.last}" /><br>
    </c:forTokens>
</body>
</html>

【运行结果】:

5 URL操作标签

5.1 <c:url>

<c:url> 使用可选的查询参数来创造一个URL

【语法格式】:

<c:url
  var="<string>"
  scope="<string>"
  value="<string>"
  context="<string>"/>

【参数说明】:

value 基础URL
context 本地网络应用程序的名称 当前应用程序
var 代表URL的变量名 Print to page
scope var属性的作用域 Page

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:url 标签实例</title>
</head>
<body>
    <h1>&lt;c:url&gt实例 Demo</h1>
    <a href="<c:url value="http://www.runoob.com"/>">
     这个链接通过 &lt;c:url&gt; 标签生成。
    </a>
</body>
</html>

【运行结果】:

5.2 <c:param>

<c:param> 用来给包含或重定向的页面传递参数

【语法格式】:

<c:param name="<string>" value="<string>"/>

【参数说明】:

name URL中要设置的参数的名称
value 参数的值 Body

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:forTokens 标签实例</title>
</head>
<body>
    <h1>&lt;c:param&gt; 实例</h1>
    <c:url var="myURL" value="main.jsp">
        <c:param name="name" value="Runoob"/>
        <c:param name="url" value="www.runoob.com"/>
    </c:url>
      <a href="/<c:out value="${myURL}"/>">
 使用 &lt;c:param&gt; 为指定URL发送两个参数。</a>
</body>
</html>

【运行结果】:

5.3 <c:redirect>

<c:redirect> 重定向至一个新的URL

【语法格式】:

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

【参数说明】:

属性 描述 是否必要 默认值
url 目标URL
context 紧接着一个本地网络应用程序的名称 当前应用程序

【示例代码】:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:redirect 标签实例</title>
</head>
<body>
<c:redirect url="http://www.runoob.com"/>
</body>
</html>

【运行结果】:

浏览器打开以上页面将跳转至 http://www.runoob.com。


参考:菜鸟教程

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

客官,赏一瓶怡宝吧。

支付宝
微信