JSTL_core

本文详细介绍了JSP标准标签库(JSTL)中的核心标签,包括<c:out>用于输出内容,<c:set>用于设置属性,<c:remove>用于删除属性,<c:catch>用于捕获异常,<c:if>用于条件判断,<c:choose>、<c:when>和<c:otherwise>用于多条件选择,以及<c:forEach>和<c:forTokens>用于循环操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<c:out>

<c:out> 标签用于输出一段文本内容到 pageContext 对象当前保存的 out 对象中,在通常情况下,pageContext 对象当前保存的 out 对象的数据是输出到客户端浏览器,所以,<c:out> 标签通常用于输出一段文本对客户端浏览器。如果 <c:out> 标签输出的文本内容中包含了需要进行转义的 HTML 字符,则 <c:out> 标签会默认对它们进行 HTML 编码后再进行输出,常见特殊字符转换如下:

字符字符实体编码
<&lt;
>&gt;
&&amp;
&apos;
&quot;

<c:out> 标签有两种语法格式:

  • 没有标签体的情况:
<c:out value="value"
        [escapeXml="true|false"]
        [default="defaultValue"] />
  • 有标签体的情况,在标签体中指定输出的默认值:
<c:out value="value"
        [escapeXml="true|false"]>
    default value
</c:out>

<c:out> 标签的属性说明如下表:

属性名是否支持 EL属性类型属性描述
valuetrueObject指定要输出的内容
escapeXmltrueBoolean指定是否将特殊字符进行 HTML 编码转换后再进行输出。默认为 true。
defaulttrueObject指定如果 value 属性的值为 null 时输出的默认值

注意:

  • 当且仅当 value 属性的值为 null 时,<c:out> 标签输出默认值;如果没有指定默认值,默认为空字符串。
  • 如果 value 属性不是指向一个 java.io.Reader 对象,<c:out> 标签将调用这个对象的 toString 方法,然后输出获得的字符串内容。
  • 如果 value 属性指向一个 java.io.Reader 对象,<c:out> 标签将从这个 Reader 对象中读取数据后进行输出,当有大量数据要被输出时,将这些数据以对象的形式提供给 <c:out> 标签进行输出,将会极大提高系统性能。

<c:set>

<c:set> 标签用于设置各种 Web 域中的属性,或者设置 Web 域中的 java.util.Map 类型的属性对象或 JavaBean 类型的属性对象的属性。

<c:set> 标签有四种语法格式:

  • 使用 value 属性设置指定域中的某个属性的值:
<c:set value="value"
        var="varName"
        [scope="page|request|session|application"] />
  • 在标签体中设置指定域中的某个属性的值:
<c:set var="varName"
        [scope="page|request|session|application"]>
    body content
</c:set>
  • 使用 value 属性设置 Web 域中的一个属性对象的某个属性:
<c:set value="value"
        target="target"
        property="propertyName" />
  • 在标签体中设置 Web 域中的一个属性对象的某个属性:
<c:set target="target"
        property="propertyName">
    body content
</c:set>

<c:set> 标签的属性说明如下表:

属性名是否支持 EL属性类型属性描述
valuetrueObject用于指定属性值
varfalseString用于指定要设置的 Web 域属性的名称
scopefalseString用于指定属性所在的 Web 域,默认为 page。
targettrueObject用于指定要设置属性的对象,这个对象必须是 JavaBean 对象或 java.util.Map 对象
propertytrueString用于指定当前要为对象设置的属性名称

注意:

  • 如果使用第 1 种语法格式时的 vlaue 属性值为 null,或者会用第 2 种语法格式时的标签体内容为空,<c:set> 标签将从 scope 域范围中删除 var 属性指定的属性。
  • 在第 3、4 两种语法格式中:
    • 如果 target 属性的值是 java.utl.Map 对象,property 属性表示该 Map 对象的 key,如果 Map 对象没有指定的 key,就给 Map 对象增加指定的 key;
    • 如果 target 属性的值是 JavaBean 对象,property 属性表示 JavaBean 对象的属性,如果该 value 的类型与 JavaBean 属性的类型不匹配时,会根据 EL 的转换规则自动进行转换;
    • 如果 target 属性的值为 null(即 target 属性的值指定的对象不存在),或者 target 属性的值是一个 JavaBean 对象,但该 JavaBean 对象中不存在 property 属性指定 的属性,<c:set>标签将抛出异常;
  • 如果使用第 3 种语法格式时 value 属性的值为 null,或者使用第 4 种语法格式时标签体的内容为空,
    • 如果 target 属性的值是一个 java.util.Map 对象,就从该 Map 对象中删除 property 属性指定的关键字对应的项;
    • 如果 target 属性的值是一个 JavaBean 对象,就将该 JavaBean 的相应属性的值设置为 null。

<c:remove>

<c:remove> 标签用于删除各种 Web 域中的属性,其语法格式如下:

<c:remove var="varName"
        [scope="page|request|session|application"] />

var 属性用于指定要删除的属性的名称,必需的;scope 属性用于指定要删除的属性所属的 Web 域,它们的值都不能接受动态值。如果没有指定 scope 属性,<c:remove> 标签就调用 pageContext.removeAttribute(varName) 方法,否则就调用 pageContext.removeAttribute(varName, scope) 方法。<c:remove><c:set> 标签第 1 种语法格式的 value 属性值为 null 时的作用相同。

<c:catch>

<c:catch> 标签用于捕获嵌套在标签中的内容抛出的异常,其语法格式如下:

<c:catch [var="varName"]>
    nested action
</c:catch>

var 属性用于标识 <c:catch> 标签捕获的异常对象,其值是一个静态的字符串,不支持动态属性值。<c:catch> 标签将捕获的异常对象以 var 指定的名称保存到 page 这个 Web 域中,如果没有指定 var 属性,则 <c:catch> 标签仅捕获异常,不在 page 域保存异常对象。如果 <c:catch> 标签体中的内容没有抛出异常,<c:catch> 标签将从 page 域中删除 var 属性指定的属性。

<c:catch> 标签可以捕获任何标签抛出的异常,并且可以同时处理多个标签抛出的异常,这样,可以对 JSP 页面的异常时行统一的处理。

JSP 处理异常的通用机制是出现重要异常后跳转到错误处理页面,建议尽量不要用 <c:catch> 标签来代替 JSP 的错误处理机制,只对一些次要异常才使用 <c:catch> 标签进行捕获处理。

<c:if>

JSP 页面的显示逻辑中也经常需要进行条件判断,<c:if> 标签可以构造简单的 “if-then” 结构的条件表达式,如果条件表达式的结果为真就执行标签体部分的内容。

<c:if> 标签有如下两种语法格式:

  • 没有标签体的情况:
<c:if test="testCondition" var="varName"
        [scope="page|request|session|application"] />
  • 有标签体的情况,在标签体中指定要执行的内容:
<c:if test="testCondition" [var="varName"]
        [scope="page|request|session|application"] />

<c:if> 标签属性说明如下表:

属性名是否支持 EL属性类型属性描述
testtrueboolean决定是否处理标签体中的内容的条件表达式
varfalseString用于指定将 test 属性的执行结果会在到某个 Web 域中的某个属性的名称
scopefalseString指定将 test 属性的执行结果保存到哪个 Web 域中

注意:

对于语法 2 ,如果指定了标签的 scope 属性,则必须指定 var 属性。

<c:choose><c:when><c:otherwise>

<c:choose> 标签用于指定多个条件选择的组合边界,它必须与 <c:when><c:otherwise> 标签一起使用。使用 <c:choose><c:when><c:otherwise> 三个标签,可以构成类似 “if-else if-else” 的复杂条件判断结构。

<c:choose> 标签没有属性,在它的标签体内只能嵌套一个或多个 <c:when> 标签和 0 个或一个 <c:otherwise> 子标签,并且同一个 <c:choose> 标签中的所有 <c:when> 子标签必须出现在 <c:otherwise> 子标签之前。如果 <c:choose> 标签内嵌套一个 <c:when> 标签和 <c:otherwise> 标签,就相当于 “if-else” 的条件判断结构;如果 <c:choose> 标签内嵌套多个 <c:when> 标签和一个 <c:otherwise> 标签,就相当于 “if-else if-else” 的条件判断结构。

<c:when> 标签只有一个 test 属性,该属性的值为布尔类型。test 属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为 true,就执行这个 <c:when> 标签体的内容。<c:when> 标签体的内容可以是任意的 JSP 代码。

<c:otherwise> 标签没有属性,它必须作为 <c:choose> 标签的最后分支出现。

<c:forEach>

<c:forEach> 标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复执行标签体中的内容。

<c:forEach> 标签有两种语法格式:

  • 循环迭代操作集合对象中的元素
<c:forEach [var="varName"]
            items="collection"
            [varStatus="varStatusName"]
            [begin="begin"] [end="end"] [step="step"]>
        body content
</c:forEach>
  • 迭代执行固定次数的标签体内容
<c:forEach [var="varName"]
            [varStatus="varStatusName"]
            begin="begin" end="end" [step="step"]>
    body content
</c:forEach>

<c:forEach> 标签属性说明如下表:

属性名是否支持 EL属性类型属性描述
varfalseString指定将当前迭代的元素保存到 page 这个 Web 域中的属性名称
itemstrue任何支持的类型将要迭代的集合元素对象
varStatusfalseString指定将代表当前迭代状态信息的对象保存到 page 这个 Web 域中的属性名称
begintrueint如果指定 items 属性,就从集合中的第 begin 个元素开始进行迭代,begin 的索引值从 0 开始编号;如果没有指定的 items 属性,就从 begin 指定的值开始迭代,直到 end 值时结束迭代
endtrueint类比 end 属性的描述
steptrueint指定迭代的步长,即迭代因子的迭代增量

注意:

  • 如果指定 begin 属性,其值必须大于或等于零
  • 如果指定步长(step 属性),其值必须大于或等于 1
  • 如果 items 属性的值为 null,则要处理的集合对象为空,这时不执行迭代操作
  • 如果指定的 begin 属性大于或等于集合对象的长度,不执行迭代操作
  • 如果指定的 end 属性的值小于 begin 属性的值,不执行迭代操作

<c:forEach> 标签的 items 属性的值支持下面的数据类型:

  • 任意类型的数组
  • java.util.Collection
  • java.util.Iterator
  • java.util.Enumeration
  • java.util.Map
  • String

items 属性还支持与数据库有关的数据类型 java.sql.Result(包括 javax.sql.RowSet),这些数据类型通常结合数据库标签使用。对字符串的迭代操作通常使用 <c:forTokens> 标签或 JSTL 函数。

<c:forTokens>

<c:forTokens> 标签专门用于实现类似 java.util.StringTokenizer 类的迭代功能,但它是以单个字符为分隔符,同时可以指定多个字符作为多个并行的分隔符。

<c:forTokens> 标签的语法格式如下:

<c:forTokens items="stringOfTokens" delims="delimiters"
            [var="varName"]
            [varStatus="varStatusName"]
            [begin="begin"] [end="end"] [step="step"]>
    body content
</c:forTokens>

<c:forTokens> 标签属性说明如下表:

属性名是否支持 EL属性类型属性描述
varfalseString指定当前迭代出的子字符串保存到 page 这个域中的属性名称
itemstrueString将要迭代的字符串
delimstrueString指定一个或多个分隔符
varStatusfalseString指定将代表当前迭代状态信息的对象保存到 page 这个 Web 域中的属性名称,代表当前迭代的状态信息的对象的类型为 javax.servlet.jsp.jstl.core.LoopTagStatus
begintrueint指定从第 begin 个子字符串开始进行迭代,begin 的索引值从 0 开始编号
endtrueint指定迭代到第 end 个子字符串,end 的索引值从 0 开始
steptrueint指定迭代的步长,即每次迭代后的迭代因子增量

注意:

  • 如果指定 begin 属性,其值必须大于或等于零
  • 如果指定步长(step 属性),其值必须大于或等于 1
  • 如果指定的 end 属性的值小于 begin 属性的值,不执行迭代操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值